Author: [log in to unmask] Date: Wed Mar 9 11:43:24 2016 New Revision: 4278 Log: [HPSJAVA-662] Remove tabs from java, xml and lcsim files. Modified: java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/EcalMonitoring.java java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/FinalStateMonitoring.java java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TridentMonitoring.java java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/V0Monitoring.java java/trunk/analysis/src/main/java/org/hps/analysis/ecal/EcalCellIDPrintDriver.java java/trunk/analysis/src/main/java/org/hps/analysis/ecal/EcalClusterPlots.java java/trunk/analysis/src/main/java/org/hps/analysis/ecal/EcalHitPlots.java java/trunk/analysis/src/main/java/org/hps/analysis/ecal/FEEClusterPlotter.java java/trunk/analysis/src/main/java/org/hps/analysis/ecal/HPSEcalFADCPlotsDriver.java java/trunk/analysis/src/main/java/org/hps/analysis/ecal/HPSEcalTriggerPlotsDriver.java java/trunk/analysis/src/main/java/org/hps/analysis/ecal/HPSMCParticlePlotsDriver.java java/trunk/analysis/src/main/java/org/hps/analysis/examples/StripGoldenEventsDriver.java java/trunk/analysis/src/main/java/org/hps/analysis/examples/StripMollerEventsDriver.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/DataTriggerSimDriver.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/SimTriggerData.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/SimTriggerModule.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/TriggerDiagnosticDriver.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/TriggerTurnOnDriver.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/ClusterEvent.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/ClusterMatchedPair.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/ClusterStatModule.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/DetailedClusterEvent.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/DiagnosticSnapshot.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/GeneralStatModule.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/RunDiagStats.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/TriggerDiagStats.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/TriggerEvent.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/TriggerStatModule.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerPlotsModule.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/ComponentUtils.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/OutputLogger.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/Pair.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/PairTrigger.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/SinglesTrigger.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/Trigger.java java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/TriggerDiagnosticUtil.java java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-3/compact.xml java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-4-1/compact.xml java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-4-1/compact_millepede-milleBinaryISN_hps_005772.evio.0.gbl-L3_L4_L5_tu_rw_THEN_L2_tu_rw_THEN_L2_L3_L4_tu_rw_THEN_L2_L3_L5_tu_rw_THEN_L2_L3_L4_L5_excl_L3ST_tu_L4Sb_tu_THEN_L2_L4_L5_tu_rw.xml java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-4/compact.xml java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-4/compact_millepede-milleBinaryISN_hps_005772.evio.0.gbl-L2-3-4_tu_rw.xml java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-5-1/compact_millepede-milleBinaryISN_hps_005772.evio.0.gbl-L3_L4_L5_tu_rw_THEN_L2_tu_rw_THEN_L2_L3_L4_tu_rw_THEN_L2_L3_L5_tu_rw_THEN_L2_L3_L4_L5_excl_L3ST_tu_L4Sb_tu_THEN_L2_L4_L5_tu_rw.xml java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-5-2/compact_millepede-milleBinaryISN_hps_005772.evio.0.gbl-HPS-EngRun2015-Nominal-v1-4-1-100k-L456_L123_L234_L345_L123_L456_tu_rwIter0Iter1Iter2Iter3Iter4Iter5.xml java/trunk/detector-data/detectors/HPS-Proposal2014-v3-2pt2-0zOffset/compact.xml java/trunk/detector-data/detectors/HPS-TestRun-v5/compact.xml java/trunk/detector-data/detectors/HPS-TestRun-v6/compact.xml java/trunk/detector-data/detectors/HPS-TestRun-v7-2/compact.xml java/trunk/detector-data/detectors/HPS-TestRun-v7-3/compact.xml java/trunk/detector-data/detectors/HPS-TestRun-v7/compact.xml java/trunk/detector-data/detectors/HPS-TestRun-v8-4/compact.xml java/trunk/detector-data/detectors/HPS-TestRun-v8-5/compact.xml java/trunk/detector-data/detectors/HPS-TestRun-v8/compact.xml java/trunk/detector-data/detectors/HPSTestRunTracker2014-v0/compact.xml java/trunk/detector-model/src/main/java/org/lcsim/detector/converter/compact/HPSTestRunTracker2014Converter.java java/trunk/detector-model/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014ConverterBase.java java/trunk/detector-model/src/main/java/org/lcsim/detector/converter/compact/HPSTrackerConverter.java java/trunk/detector-model/src/main/java/org/lcsim/detector/converter/compact/subdetector/HpsTracker2.java java/trunk/detector-model/src/main/java/org/lcsim/detector/converter/compact/subdetector/SvtStereoLayer.java java/trunk/detector-model/src/main/java/org/lcsim/detector/tracker/silicon/HpsTestRunSiSensor.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014GeometryDefinition.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014JavaBuilder.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014LCDDBuilder.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014JavaBuilder.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerGeometryDefinition.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerJavaBuilder.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerLCDDBuilder.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/IHPSTrackerJavaBuilder.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/IHPSTrackerLCDDBuilder.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/JavaGhostSurveyVolume.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/JavaSurveyVolume.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/LCDDGhostSurveyVolume.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/LCDDSurveyVolume.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/MilleParameter.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyCoordinateSystem.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolume.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolumeImpl.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolumeVisualization.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SvtAlignmentConstantsReader.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSMuonCalorimeter2.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTestRunTracker2014.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/subdetector/HPSTestRunTracker2014.java java/trunk/detector-model/src/test/java/org/lcsim/detector/converter/compact/HPSTracker2ConverterTest.java java/trunk/detector-model/src/test/java/org/lcsim/geometry/compact/converter/lcdd/HPSTestRunTracker2014LCDDTest.java java/trunk/detector-model/src/test/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014LCDDTest.java java/trunk/detector-model/src/test/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014v1LCDDTest.java java/trunk/detector-model/src/test/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014v1SurveyLCDDTest.java java/trunk/detector-model/src/test/java/org/lcsim/geometry/subdetector/HPSTestRunTracker2014Test.java java/trunk/detector-model/src/test/resources/org/lcsim/geometry/subdetector/HPSTest.xml java/trunk/detector-model/src/test/resources/org/lcsim/geometry/subdetector/HPSTestRunTracker2014.xml java/trunk/distribution/src/main/java/org/hps/HPSJavaProperties.java java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/event/Association.java java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/event/Cluster.java java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/event/EcalHit.java java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/event/Event.java java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/io/EventManager.java java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/lcsim/EventDisplayOutputDriver.java java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/lcsim/LCIOBridgeDriver.java java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/DataFileViewer.java java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/FileViewer.java java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PDataEventViewer.java java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/Viewer.java java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/BooleanMap.java java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/ColorScale.java java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/CrystalEvent.java java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/CrystalListener.java java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/DatabaseCheck.java java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/GradientScale.java java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/MultiGradientScale.java java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/ClockSingleton.java java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCEcalReadoutDriver.java java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCPrimaryTriggerDriver.java java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCTriggerVariableDriver.java java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/MollerTriggerDriver.java java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/OccupancyAnalysisDriver.java java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/ReadoutTrigger.java java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/RingBuffer.java java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/TimeEvolutionEcalReadoutDriver.java java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalCalibrationsDriver.java java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalConverterDriver.java java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalEdepToTriggerConverterDriver.java java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalOnlineRawConverter.java java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalOnlineRawConverterDriver.java java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalPedestalCalculator.java java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalTimeWalk.java java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/IterateGainFactorDriver.java java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterEnergyCorrection.java java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterPositionCorrection.java java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterDriver.java java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterer.java java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPOnlineClusterDriver.java java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPOnlineClusterer.java java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ReconClusterer.java java/trunk/evio/src/main/java/org/hps/evio/DummyEventBuilder.java java/trunk/evio/src/main/java/org/hps/evio/EcalHitWriter.java java/trunk/evio/src/main/java/org/hps/evio/EvioReader.java java/trunk/evio/src/main/java/org/hps/evio/RfFitFunction.java java/trunk/evio/src/main/java/org/hps/evio/RfHit.java java/trunk/evio/src/main/java/org/hps/evio/TestRunReconToEvio.java java/trunk/evio/src/test/java/org/hps/evio/LCSimEngRunEventBuilderTest.java java/trunk/evio/src/test/java/org/hps/evio/LCSimTestRunEventBuilderTest.java java/trunk/evio/src/test/java/org/hps/evio/SvtEvioReaderTest.java java/trunk/integration-tests/src/test/java/org/hps/test/it/SimpleSvtReadoutTest.java java/trunk/integration-tests/src/test/resources/org/hps/ecalreadoutsim/EcalReadoutSimTest.lcsim java/trunk/integration-tests/src/test/resources/org/hps/steering/test/Dummy.lcsim java/trunk/integration-tests/src/test/resources/org/hps/steering/test/EcalReadoutSimTest.lcsim java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTCellIDPrintDriver.java java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTHitRecoCorrelations.java java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTHitReconstructionPlots.java java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtTimingInPlots.java java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/BasicMonitoringPlotsDriver.java java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalClusterPlots.java java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalEventDisplayWithRawWaveform.java java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalFeeMonitor.java java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalHitPlots.java java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalLedSequenceMonitor.java java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalPedestalViewer.java java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalWindowPlotsXY.java java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/AbstractTablePanel.java java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/AbstractTriggerTablePanel.java java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/AbstractTwoColumnTablePanel.java java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/ClusterTablePanel.java java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/ComponentUtils.java java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/DiagnosticUpdatable.java java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/EfficiencyTablePanel.java java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/PairTablePanel.java java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/ShifterTrigPanel.java java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/ShifterTrigWindow.java java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/SinglesTablePanel.java java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/TableTextModel.java java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/TriggerDiagnosticGUIDriver.java java/trunk/parent/pom.xml java/trunk/recon/src/main/java/org/hps/recon/filtering/CosmicPMTFilter.java java/trunk/recon/src/main/java/org/hps/recon/filtering/EcalGainCalibFilter.java java/trunk/recon/src/main/java/org/hps/recon/filtering/FEEFilterDriver.java java/trunk/recon/src/main/java/org/hps/recon/filtering/MinimumHitsFilter.java java/trunk/recon/src/main/java/org/hps/recon/filtering/PulserScalerAndEpicsFilter.java java/trunk/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java java/trunk/recon/src/main/java/org/hps/recon/particle/SimpleParticleID.java java/trunk/recon/src/main/java/org/hps/recon/utils/TrackClusterMatcher.java java/trunk/recon/src/main/java/org/hps/recon/vertexing/BaseSimpleVertexer.java java/trunk/recon/src/main/java/org/hps/recon/vertexing/BilliorVertex.java java/trunk/recon/src/main/java/org/hps/recon/vertexing/TwoLineVertexer.java java/trunk/recon/src/main/java/org/hps/recon/vertexing/TwoParticleVertexer.java java/trunk/recon/src/main/java/org/hps/recon/vertexing/TwoTrackFringeVertexer.java java/trunk/recon/src/test/java/org/hps/recon/particle/HpsReconParticleDriverTest.java java/trunk/record-util/src/main/java/org/hps/record/daqconfig/DAQConfigDriver.java java/trunk/record-util/src/main/java/org/hps/record/daqconfig/EvioDAQParser.java java/trunk/record-util/src/main/java/org/hps/record/daqconfig/FADCConfig.java java/trunk/record-util/src/main/java/org/hps/record/triggerbank/SSPData.java java/trunk/record-util/src/main/java/org/hps/record/triggerbank/SSPNumberedTrigger.java java/trunk/record-util/src/main/java/org/hps/record/triggerbank/SSPPairTrigger.java java/trunk/record-util/src/main/java/org/hps/record/triggerbank/SSPSinglesTrigger.java java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerModule.java java/trunk/steering-files/src/main/resources/org/hps/steering/analysis/StarterAnalysis.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalLedSequenceMonitoringApp.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalLedSequenceStandalone.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalMonitoringFinal.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalMonitoringOnly.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/SvtOnlineMonitoring.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/readout/CommRun2014TightPairs.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/readout/EngineeringRun2014PrescaledTriggers.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutNoPileup.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutToEvio.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/readout/HPS2014TruthReadoutToLcio.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/readout/LcioToEvio.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/readout/TestRunNoPileup.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/readout/TestRunReadoutToEvio.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/users/baltzell/EngineeringRun2015FullRecon.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/users/celentan/LedAnalysisFromEvio.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/users/celentan/LedOnlineOfflineComparison.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/ClusterRecon.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/EcalFeeViewer.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/EcalSimReadout.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/EngRun2015FullReconMC_FEE.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/EngineeringRun2015EcalOnly.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/EngineeringRun2015_FEEIter_Filter.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/QuickEcalReadout.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/EcalScoring.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/HitTimes.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/PairsSkimmer.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/SmallHits.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/TridentMCSkim.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/ecal_fadc_bkgd.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/raw_triggers.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/users/phansson/TestRunOfflineRecon.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/users/rafo/TestSteering.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/users/spaul/MollerBeamtilt.lcsim java/trunk/tracking/src/main/java/org/hps/recon/tracking/DumbShaperFit.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/NearestNeighborRMSClusterer.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/NoiselessReadoutChip.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/SVTBadChannelFilterDriver.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackResidualsData.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackTimeData.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/WTrack.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLEventData.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLFileIO.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLStripClusterData.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblData.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblPoint.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblTrajectory.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblUtils.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/TruthResiduals.java java/trunk/tracking/src/main/java/org/hps/svt/alignment/BuildCompact.java java/trunk/tracking/src/main/java/org/hps/svt/alignment/BuildMillepedeCompact.java java/trunk/tracking/src/main/java/org/hps/svt/alignment/MillepedeCompactDump.java java/trunk/tracking/src/main/resources/org/hps/recon/tracking/strategies/HPS-Test-All.xml java/trunk/tracking/src/test/java/org/hps/recon/tracking/HelicalTrackHitDriverTest.java java/trunk/tracking/src/test/java/org/hps/recon/tracking/TruthResidualTest.java java/trunk/users/src/main/java/org/hps/users/baltzell/RfFitFunction.java java/trunk/users/src/main/java/org/hps/users/baltzell/RfFitterDriver.java java/trunk/users/src/main/java/org/hps/users/baltzell/RfHit.java java/trunk/users/src/main/java/org/hps/users/celentan/LedOnlineOfflineComparisonDriver.java java/trunk/users/src/main/java/org/hps/users/celentan/RawPedestalComputator.java java/trunk/users/src/main/java/org/hps/users/celentan/StripChartTest.java java/trunk/users/src/main/java/org/hps/users/holly/ClusterDriver.java java/trunk/users/src/main/java/org/hps/users/holly/EcalClusterICPosition.java java/trunk/users/src/main/java/org/hps/users/holly/EcalClustererCosmics.java java/trunk/users/src/main/java/org/hps/users/holly/EcalRawConverter.java java/trunk/users/src/main/java/org/hps/users/holly/HPSEcalClusterIC.java java/trunk/users/src/main/java/org/hps/users/kmccarty/ClusterAnalysisDriver.java java/trunk/users/src/main/java/org/hps/users/kmccarty/CountTriggersDriver.java java/trunk/users/src/main/java/org/hps/users/kmccarty/EvioAnalysis.java java/trunk/users/src/main/java/org/hps/users/kmccarty/FADCAnalysisDriver.java java/trunk/users/src/main/java/org/hps/users/kmccarty/HPSEcalDataPlotsDriver.java java/trunk/users/src/main/java/org/hps/users/kmccarty/InvariantMassPairDriver.java java/trunk/users/src/main/java/org/hps/users/kmccarty/MTEAnalysis.java java/trunk/users/src/main/java/org/hps/users/kmccarty/MTETriggerPlotsFormatter.java java/trunk/users/src/main/java/org/hps/users/kmccarty/ParticleMCAnalysisDriver.java java/trunk/users/src/main/java/org/hps/users/kmccarty/PlotsFormatter.java java/trunk/users/src/main/java/org/hps/users/kmccarty/RafoAnalysis.java java/trunk/users/src/main/java/org/hps/users/kmccarty/TridentTrackDriver.java java/trunk/users/src/main/java/org/hps/users/kmccarty/TriggerPlotsModule.java java/trunk/users/src/main/java/org/hps/users/kmccarty/TriggerProcessAnalysisDriver.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/AddPlots.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot1D.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot2D.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/PlotFormatModule.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/PlotsFormatter.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/InvariantMassPlotsFormatter.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTEPlotFormatter.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTETriggerPlotsFormatter.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/ParticleMCAnalysisPlotsFormatter.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/RafoTridentFormatter.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/SingleTriggerPlotsFormatter.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TridentTrackFormatter.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TriggerPlotsFormat.java java/trunk/users/src/main/java/org/hps/users/luca/FADCVariableTriggerFEEDriver.java java/trunk/users/src/main/java/org/hps/users/luca/FEETrigger.java java/trunk/users/src/main/java/org/hps/users/luca/FEETrigger2.java java/trunk/users/src/main/java/org/hps/users/luca/LCIOReadScript.java java/trunk/users/src/main/java/org/hps/users/luca/rate.java java/trunk/users/src/main/java/org/hps/users/luca/ratesim.java java/trunk/users/src/main/java/org/hps/users/meeg/HPSEcalAnalogPrintDriver.java java/trunk/users/src/main/java/org/hps/users/meeg/HPSEcalDigitalPrintDriver.java java/trunk/users/src/main/java/org/hps/users/meeg/HPSEcalRawTrackerHitPrintDriver.java java/trunk/users/src/main/java/org/hps/users/meeg/HPSGenericRawTrackerHitPrintDriver.java java/trunk/users/src/main/java/org/hps/users/meeg/LCIOTrackAnalysis.java java/trunk/users/src/main/java/org/hps/users/mgraham/HPSTrackerHit.java java/trunk/users/src/main/java/org/hps/users/mgraham/SVTRawTrackerHitThresholdDriver.java java/trunk/users/src/main/java/org/hps/users/omoreno/EcalScoringPlaneDriver.java java/trunk/users/src/main/java/org/hps/users/omoreno/ExtrapolationAnalysis.java java/trunk/users/src/main/java/org/hps/users/omoreno/LheToStdhep.java java/trunk/users/src/main/java/org/hps/users/omoreno/PlotUtils.java java/trunk/users/src/main/java/org/hps/users/omoreno/ReconstructedParticleChecker.java java/trunk/users/src/main/java/org/hps/users/omoreno/SharedHitAnalysis.java java/trunk/users/src/main/java/org/hps/users/omoreno/SvtClusterAnalysis.java java/trunk/users/src/main/java/org/hps/users/omoreno/SvtDataRates.java java/trunk/users/src/main/java/org/hps/users/omoreno/SvtHitCorrelations.java java/trunk/users/src/main/java/org/hps/users/omoreno/SvtQA.java java/trunk/users/src/main/java/org/hps/users/omoreno/SvtTrackAnalysis.java java/trunk/users/src/main/java/org/hps/users/omoreno/SvtTrackRecoEfficiency.java java/trunk/users/src/main/java/org/hps/users/omoreno/TestRunTrackReconEfficiency.java java/trunk/users/src/main/java/org/hps/users/phansson/FastTrackResidualDriver.java java/trunk/users/src/main/java/org/hps/users/phansson/GblResidualDriver.java java/trunk/users/src/main/java/org/hps/users/phansson/SimpleResiduals.java java/trunk/users/src/main/java/org/hps/users/phansson/gbl/GBLDriver.java java/trunk/users/src/main/java/org/hps/users/phansson/gbl/HpsGblFitter.java java/trunk/users/src/main/java/org/hps/users/phansson/testrun/TrigRateDriver.java java/trunk/users/src/main/java/org/hps/users/phansson/tools/TrackingGeometryChecker.java java/trunk/users/src/main/java/org/hps/users/rafo/test1.java java/trunk/users/src/main/java/org/hps/users/spaul/GetChargeFromScalersMultirun.java java/trunk/users/src/main/java/org/hps/users/spaul/HitrateHistograms.java java/trunk/users/src/main/java/org/hps/users/spaul/PulserFilter.java java/trunk/users/src/main/java/org/hps/users/spaul/StyleUtil.java java/trunk/users/src/main/java/org/hps/users/spaul/SumEverything.java java/trunk/users/src/main/java/org/hps/users/spaul/feecc/BinGenerator.java java/trunk/users/src/main/java/org/hps/users/spaul/feecc/CustomBinning.java java/trunk/users/src/main/java/org/hps/users/spaul/feecc/DisplayHistograms.java java/trunk/users/src/main/java/org/hps/users/spaul/feecc/EcalUtil.java java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ExtractFormFactors.java java/trunk/users/src/main/java/org/hps/users/spaul/feecc/FEESpectrumGenerator.java java/trunk/users/src/main/java/org/hps/users/spaul/feecc/FormFactor.java java/trunk/users/src/main/java/org/hps/users/spaul/feecc/MakeHistograms.java java/trunk/users/src/main/java/org/hps/users/spaul/feecc/MottIntegral.java java/trunk/users/src/main/java/org/hps/users/spaul/feecc/MultipleScattering.java java/trunk/users/src/main/java/org/hps/users/spaul/feecc/RemoveDuplicateParticles.java java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ShowCustomBinning.java java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ShowCustomBinningXY.java java/trunk/users/src/main/java/org/hps/users/spaul/moller/FitAllProfiles.java java/trunk/users/src/main/java/org/hps/users/spaul/moller/FitMollerPyPzGraphs.java java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerBeamtiltAnalysis.java java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerBeamtiltFitter.java java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerStdhepTest.java java/trunk/util/src/main/java/org/hps/util/ConvertToStdhep.java java/trunk/util/src/main/java/org/hps/util/DumpLHEEventsToASCII.java Modified: java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/EcalMonitoring.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/EcalMonitoring.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/EcalMonitoring.java Wed Mar 9 11:43:24 2016 @@ -102,10 +102,10 @@ @Override protected void detectorChanged(Detector detector) { - BeamEnergyCollection beamEnergyCollection = - this.getConditionsManager().getCachedConditions(BeamEnergyCollection.class, "beam_energies").getCachedData(); - double beamEnergy = beamEnergyCollection.get(0).getBeamEnergy(); - //this.getConditionsManager().getCachedConditions(org.hps.conditions.EcalChannelCollection.class, "ecal_channels"). + BeamEnergyCollection beamEnergyCollection = + this.getConditionsManager().getCachedConditions(BeamEnergyCollection.class, "beam_energies").getCachedData(); + double beamEnergy = beamEnergyCollection.get(0).getBeamEnergy(); + //this.getConditionsManager().getCachedConditions(org.hps.conditions.EcalChannelCollection.class, "ecal_channels"). LOGGER.info("EcalMonitoring::detectorChanged Setting up the plotter"); aida.tree().cd("/"); if (fillHitPlots) { Modified: java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/FinalStateMonitoring.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/FinalStateMonitoring.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/FinalStateMonitoring.java Wed Mar 9 11:43:24 2016 @@ -106,11 +106,11 @@ @Override protected void detectorChanged(Detector detector) { - BeamEnergyCollection beamEnergyCollection = - this.getConditionsManager().getCachedConditions(BeamEnergyCollection.class, "beam_energies").getCachedData(); - double beamEnergy = beamEnergyCollection.get(0).getBeamEnergy(); - - + BeamEnergyCollection beamEnergyCollection = + this.getConditionsManager().getCachedConditions(BeamEnergyCollection.class, "beam_energies").getCachedData(); + double beamEnergy = beamEnergyCollection.get(0).getBeamEnergy(); + + LOGGER.info("Setting up the plotter"); aida.tree().cd("/"); String trkType="SeedTrack/"; Modified: java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TridentMonitoring.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TridentMonitoring.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TridentMonitoring.java Wed Mar 9 11:43:24 2016 @@ -322,8 +322,8 @@ beamAxisRotation.setActiveEuler(Math.PI / 2, -0.0305, -Math.PI / 2); BeamEnergyCollection beamEnergyCollection = - this.getConditionsManager().getCachedConditions(BeamEnergyCollection.class, "beam_energies").getCachedData(); - ebeam = beamEnergyCollection.get(0).getBeamEnergy(); + this.getConditionsManager().getCachedConditions(BeamEnergyCollection.class, "beam_energies").getCachedData(); + ebeam = beamEnergyCollection.get(0).getBeamEnergy(); aida.tree().cd("/"); String trkType = "SeedTrack/"; if (isGBL) { Modified: java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/V0Monitoring.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/V0Monitoring.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/V0Monitoring.java Wed Mar 9 11:43:24 2016 @@ -8,8 +8,8 @@ import hep.aida.IHistogram2D; import hep.aida.IPlotter; import hep.aida.IPlotterStyle; +import hep.physics.vec.BasicHep3Matrix; import hep.physics.vec.Hep3Vector; -import hep.physics.vec.BasicHep3Matrix; import hep.physics.vec.VecOp; import java.io.IOException; @@ -18,6 +18,7 @@ import java.util.Map.Entry; import java.util.logging.Level; import java.util.logging.Logger; + import org.hps.conditions.beam.BeamEnergy.BeamEnergyCollection; import org.hps.recon.tracking.TrackType; import org.hps.recon.tracking.TrackUtils; @@ -33,632 +34,730 @@ import org.lcsim.recon.tracking.seedtracker.SeedTrack; /** - * DQM driver V0 particles (i.e. e+e- pars) plots things like number of vertex - * position an mass + * DQM driver V0 particles (i.e. e+e- pars) plots things like number of vertex position an mass * * @author mgraham on May 14, 2014 - * */ public class V0Monitoring extends DataQualityMonitor { - private static Logger LOGGER = Logger.getLogger(V0Monitoring.class.getPackage().getName()); - - String finalStateParticlesColName = "FinalStateParticles"; - String unconstrainedV0CandidatesColName = "UnconstrainedV0Candidates"; - String beamConV0CandidatesColName = "BeamspotConstrainedV0Candidates"; - String targetV0ConCandidatesColName = "TargetConstrainedV0Candidates"; - String[] fpQuantNames = {"nV0_per_Event", "avg_BSCon_mass", "avg_BSCon_Vx", "avg_BSCon_Vy", "avg_BSCon_Vz", "sig_BSCon_Vx", "sig_BSCon_Vy", "sig_BSCon_Vz", "avg_BSCon_Chi2"}; - //some counters - int nRecoEvents = 0; - int nTotV0 = 0; - int nTot2Ele = 0; - //some summers - double sumMass = 0.0; - double sumVx = 0.0; - double sumVy = 0.0; - double sumVz = 0.0; - double sumChi2 = 0.0; - - /* V0 Quantities */ - /* Mass, vertex, chi^2 of fit */ - /* unconstrained */ - IHistogram1D unconMass; - IHistogram1D unconVx; - IHistogram1D unconVy; - IHistogram1D unconVz; - IHistogram1D unconChi2; - IHistogram2D unconVzVsChi2; - IHistogram2D unconChi2VsTrkChi2; - /* beamspot constrained */ - - IHistogram1D nV0; - - IHistogram1D v0Time; - IHistogram1D v0Dt; - IHistogram2D trigTimeV0Time; - IHistogram1D trigTime; - - IHistogram1D bsconMass; - IHistogram1D bsconVx; - IHistogram1D bsconVy; - IHistogram1D bsconVz; - IHistogram1D bsconChi2; - IHistogram2D bsconVzVsChi2; - IHistogram2D bsconChi2VsTrkChi2; - /* target constrained */ - IHistogram1D tarconMass; - IHistogram1D tarconVx; - IHistogram1D tarconVy; - IHistogram1D tarconVz; - IHistogram1D tarconChi2; - IHistogram2D tarconVzVsChi2; - IHistogram2D tarconChi2VsTrkChi2; - - IHistogram2D pEleVspPos; - IHistogram1D pEle; - IHistogram1D pPos; - - IHistogram2D pEleVspPosWithCut; - IHistogram2D pyEleVspyPos; - IHistogram2D pxEleVspxPos; - - IHistogram2D VtxZVsMass; - IHistogram2D VtxYVsVtxZ; - IHistogram2D VtxXVsVtxZ; - IHistogram2D VtxXVsVtxY; - IHistogram2D VtxXVsVtxPx; - IHistogram2D VtxYVsVtxPy; - IHistogram2D VtxZVsVtxPx; - IHistogram2D VtxZVsVtxPy; - IHistogram2D VtxZVsVtxPz; - - IHistogram2D VtxZVsL1Iso; - IHistogram2D VtxZVsTrkChi2; - - IHistogram2D pEleVspEle; - IHistogram2D phiEleVsphiEle; - IHistogram2D pyEleVspyEle; - IHistogram2D pxEleVspxEle; - IHistogram2D pEleVspEleNoBeam; - IHistogram2D pyEleVspyEleNoBeam; - IHistogram2D pxEleVspxEleNoBeam; - IHistogram2D pEleVspEleMoller; - IHistogram2D pEleVsthetaMoller; - IHistogram2D thetaEleVsthetaMoller; - IHistogram2D pEleVspEleBeamBeam; - IHistogram2D pEleVsthetaBeamBeam; - IHistogram2D thetaEleVsthetaBeamBeam; - - IHistogram1D mollerMass; - IHistogram1D mollerMassVtxCut; - IHistogram1D mollerVx; - IHistogram1D mollerVy; - IHistogram1D mollerVz; - IHistogram1D mollerVzVtxCut; - IHistogram2D mollerXVsVtxZ; - IHistogram2D mollerYVsVtxZ; - IHistogram2D mollerXVsVtxY; - - IHistogram1D mollerUx; - IHistogram1D mollerUy; - - - - IHistogram1D sumChargeHisto; - IHistogram1D numChargeHisto; - - private final String plotDir = "V0Monitoring/"; - - private final BasicHep3Matrix beamAxisRotation = new BasicHep3Matrix(); - - double maxFactor = 1.25; - - - double thetaMax = 0.06; - double thetaMin = 0.015; - - - - double feeMomentumCut, v0ESumMinCut, v0MaxPCut, v0ESumMaxCut, - molPSumMin, molPSumMax, beambeamCut; - - - - @Override - protected void detectorChanged(Detector detector) { - - BeamEnergyCollection beamEnergyCollection = - this.getConditionsManager().getCachedConditions(BeamEnergyCollection.class, "beam_energies").getCachedData(); - double beamEnergy = beamEnergyCollection.get(0).getBeamEnergy(); - feeMomentumCut = 0.75*beamEnergy; //GeV - - v0ESumMinCut = 0.8 * beamEnergy; - v0ESumMaxCut = 1.25 * beamEnergy; - - v0MaxPCut = 1.05*beamEnergy;//GeV - molPSumMin = 0.80*beamEnergy; - molPSumMax = 1.25*beamEnergy; - beambeamCut = 0.80*beamEnergy; - - - - beamAxisRotation.setActiveEuler(Math.PI / 2, -0.0305, -Math.PI / 2); - - LOGGER.info("Setting up the plotter"); - aida.tree().cd("/"); - String xtra = "Extras"; - String trkType = "SeedTrack/"; - if (isGBL) - trkType = "GBLTrack/"; - - double maxMass = .2*beamEnergy; - double maxMassMoller = .1*Math.sqrt(beamEnergy); - /* V0 Quantities */ - /* Mass, vertex, chi^2 of fit */ - /* unconstrained */ - unconMass = aida.histogram1D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "Invariant Mass (GeV)", 100, 0, maxMass); - unconVx = aida.histogram1D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "Vx (mm)", 50, -10, 10); - unconVy = aida.histogram1D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "Vy (mm)", 50, -10, 10); - unconVz = aida.histogram1D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "Vz (mm)", 50, -50, 50); - unconChi2 = aida.histogram1D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "Chi2", 25, 0, 25); - unconVzVsChi2 = aida.histogram2D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "Vz vs. Chi2", 25, 0, 25, 50, -50, 50); - unconChi2VsTrkChi2 = aida.histogram2D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "Chi2 vs. total track chi2", 50, 0, 50, 50, 0, 25); - /* beamspot constrained */ - bsconMass = aida.histogram1D(plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + "Mass (GeV)", 100, 0, maxMass); - bsconVx = aida.histogram1D(plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + "Vx (mm)", 50, -10, 10); - bsconVy = aida.histogram1D(plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + "Vy (mm)", 50, -10, 10); - bsconVz = aida.histogram1D(plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + "Vz (mm)", 50, -50, 50); - bsconChi2 = aida.histogram1D(plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + "Chi2", 25, 0, 25); - bsconVzVsChi2 = aida.histogram2D(plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + "Vz vs. Chi2", 25, 0, 25, 50, -50, 50); - bsconChi2VsTrkChi2 = aida.histogram2D(plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + "Chi2 vs. total track chi2", 50, 0, 50, 50, 0, 25); - /* target constrained */ - tarconMass = aida.histogram1D(plotDir + trkType + triggerType + "/" + targetV0ConCandidatesColName + "/" + "Mass (GeV)", 100, 0, maxMass); - tarconVx = aida.histogram1D(plotDir + trkType + triggerType + "/" + targetV0ConCandidatesColName + "/" + "Vx (mm)", 50, -1, 1); - tarconVy = aida.histogram1D(plotDir + trkType + triggerType + "/" + targetV0ConCandidatesColName + "/" + "Vy (mm)", 50, -1, 1); - tarconVz = aida.histogram1D(plotDir + trkType + triggerType + "/" + targetV0ConCandidatesColName + "/" + "Vz (mm)", 50, -10, 10); - tarconChi2 = aida.histogram1D(plotDir + trkType + triggerType + "/" + targetV0ConCandidatesColName + "/" + "Chi2", 25, 0, 25); - tarconVzVsChi2 = aida.histogram2D(plotDir + trkType + triggerType + "/" + targetV0ConCandidatesColName + "/" + "Vz vs. Chi2", 25, 0, 25, 50, -50, 50); - tarconChi2VsTrkChi2 = aida.histogram2D(plotDir + trkType + triggerType + "/" + targetV0ConCandidatesColName + "/" + "Chi2 vs. total track chi2", 50, 0, 50, 50, 0, 25); - - nV0 = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Number of V0 per event", 10, 0, 10); - v0Time = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "V0 mean time", 100, -25, 25); - v0Dt = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "V0 time difference", 100, -25, 25); - trigTimeV0Time = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Trigger phase vs. V0 mean time", 100, -25, 25, 6, 0, 24); - trigTime = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Trigger phase", 6, 0, 24); - - pEleVspPos = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "P(e) vs P(p)", 50, 0, beamEnergy * maxFactor, 50, 0, beamEnergy * maxFactor); - - - pEle = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "P(e)", 50, 0, beamEnergy * maxFactor); - pPos = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "P(p)", 50, 0, beamEnergy * maxFactor); - - pEleVspPosWithCut = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "P(e) vs P(p): Radiative", 50, 0, beamEnergy * maxFactor, 50, 0, beamEnergy * maxFactor); - pyEleVspyPos = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Py(e) vs Py(p)", 50, -0.04*beamEnergy, 0.04*beamEnergy, 50, -0.04*beamEnergy, 0.04*beamEnergy); - pxEleVspxPos = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Px(e) vs Px(p)", 50, -0.04*beamEnergy, 0.04*beamEnergy, 50, -0.04*beamEnergy, 0.04*beamEnergy); - VtxZVsMass = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vz vs Mass", 50, 0, maxMass, 50, -50, 80); - VtxXVsVtxZ = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vx vs Vz", 100, -10, 10, 100, -50, 80); - VtxYVsVtxZ = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vy vs Vz", 100, -5, 5, 100, -50, 80); - VtxXVsVtxY = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vx vs Vy", 100, -10, 10, 100, -5, 5); - VtxXVsVtxPx = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vx vs Px", 100, -0.1, 0.1, 100, -10, 10); - VtxYVsVtxPy = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vy vs Py", 100, -0.1, 0.1, 100, -5, 5); - VtxZVsVtxPx = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vz vs Px", 100, -0.1, 0.1, 100, -50, 80); - VtxZVsVtxPy = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vz vs Py", 100, -0.1, 0.1, 100, -50, 80); - VtxZVsVtxPz = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vz vs Pz", 100, 0.0, beamEnergy * maxFactor, 100, -50, 80); - VtxZVsL1Iso = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vz vs L1 Isolation", 100, 0.0, 5.0, 50, -50, 80); - VtxZVsTrkChi2 = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vz vs Track Chi2", 50, 0, 50, 50, -50, 80); - phiEleVsphiEle = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/phi(e) vs phi(e)", 50, -Math.PI, Math.PI, 50, -Math.PI, Math.PI); - pyEleVspyEle = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Py(e) vs Py(e)", 50, -0.04*beamEnergy, 0.04*beamEnergy, 50, -0.04*beamEnergy, 0.04*beamEnergy); - pxEleVspxEle = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Px(e) vs Px(e)", 50, -0.02*beamEnergy, 0.06*beamEnergy, 50, -0.02*beamEnergy, 0.06*beamEnergy); - - // electron vs electron momentum with different cuts - // 1) no cut - // 2) cut out FEE - // 3) cut out FEE and also cut on momentum sum - // 4) cut out everything except FEE coincidentals - pEleVspEle = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/P(e) vs P(e)", 50, 0, beamEnergy * maxFactor, 50, 0, beamEnergy * maxFactor); - pEleVspEleNoBeam = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/P(e) vs P(e) NoBeam", 50, 0, beambeamCut, 50, 0, beambeamCut); - pEleVspEleMoller = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/P(e) vs P(e) Moller", 50, 0, beambeamCut, 50, 0, beambeamCut); - pEleVspEleBeamBeam = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/P(e) vs P(e) BeamBeam", 50, beambeamCut, beamEnergy * maxFactor, 50, beambeamCut, beamEnergy * maxFactor); - - pyEleVspyEleNoBeam = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Py(e) vs Py(e) NoBeam", 50, -0.04*beamEnergy, 0.04*beamEnergy, 50, -0.04*beamEnergy, 0.04*beamEnergy); - pxEleVspxEleNoBeam = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Px(e) vs Px(e) NoBeam", 50, -0.02*beamEnergy, 0.06*beamEnergy, 50, -0.02*beamEnergy, 0.06*beamEnergy); - sumChargeHisto = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Total Charge of Event", 5, -2, 3); - numChargeHisto = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Number of Charged Particles", 6, 0, 6); - - pEleVsthetaMoller = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/P(e) vs Theta Moller", 50, 0, beambeamCut, 50, thetaMin, thetaMax); - thetaEleVsthetaMoller = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Theta vs Theta Moller", 50, thetaMin, thetaMax, 50, thetaMin, thetaMax); - pEleVsthetaBeamBeam = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/P(e) vs Theta BeamBeam", 50, beambeamCut, beamEnergy * maxFactor, 50, thetaMin, thetaMax); - thetaEleVsthetaBeamBeam = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Theta vs Theta BeamBeam", 50, thetaMin, thetaMax, 50, thetaMin, thetaMax); - - mollerMass = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Mass (GeV)", 100, 0, maxMassMoller); - mollerMassVtxCut = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Mass (GeV): VtxCut", 100, 0, maxMassMoller); - mollerVx = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Vx (mm)", 50, -10, 10); - mollerVy = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Vy (mm)", 50, -2, 2); - mollerVz = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Vz (mm)", 50, -50, 50); - mollerVzVtxCut = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Vz (mm): VtxCut", 50, -50, 50); - mollerXVsVtxZ = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Vx vs Vz", 100, -5, 5, 100, -50, 50); - mollerYVsVtxZ = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Vy vs Vz", 100, -2, 2, 100, -50, 50); - mollerXVsVtxY = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Vx vs Vy", 100, -5, 5, 100, -2, 2); - - mollerUx = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Pair Momentum Direction Ux", 100, .015, .045); - mollerUy = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Pair Momentum Direction Uy", 100, -.01, .01); - - mollerHiP = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/P(high)", 100, 0, beamEnergy*maxFactor); - mollerLoP = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/P(low)", 100, 0, beamEnergy*maxFactor); - - mollerEitherP = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/P(either)", 100, 0, beamEnergy*maxFactor); - mollerPsum = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Psum", 100, 0, beamEnergy*maxFactor); - - } - - IHistogram1D mollerHiP, mollerLoP, mollerEitherP, mollerPsum; - - @Override - public void process(EventHeader event) { - /* make sure everything is there */ - if (!event.hasCollection(ReconstructedParticle.class, finalStateParticlesColName)) - return; - if (!event.hasCollection(ReconstructedParticle.class, unconstrainedV0CandidatesColName)) - return; - if (!event.hasCollection(ReconstructedParticle.class, beamConV0CandidatesColName)) - return; - if (!event.hasCollection(ReconstructedParticle.class, targetV0ConCandidatesColName)) - return; - - //check to see if this event is from the correct trigger (or "all"); - if (!matchTrigger(event)) - return; - - nRecoEvents++; - - RelationalTable hitToStrips = TrackUtils.getHitToStripsTable(event); - RelationalTable hitToRotated = TrackUtils.getHitToRotatedTable(event); - - List<ReconstructedParticle> unonstrainedV0List = event.get(ReconstructedParticle.class, unconstrainedV0CandidatesColName); - for (ReconstructedParticle uncV0 : unonstrainedV0List) { - if (isGBL != TrackType.isGBL(uncV0.getType())) - continue; - Vertex uncVert = uncV0.getStartVertex(); - Hep3Vector pVtxRot = VecOp.mult(beamAxisRotation, uncV0.getMomentum()); - Hep3Vector vtxPosRot = VecOp.mult(beamAxisRotation, uncVert.getPosition()); - double theta = Math.acos(pVtxRot.z() / pVtxRot.magnitude()); - double phi = Math.atan2(pVtxRot.y(), pVtxRot.x()); - unconVx.fill(vtxPosRot.x()); - unconVy.fill(vtxPosRot.y()); - unconVz.fill(vtxPosRot.z()); - unconMass.fill(uncV0.getMass()); - unconChi2.fill(uncVert.getChi2()); - unconVzVsChi2.fill(uncVert.getChi2(), vtxPosRot.z()); - unconChi2VsTrkChi2.fill(Math.max(uncV0.getParticles().get(0).getTracks().get(0).getChi2(), uncV0.getParticles().get(1).getTracks().get(0).getChi2()), uncVert.getChi2()); - - VtxZVsMass.fill(uncV0.getMass(), vtxPosRot.z()); - VtxXVsVtxZ.fill(vtxPosRot.x(), vtxPosRot.z()); - VtxYVsVtxZ.fill(vtxPosRot.y(), vtxPosRot.z()); - VtxXVsVtxY.fill(vtxPosRot.x(), vtxPosRot.y()); - VtxXVsVtxPx.fill(pVtxRot.x(), vtxPosRot.x()); - VtxYVsVtxPy.fill(pVtxRot.y(), vtxPosRot.y()); - VtxZVsVtxPx.fill(pVtxRot.x(), vtxPosRot.z()); - VtxZVsVtxPy.fill(pVtxRot.y(), vtxPosRot.z()); - VtxZVsVtxPz.fill(pVtxRot.z(), vtxPosRot.z()); - - //this always has 2 tracks. - List<ReconstructedParticle> trks = uncV0.getParticles(); - // Track ele = trks.get(0).getTracks().get(0); - // Track pos = trks.get(1).getTracks().get(0); - // //if track #0 has charge>0 it's the electron! This seems mixed up, but remember the track - // //charge is assigned assuming a positive B-field, while ours is negative - // if (trks.get(0).getCharge() > 0) { - // pos = trks.get(0).getTracks().get(0); - // ele = trks.get(1).getTracks().get(0); - // } - // aida.histogram2D(plotDir + trkType + triggerType + "/" + "P(e) vs P(p)").fill(getMomentum(ele), getMomentum(pos)); - // aida.histogram2D(plotDir + trkType + triggerType + "/" + "Px(e) vs Px(p)").fill(ele.getTrackStates().get(0).getMomentum()[1], pos.getTrackStates().get(0).getMomentum()[1]); - // aida.histogram2D(plotDir + trkType + triggerType + "/" + "Py(e) vs Py(p)").fill(ele.getTrackStates().get(0).getMomentum()[2], pos.getTrackStates().get(0).getMomentum()[2]); - ReconstructedParticle ele = trks.get(0); - ReconstructedParticle pos = trks.get(1); - //ReconParticles have the charge correct. - if (trks.get(0).getCharge() > 0) { - pos = trks.get(0); - ele = trks.get(1); - } - if (ele.getCharge() < 0 && pos.getCharge() > 0) { - VtxZVsTrkChi2.fill(Math.max(uncV0.getParticles().get(0).getTracks().get(0).getChi2(), uncV0.getParticles().get(1).getTracks().get(0).getChi2()), uncVert.getPosition().z()); - - Double[] eleIso = TrackUtils.getIsolations(ele.getTracks().get(0), hitToStrips, hitToRotated); - Double[] posIso = TrackUtils.getIsolations(pos.getTracks().get(0), hitToStrips, hitToRotated); - if (eleIso[0] != null && posIso[0] != null) { - double eleL1Iso = Math.min(Math.abs(eleIso[0]), Math.abs(eleIso[1])); - double posL1Iso = Math.min(Math.abs(posIso[0]), Math.abs(posIso[1])); - double minL1Iso = Math.min(eleL1Iso, posL1Iso); - VtxZVsL1Iso.fill(minL1Iso, uncVert.getPosition().z()); - } - - double pe = ele.getMomentum().magnitude(); - double pp = pos.getMomentum().magnitude(); - Hep3Vector pEleRot = VecOp.mult(beamAxisRotation, ele.getMomentum()); - Hep3Vector pPosRot = VecOp.mult(beamAxisRotation, pos.getMomentum()); - - pEleVspPos.fill(pe, pp); - pEle.fill(pe); - pPos.fill(pp); - - - pxEleVspxPos.fill(pEleRot.x(), pPosRot.x()); - pyEleVspyPos.fill(pEleRot.y(), pPosRot.y()); - if (pe < v0MaxPCut && pp < v0MaxPCut && (pe + pp) > v0ESumMinCut && (pe + pp) < v0ESumMaxCut)//enrich radiative-like events - - pEleVspPosWithCut.fill(pe, pp); - } - - double eleT = TrackUtils.getTrackTime(ele.getTracks().get(0), hitToStrips, hitToRotated); - double posT = TrackUtils.getTrackTime(pos.getTracks().get(0), hitToStrips, hitToRotated); - double meanT = (eleT + posT) / 2.0; - v0Time.fill(meanT); - v0Dt.fill(eleT - posT); - trigTimeV0Time.fill(meanT, event.getTimeStamp() % 24); - trigTime.fill(event.getTimeStamp() % 24); - } - - List<ReconstructedParticle> beamConstrainedV0List = event.get(ReconstructedParticle.class, beamConV0CandidatesColName); - nV0.fill(beamConstrainedV0List.size()); - for (ReconstructedParticle bsV0 : beamConstrainedV0List) { - - if (isGBL != TrackType.isGBL(bsV0.getType())) - continue; - nTotV0++; - Vertex bsVert = bsV0.getStartVertex(); - Hep3Vector vtxPosRot = VecOp.mult(beamAxisRotation, bsVert.getPosition()); - bsconVx.fill(vtxPosRot.x()); - bsconVy.fill(vtxPosRot.y()); - bsconVz.fill(vtxPosRot.z()); - bsconMass.fill(bsV0.getMass()); - bsconChi2.fill(bsVert.getChi2()); - bsconVzVsChi2.fill(bsVert.getChi2(), vtxPosRot.z()); - bsconChi2VsTrkChi2.fill(Math.max(bsV0.getParticles().get(0).getTracks().get(0).getChi2(), bsV0.getParticles().get(1).getTracks().get(0).getChi2()), bsVert.getChi2()); - sumMass += bsV0.getMass(); - sumVx += vtxPosRot.x(); - sumVy += vtxPosRot.y(); - sumVz += vtxPosRot.z(); - sumChi2 += bsVert.getChi2(); - } - - List<ReconstructedParticle> targetConstrainedV0List = event.get(ReconstructedParticle.class, targetV0ConCandidatesColName); - for (ReconstructedParticle tarV0 : targetConstrainedV0List) { - - if (isGBL != TrackType.isGBL(tarV0.getType())) - continue; - - Vertex tarVert = tarV0.getStartVertex(); - Hep3Vector vtxPosRot = VecOp.mult(beamAxisRotation, tarVert.getPosition()); - tarconVx.fill(vtxPosRot.x()); - tarconVy.fill(vtxPosRot.y()); - tarconVz.fill(vtxPosRot.z()); - tarconMass.fill(tarV0.getMass()); - tarconChi2.fill(tarVert.getChi2()); - tarconVzVsChi2.fill(tarVert.getChi2(), vtxPosRot.z()); - tarconChi2VsTrkChi2.fill(Math.max(tarV0.getParticles().get(0).getTracks().get(0).getChi2(), tarV0.getParticles().get(1).getTracks().get(0).getChi2()), tarVert.getChi2()); - } - List<ReconstructedParticle> finalStateParticles = event.get(ReconstructedParticle.class, finalStateParticlesColName); - if (debug) - LOGGER.info("This events has " + finalStateParticles.size() + " final state particles"); - - ReconstructedParticle ele1 = null; - ReconstructedParticle ele2 = null; - int sumCharge = 0; - int numChargedParticles = 0; - for (ReconstructedParticle fsPart : finalStateParticles) { - if (isGBL != TrackType.isGBL(fsPart.getType())) - continue; - if (debug) - LOGGER.info("PDGID = " + fsPart.getParticleIDUsed() + "; charge = " + fsPart.getCharge() + "; pz = " + fsPart.getMomentum().x()); - double charge = fsPart.getCharge(); - sumCharge += charge; - if (charge != 0) { - numChargedParticles++; - if (charge < 1) - if (ele1 == null) - ele1 = fsPart; - else if (!hasSharedStrips(ele1, fsPart, hitToStrips, hitToRotated)) - ele2 = fsPart; - } - } - sumChargeHisto.fill(sumCharge); - numChargeHisto.fill(numChargedParticles); - - if (ele1 != null && ele2 != null) { - Hep3Vector p1 = VecOp.mult(beamAxisRotation, ele1.getMomentum()); - Hep3Vector p2 = VecOp.mult(beamAxisRotation, ele2.getMomentum()); - // Hep3Vector beamAxis = new BasicHep3Vector(Math.sin(0.0305), 0, Math.cos(0.0305)); - // LOGGER.info(p1); - // LOGGER.info(VecOp.mult(rot, p1)); - - double theta1 = Math.acos(p1.z() / p1.magnitude()); - double theta2 = Math.acos(p2.z() / p2.magnitude()); - double phi1 = Math.atan2(p1.y(), p1.x()); - double phi2 = Math.atan2(p2.y(), p2.x()); - phiEleVsphiEle.fill(phi1, phi2); - pEleVspEle.fill(ele1.getMomentum().magnitude(), ele2.getMomentum().magnitude()); - pyEleVspyEle.fill(ele1.getMomentum().y(), ele2.getMomentum().y()); - pxEleVspxEle.fill(ele1.getMomentum().x(), ele2.getMomentum().x()); - //remove beam electrons - if (ele1.getMomentum().magnitude() < beambeamCut && ele2.getMomentum().magnitude() < beambeamCut) { - pEleVspEleNoBeam.fill(ele1.getMomentum().magnitude(), ele2.getMomentum().magnitude()); - pyEleVspyEleNoBeam.fill(ele1.getMomentum().y(), ele2.getMomentum().y()); - pxEleVspxEleNoBeam.fill(ele1.getMomentum().x(), ele2.getMomentum().x()); - } - //look at beam-beam events - if (ele1.getMomentum().magnitude() > beambeamCut && ele2.getMomentum().magnitude() > beambeamCut) { - pEleVspEleBeamBeam.fill(ele1.getMomentum().magnitude(), ele2.getMomentum().magnitude()); - pEleVsthetaBeamBeam.fill(p1.magnitude(), theta1); - pEleVsthetaBeamBeam.fill(p2.magnitude(), theta2); - thetaEleVsthetaBeamBeam.fill(theta1, theta2); - } - - //look at "Moller" events (if that's what they really are - if (ele1.getMomentum().magnitude() + ele2.getMomentum().magnitude() > molPSumMin - && ele1.getMomentum().magnitude() + ele2.getMomentum().magnitude() < molPSumMax - && (p1.magnitude() < beambeamCut && p2.magnitude() < beambeamCut)) { - - Track ele1trk = ele1.getTracks().get(0); - Track ele2trk = ele2.getTracks().get(0); - SeedTrack stEle1 = TrackUtils.makeSeedTrackFromBaseTrack(ele1trk); - SeedTrack stEle2 = TrackUtils.makeSeedTrackFromBaseTrack(ele2trk); - BilliorTrack btEle1 = new BilliorTrack(stEle1.getSeedCandidate().getHelix()); - BilliorTrack btEle2 = new BilliorTrack(stEle2.getSeedCandidate().getHelix()); - BilliorVertex bv = fitVertex(btEle1, btEle2, TrackUtils.getBField(event.getDetector()).magnitude()); - // LOGGER.info("ee vertex: "+bv.toString()); - double invMass = bv.getParameters().get("invMass"); - mollerMass.fill(invMass); - mollerVx.fill(bv.getPosition().x()); - mollerVy.fill(bv.getPosition().y()); - mollerVz.fill(bv.getPosition().z()); - mollerXVsVtxZ.fill(bv.getPosition().x(), bv.getPosition().z()); - mollerYVsVtxZ.fill(bv.getPosition().y(), bv.getPosition().z()); - mollerXVsVtxY.fill(bv.getPosition().x(), bv.getPosition().y()); - - double ux = (ele1.getMomentum().x()+ele2.getMomentum().x())/(ele1.getMomentum().z()+ele2.getMomentum().z()); - double uy = (ele1.getMomentum().y()+ele2.getMomentum().y())/(ele1.getMomentum().z()+ele2.getMomentum().z()); - mollerUx.fill(ux); - mollerUy.fill(uy); - - //higher and lower energy electrons in moller pair - double pt1 = ele1.getMomentum().magnitude(); - double pt2 = ele2.getMomentum().magnitude(); - double ph = (pt1>pt2) ? pt1 : pt2; - double pl = (pt1>pt2) ? pt2 : pt1; - - mollerHiP.fill(ph); - mollerLoP.fill(pl); - - mollerEitherP.fill(ph); - mollerEitherP.fill(pl); - mollerPsum.fill(pt1+pt2); - - - if (Math.abs(bv.getPosition().x()) < 2 - && Math.abs(bv.getPosition().y()) < 0.5) { - mollerMassVtxCut.fill(invMass); - mollerVzVtxCut.fill(bv.getPosition().z()); - } - pEleVspEleMoller.fill(p1.magnitude(), p2.magnitude()); - pEleVsthetaMoller.fill(p1.magnitude(), theta1); - pEleVsthetaMoller.fill(p2.magnitude(), theta2); - thetaEleVsthetaMoller.fill(theta1, theta2); - } - } - } - - @Override - public void printDQMData() { - LOGGER.info("V0Monitoring::printDQMData"); - for (Entry<String, Double> entry : monitoredQuantityMap.entrySet()) - LOGGER.info(entry.getKey() + " = " + entry.getValue()); - LOGGER.info("*******************************"); - } - - /** - * Calculate the averages here and fill the map - */ - @Override - public void calculateEndOfRunQuantities() { - - IAnalysisFactory analysisFactory = IAnalysisFactory.create(); - IFitFactory fitFactory = analysisFactory.createFitFactory(); - IFitter fitter = fitFactory.createFitter("chi2"); - double[] init = {50.0, 0.0, 0.2, 1.0, 0.0}; - IFitResult resVx = fitVertexPosition(bsconVx, fitter, init, "range=\"(-0.5,0.5)\""); - double[] init2 = {50.0, 0.0, 0.04, 1.0, 0.0}; - IFitResult resVy = fitVertexPosition(bsconVy, fitter, init2, "range=\"(-0.2,0.2)\""); - double[] init3 = {50.0, 0.0, 3.0, 1.0, 0.0}; - IFitResult resVz = fitVertexPosition(bsconVz, fitter, init3, "range=\"(-6,6)\""); - - if (resVx != null && resVy != null & resVz != null) { - double[] parsVx = resVx.fittedParameters(); - double[] parsVy = resVy.fittedParameters(); - double[] parsVz = resVz.fittedParameters(); - - for (int i = 0; i < 5; i++) - LOGGER.info("Vertex Fit Parameters: " + resVx.fittedParameterNames()[i] + " = " + parsVx[i] + "; " + parsVy[i] + "; " + parsVz[i]); - - IPlotter plotter = analysisFactory.createPlotterFactory().create("Vertex Position"); - plotter.createRegions(1, 3); - IPlotterStyle pstyle = plotter.style(); - pstyle.legendBoxStyle().setVisible(false); - pstyle.dataStyle().fillStyle().setColor("green"); - pstyle.dataStyle().lineStyle().setColor("black"); - plotter.region(0).plot(bsconVx); - plotter.region(0).plot(resVx.fittedFunction()); - plotter.region(1).plot(bsconVy); - plotter.region(1).plot(resVy.fittedFunction()); - plotter.region(2).plot(bsconVz); - plotter.region(2).plot(resVz.fittedFunction()); - if (outputPlots) - try { - plotter.writeToFile(outputPlotDir + "vertex.png"); - } catch (IOException ex) { - Logger.getLogger(V0Monitoring.class.getName()).log(Level.SEVERE, null, ex); - } - - // monitoredQuantityMap.put(fpQuantNames[2], sumVx / nTotV0); - // monitoredQuantityMap.put(fpQuantNames[3], sumVy / nTotV0); - // monitoredQuantityMap.put(fpQuantNames[4], sumVz / nTotV0); - monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[2], parsVx[1]); - monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[3], parsVy[1]); - monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[4], parsVz[1]); - monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[5], parsVx[2]); - monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[6], parsVy[2]); - monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[7], parsVz[2]); - } - monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[0], (double) nTotV0 / nRecoEvents); - monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[1], sumMass / nTotV0); - monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[8], sumChi2 / nTotV0); - - } - - @Override - public void printDQMStrings() { - for (int i = 0; i < 9; i++)//TODO: do this in a smarter way...loop over the map - LOGGER.info("ALTER TABLE dqm ADD " + fpQuantNames[i] + " double;"); - } - - IFitResult fitVertexPosition(IHistogram1D h1d, IFitter fitter, double[] init, String range - ) { - IFitResult ifr = null; - try { - ifr = fitter.fit(h1d, "g+p1", init, range); - } catch (RuntimeException ex) { - LOGGER.info(this.getClass().getSimpleName() + ": caught exception in fitGaussian"); - } - return ifr; - } - - private BilliorVertex fitVertex(BilliorTrack electron, BilliorTrack positron, double bField) { - // Create a vertex fitter from the magnetic field. - double[] beamSize = {0.001, 0.2, 0.02}; - BilliorVertexer vtxFitter = new BilliorVertexer(bField); - // TODO: The beam size should come from the conditions database. - vtxFitter.setBeamSize(beamSize); - - // Perform the vertexing based on the specified constraint. - vtxFitter.doBeamSpotConstraint(false); - - // Add the electron and positron tracks to a track list for - // the vertex fitter. - List<BilliorTrack> billiorTracks = new ArrayList<BilliorTrack>(); - - billiorTracks.add(electron); - - billiorTracks.add(positron); - - // Find and return a vertex based on the tracks. - return vtxFitter.fitVertex(billiorTracks); - } - - private static boolean hasSharedStrips(ReconstructedParticle vertex, RelationalTable hittostrip, RelationalTable hittorotated) { - return hasSharedStrips(vertex.getParticles().get(0), vertex.getParticles().get(1), hittostrip, hittorotated); - } - - private static boolean hasSharedStrips(ReconstructedParticle fs1, ReconstructedParticle fs2, RelationalTable hittostrip, RelationalTable hittorotated) { - return TrackUtils.hasSharedStrips(fs1.getTracks().get(0), fs2.getTracks().get(0), hittostrip, hittorotated); - } + private static Logger LOGGER = Logger.getLogger(V0Monitoring.class.getPackage().getName()); + + private static boolean hasSharedStrips(final ReconstructedParticle fs1, final ReconstructedParticle fs2, + final RelationalTable hittostrip, final RelationalTable hittorotated) { + return TrackUtils.hasSharedStrips(fs1.getTracks().get(0), fs2.getTracks().get(0), hittostrip, hittorotated); + } + + private final BasicHep3Matrix beamAxisRotation = new BasicHep3Matrix(); + private final String beamConV0CandidatesColName = "BeamspotConstrainedV0Candidates"; + private IHistogram1D bsconChi2; + private IHistogram2D bsconChi2VsTrkChi2; + private IHistogram1D bsconMass; + private IHistogram1D bsconVx; + private IHistogram1D bsconVy; + private IHistogram1D bsconVz; + private IHistogram2D bsconVzVsChi2; + private final String finalStateParticlesColName = "FinalStateParticles"; + private final String[] fpQuantNames = {"nV0_per_Event", "avg_BSCon_mass", "avg_BSCon_Vx", "avg_BSCon_Vy", + "avg_BSCon_Vz", "sig_BSCon_Vx", "sig_BSCon_Vy", "sig_BSCon_Vz", "avg_BSCon_Chi2"}; + + private final double maxFactor = 1.25; + private IHistogram1D mollerHiP, mollerLoP, mollerEitherP, mollerPsum; + private IHistogram1D mollerMass; + private IHistogram1D mollerMassVtxCut; + private IHistogram1D mollerUx; + private IHistogram1D mollerUy; + private IHistogram1D mollerVx; + + private IHistogram1D mollerVy; + + private IHistogram1D mollerVz; + private IHistogram1D mollerVzVtxCut; + private IHistogram2D mollerXVsVtxY; + private IHistogram2D mollerXVsVtxZ; + + private IHistogram2D mollerYVsVtxZ; + // some counters + private int nRecoEvents = 0; + private int nTotV0 = 0; + private IHistogram1D numChargeHisto; + private IHistogram1D nV0; + private IHistogram1D pEle; + private IHistogram2D pEleVspEle; + private IHistogram2D pEleVspEleBeamBeam; + private IHistogram2D pEleVspEleMoller; + private IHistogram2D pEleVspEleNoBeam; + private IHistogram2D pEleVspPos; + private IHistogram2D pEleVspPosWithCut; + private IHistogram2D pEleVsthetaBeamBeam; + private IHistogram2D pEleVsthetaMoller; + + private IHistogram2D phiEleVsphiEle; + private final String plotDir = "V0Monitoring/"; + private IHistogram1D pPos; + + private IHistogram2D pxEleVspxEle; + private IHistogram2D pxEleVspxEleNoBeam; + private IHistogram2D pxEleVspxPos; + + private IHistogram2D pyEleVspyEle; + private IHistogram2D pyEleVspyEleNoBeam; + private IHistogram2D pyEleVspyPos; + private IHistogram1D sumChargeHisto; + private double sumChi2 = 0.0; + // some summers + private double sumMass = 0.0; + private double sumVx = 0.0; + private double sumVy = 0.0; + private double sumVz = 0.0; + + private IHistogram1D tarconChi2; + private IHistogram2D tarconChi2VsTrkChi2; + + /* target constrained */ + private IHistogram1D tarconMass; + private IHistogram1D tarconVx; + private IHistogram1D tarconVy; + private IHistogram1D tarconVz; + private IHistogram2D tarconVzVsChi2; + private final String targetV0ConCandidatesColName = "TargetConstrainedV0Candidates"; + private IHistogram2D thetaEleVsthetaBeamBeam; + private IHistogram2D thetaEleVsthetaMoller; + private final double thetaMax = 0.06; + private final double thetaMin = 0.015; + private IHistogram1D trigTime; + private IHistogram2D trigTimeV0Time; + private IHistogram1D unconChi2; + + private IHistogram2D unconChi2VsTrkChi2; + /* beamspot constrained */ + /* V0 Quantities */ + /* Mass, vertex, chi^2 of fit */ + /* unconstrained */ + private IHistogram1D unconMass; + private final String unconstrainedV0CandidatesColName = "UnconstrainedV0Candidates"; + private IHistogram1D unconVx; + private IHistogram1D unconVy; + private IHistogram1D unconVz; + private IHistogram2D unconVzVsChi2; + private IHistogram1D v0Dt; + private double v0ESumMinCut, v0MaxPCut, v0ESumMaxCut, molPSumMin, molPSumMax, beambeamCut; + + private IHistogram1D v0Time; + private IHistogram2D VtxXVsVtxPx; + + private IHistogram2D VtxXVsVtxY; + private IHistogram2D VtxXVsVtxZ; + + private IHistogram2D VtxYVsVtxPy; + + private IHistogram2D VtxYVsVtxZ; + + private IHistogram2D VtxZVsL1Iso; + + private IHistogram2D VtxZVsMass; + private IHistogram2D VtxZVsTrkChi2; + + private IHistogram2D VtxZVsVtxPx; + + private IHistogram2D VtxZVsVtxPy; + + private IHistogram2D VtxZVsVtxPz; + + /** + * Calculate the averages here and fill the map + */ + @Override + public void calculateEndOfRunQuantities() { + + final IAnalysisFactory analysisFactory = IAnalysisFactory.create(); + final IFitFactory fitFactory = analysisFactory.createFitFactory(); + final IFitter fitter = fitFactory.createFitter("chi2"); + final double[] init = {50.0, 0.0, 0.2, 1.0, 0.0}; + final IFitResult resVx = this.fitVertexPosition(bsconVx, fitter, init, "range=\"(-0.5,0.5)\""); + final double[] init2 = {50.0, 0.0, 0.04, 1.0, 0.0}; + final IFitResult resVy = this.fitVertexPosition(bsconVy, fitter, init2, "range=\"(-0.2,0.2)\""); + final double[] init3 = {50.0, 0.0, 3.0, 1.0, 0.0}; + final IFitResult resVz = this.fitVertexPosition(bsconVz, fitter, init3, "range=\"(-6,6)\""); + + if (resVx != null && resVy != null & resVz != null) { + final double[] parsVx = resVx.fittedParameters(); + final double[] parsVy = resVy.fittedParameters(); + final double[] parsVz = resVz.fittedParameters(); + + for (int i = 0; i < 5; i++) { + LOGGER.info("Vertex Fit Parameters: " + resVx.fittedParameterNames()[i] + " = " + parsVx[i] + "; " + + parsVy[i] + "; " + parsVz[i]); + } + + final IPlotter plotter = analysisFactory.createPlotterFactory().create("Vertex Position"); + plotter.createRegions(1, 3); + final IPlotterStyle pstyle = plotter.style(); + pstyle.legendBoxStyle().setVisible(false); + pstyle.dataStyle().fillStyle().setColor("green"); + pstyle.dataStyle().lineStyle().setColor("black"); + plotter.region(0).plot(bsconVx); + plotter.region(0).plot(resVx.fittedFunction()); + plotter.region(1).plot(bsconVy); + plotter.region(1).plot(resVy.fittedFunction()); + plotter.region(2).plot(bsconVz); + plotter.region(2).plot(resVz.fittedFunction()); + if (outputPlots) { + try { + plotter.writeToFile(outputPlotDir + "vertex.png"); + } catch (final IOException ex) { + Logger.getLogger(V0Monitoring.class.getName()).log(Level.SEVERE, null, ex); + } + } + + // monitoredQuantityMap.put(fpQuantNames[2], sumVx / nTotV0); + // monitoredQuantityMap.put(fpQuantNames[3], sumVy / nTotV0); + // monitoredQuantityMap.put(fpQuantNames[4], sumVz / nTotV0); + monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[2], parsVx[1]); + monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[3], parsVy[1]); + monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[4], parsVz[1]); + monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[5], parsVx[2]); + monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[6], parsVy[2]); + monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[7], parsVz[2]); + } + monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[0], + (double) nTotV0 / nRecoEvents); + monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[1], sumMass + / nTotV0); + monitoredQuantityMap.put(beamConV0CandidatesColName + " " + triggerType + " " + fpQuantNames[8], sumChi2 + / nTotV0); + + } + + @Override + protected void detectorChanged(final Detector detector) { + + final BeamEnergyCollection beamEnergyCollection = this.getConditionsManager() + .getCachedConditions(BeamEnergyCollection.class, "beam_energies").getCachedData(); + final double beamEnergy = beamEnergyCollection.get(0).getBeamEnergy(); + v0ESumMinCut = 0.8 * beamEnergy; + v0ESumMaxCut = 1.25 * beamEnergy; + + v0MaxPCut = 1.05 * beamEnergy;// GeV + molPSumMin = 0.80 * beamEnergy; + molPSumMax = 1.25 * beamEnergy; + beambeamCut = 0.80 * beamEnergy; + + beamAxisRotation.setActiveEuler(Math.PI / 2, -0.0305, -Math.PI / 2); + + // LOGGER.info("Setting up the plotter"); + aida.tree().cd("/"); + final String xtra = "Extras"; + String trkType = "SeedTrack/"; + if (isGBL) { + trkType = "GBLTrack/"; + } + + final double maxMass = .2 * beamEnergy; + final double maxMassMoller = .1 * Math.sqrt(beamEnergy); + /* V0 Quantities */ + /* Mass, vertex, chi^2 of fit */ + /* unconstrained */ + unconMass = aida.histogram1D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + + "Invariant Mass (GeV)", 100, 0, maxMass); + unconVx = aida.histogram1D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + + "Vx (mm)", 50, -10, 10); + unconVy = aida.histogram1D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + + "Vy (mm)", 50, -10, 10); + unconVz = aida.histogram1D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + + "Vz (mm)", 50, -50, 50); + unconChi2 = aida.histogram1D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + + "Chi2", 25, 0, 25); + unconVzVsChi2 = aida.histogram2D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + + "Vz vs. Chi2", 25, 0, 25, 50, -50, 50); + unconChi2VsTrkChi2 = aida.histogram2D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + + "/" + "Chi2 vs. total track chi2", 50, 0, 50, 50, 0, 25); + /* beamspot constrained */ + bsconMass = aida.histogram1D(plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + + "Mass (GeV)", 100, 0, maxMass); + bsconVx = aida.histogram1D( + plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + "Vx (mm)", 50, -10, 10); + bsconVy = aida.histogram1D( + plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + "Vy (mm)", 50, -10, 10); + bsconVz = aida.histogram1D( + plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + "Vz (mm)", 50, -50, 50); + bsconChi2 = aida.histogram1D(plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + "Chi2", + 25, 0, 25); + bsconVzVsChi2 = aida.histogram2D(plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + + "Vz vs. Chi2", 25, 0, 25, 50, -50, 50); + bsconChi2VsTrkChi2 = aida.histogram2D(plotDir + trkType + triggerType + "/" + beamConV0CandidatesColName + "/" + + "Chi2 vs. total track chi2", 50, 0, 50, 50, 0, 25); + /* target constrained */ + tarconMass = aida.histogram1D(plotDir + trkType + triggerType + "/" + targetV0ConCandidatesColName + "/" + + "Mass (GeV)", 100, 0, maxMass); + tarconVx = aida.histogram1D(plotDir + trkType + triggerType + "/" + targetV0ConCandidatesColName + "/" + + "Vx (mm)", 50, -1, 1); + tarconVy = aida.histogram1D(plotDir + trkType + triggerType + "/" + targetV0ConCandidatesColName + "/" + + "Vy (mm)", 50, -1, 1); + tarconVz = aida.histogram1D(plotDir + trkType + triggerType + "/" + targetV0ConCandidatesColName + "/" + + "Vz (mm)", 50, -10, 10); + tarconChi2 = aida.histogram1D(plotDir + trkType + triggerType + "/" + targetV0ConCandidatesColName + "/" + + "Chi2", 25, 0, 25); + tarconVzVsChi2 = aida.histogram2D(plotDir + trkType + triggerType + "/" + targetV0ConCandidatesColName + "/" + + "Vz vs. Chi2", 25, 0, 25, 50, -50, 50); + tarconChi2VsTrkChi2 = aida.histogram2D(plotDir + trkType + triggerType + "/" + targetV0ConCandidatesColName + + "/" + "Chi2 vs. total track chi2", 50, 0, 50, 50, 0, 25); + + nV0 = aida + .histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Number of V0 per event", 10, 0, 10); + v0Time = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "V0 mean time", 100, -25, 25); + v0Dt = aida + .histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "V0 time difference", 100, -25, 25); + trigTimeV0Time = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "Trigger phase vs. V0 mean time", 100, -25, 25, 6, 0, 24); + trigTime = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Trigger phase", 6, 0, 24); + + pEleVspPos = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "P(e) vs P(p)", 50, 0, + beamEnergy * maxFactor, 50, 0, beamEnergy * maxFactor); + + pEle = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "P(e)", 50, 0, beamEnergy + * maxFactor); + pPos = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "P(p)", 50, 0, beamEnergy + * maxFactor); + + pEleVspPosWithCut = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "P(e) vs P(p): Radiative", 50, 0, beamEnergy * maxFactor, 50, 0, beamEnergy * maxFactor); + pyEleVspyPos = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Py(e) vs Py(p)", 50, + -0.04 * beamEnergy, 0.04 * beamEnergy, 50, -0.04 * beamEnergy, 0.04 * beamEnergy); + pxEleVspxPos = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Px(e) vs Px(p)", 50, + -0.04 * beamEnergy, 0.04 * beamEnergy, 50, -0.04 * beamEnergy, 0.04 * beamEnergy); + VtxZVsMass = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vz vs Mass", 50, 0, + maxMass, 50, -50, 80); + VtxXVsVtxZ = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vx vs Vz", 100, -10, 10, + 100, -50, 80); + VtxYVsVtxZ = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vy vs Vz", 100, -5, 5, 100, + -50, 80); + VtxXVsVtxY = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vx vs Vy", 100, -10, 10, + 100, -5, 5); + VtxXVsVtxPx = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vx vs Px", 100, -0.1, 0.1, + 100, -10, 10); + VtxYVsVtxPy = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vy vs Py", 100, -0.1, 0.1, + 100, -5, 5); + VtxZVsVtxPx = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vz vs Px", 100, -0.1, 0.1, + 100, -50, 80); + VtxZVsVtxPy = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vz vs Py", 100, -0.1, 0.1, + 100, -50, 80); + VtxZVsVtxPz = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vz vs Pz", 100, 0.0, + beamEnergy * maxFactor, 100, -50, 80); + VtxZVsL1Iso = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vz vs L1 Isolation", 100, + 0.0, 5.0, 50, -50, 80); + VtxZVsTrkChi2 = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "Vz vs Track Chi2", 50, + 0, 50, 50, -50, 80); + phiEleVsphiEle = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "2 Electron/phi(e) vs phi(e)", 50, -Math.PI, Math.PI, 50, -Math.PI, Math.PI); + pyEleVspyEle = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "2 Electron/Py(e) vs Py(e)", 50, -0.04 * beamEnergy, 0.04 * beamEnergy, 50, -0.04 * beamEnergy, + 0.04 * beamEnergy); + pxEleVspxEle = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "2 Electron/Px(e) vs Px(e)", 50, -0.02 * beamEnergy, 0.06 * beamEnergy, 50, -0.02 * beamEnergy, + 0.06 * beamEnergy); + + // electron vs electron momentum with different cuts + // 1) no cut + // 2) cut out FEE + // 3) cut out FEE and also cut on momentum sum + // 4) cut out everything except FEE coincidentals + pEleVspEle = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/P(e) vs P(e)", + 50, 0, beamEnergy * maxFactor, 50, 0, beamEnergy * maxFactor); + pEleVspEleNoBeam = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "2 Electron/P(e) vs P(e) NoBeam", 50, 0, beambeamCut, 50, 0, beambeamCut); + pEleVspEleMoller = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "2 Electron/P(e) vs P(e) Moller", 50, 0, beambeamCut, 50, 0, beambeamCut); + pEleVspEleBeamBeam = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "2 Electron/P(e) vs P(e) BeamBeam", 50, beambeamCut, beamEnergy * maxFactor, 50, beambeamCut, + beamEnergy * maxFactor); + + pyEleVspyEleNoBeam = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "2 Electron/Py(e) vs Py(e) NoBeam", 50, -0.04 * beamEnergy, 0.04 * beamEnergy, 50, + -0.04 * beamEnergy, 0.04 * beamEnergy); + pxEleVspxEleNoBeam = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "2 Electron/Px(e) vs Px(e) NoBeam", 50, -0.02 * beamEnergy, 0.06 * beamEnergy, 50, + -0.02 * beamEnergy, 0.06 * beamEnergy); + sumChargeHisto = aida.histogram1D( + plotDir + trkType + triggerType + "/" + xtra + "/" + "Total Charge of Event", 5, -2, 3); + numChargeHisto = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "Number of Charged Particles", 6, 0, 6); + + pEleVsthetaMoller = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "2 Electron/P(e) vs Theta Moller", 50, 0, beambeamCut, 50, thetaMin, thetaMax); + thetaEleVsthetaMoller = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "2 Electron/Theta vs Theta Moller", 50, thetaMin, thetaMax, 50, thetaMin, thetaMax); + pEleVsthetaBeamBeam = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "2 Electron/P(e) vs Theta BeamBeam", 50, beambeamCut, beamEnergy * maxFactor, 50, thetaMin, thetaMax); + thetaEleVsthetaBeamBeam = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "2 Electron/Theta vs Theta BeamBeam", 50, thetaMin, thetaMax, 50, thetaMin, thetaMax); + + mollerMass = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "2 Electron/Moller Mass (GeV)", 100, 0, maxMassMoller); + mollerMassVtxCut = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "2 Electron/Moller Mass (GeV): VtxCut", 100, 0, maxMassMoller); + mollerVx = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Vx (mm)", + 50, -10, 10); + mollerVy = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Vy (mm)", + 50, -2, 2); + mollerVz = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Moller Vz (mm)", + 50, -50, 50); + mollerVzVtxCut = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "2 Electron/Moller Vz (mm): VtxCut", 50, -50, 50); + mollerXVsVtxZ = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "2 Electron/Moller Vx vs Vz", 100, -5, 5, 100, -50, 50); + mollerYVsVtxZ = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "2 Electron/Moller Vy vs Vz", 100, -2, 2, 100, -50, 50); + mollerXVsVtxY = aida.histogram2D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "2 Electron/Moller Vx vs Vy", 100, -5, 5, 100, -2, 2); + + mollerUx = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "2 Electron/Moller Pair Momentum Direction Ux", 100, .015, .045); + mollerUy = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + + "2 Electron/Moller Pair Momentum Direction Uy", 100, -.01, .01); + + mollerHiP = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/P(high)", 100, 0, + beamEnergy * maxFactor); + mollerLoP = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/P(low)", 100, 0, + beamEnergy * maxFactor); + + mollerEitherP = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/P(either)", + 100, 0, beamEnergy * maxFactor); + mollerPsum = aida.histogram1D(plotDir + trkType + triggerType + "/" + xtra + "/" + "2 Electron/Psum", 100, 0, + beamEnergy * maxFactor); + + } + + private BilliorVertex fitVertex(final BilliorTrack electron, final BilliorTrack positron, final double bField) { + // Create a vertex fitter from the magnetic field. + final double[] beamSize = {0.001, 0.2, 0.02}; + final BilliorVertexer vtxFitter = new BilliorVertexer(bField); + // TODO: The beam size should come from the conditions database. + vtxFitter.setBeamSize(beamSize); + + // Perform the vertexing based on the specified constraint. + vtxFitter.doBeamSpotConstraint(false); + + // Add the electron and positron tracks to a track list for + // the vertex fitter. + final List<BilliorTrack> billiorTracks = new ArrayList<BilliorTrack>(); + + billiorTracks.add(electron); + + billiorTracks.add(positron); + + // Find and return a vertex based on the tracks. + return vtxFitter.fitVertex(billiorTracks); + } + + IFitResult fitVertexPosition(final IHistogram1D h1d, final IFitter fitter, final double[] init, final String range) { + IFitResult ifr = null; + try { + ifr = fitter.fit(h1d, "g+p1", init, range); + } catch (final RuntimeException ex) { + LOGGER.info(this.getClass().getSimpleName() + ": caught exception in fitGaussian"); + } + return ifr; + } + + @Override + public void printDQMData() { + LOGGER.info("V0Monitoring::printDQMData"); + for (final Entry<String, Double> entry : monitoredQuantityMap.entrySet()) { + LOGGER.info(entry.getKey() + " = " + entry.getValue()); + } + LOGGER.info("*******************************"); + } + + @Override + public void printDQMStrings() { + for (int i = 0; i < 9; i++) { + LOGGER.info("ALTER TABLE dqm ADD " + fpQuantNames[i] + " double;"); + } + } + + @Override + public void process(final EventHeader event) { + /* make sure everything is there */ + if (!event.hasCollection(ReconstructedParticle.class, finalStateParticlesColName)) { + return; + } + if (!event.hasCollection(ReconstructedParticle.class, unconstrainedV0CandidatesColName)) { + return; + } + if (!event.hasCollection(ReconstructedParticle.class, beamConV0CandidatesColName)) { + return; + } + if (!event.hasCollection(ReconstructedParticle.class, targetV0ConCandidatesColName)) { + return; + } + + // check to see if this event is from the correct trigger (or "all"); + if (!this.matchTrigger(event)) { + return; + } + + nRecoEvents++; + + final RelationalTable<?, ?> hitToStrips = TrackUtils.getHitToStripsTable(event); + final RelationalTable<?, ?> hitToRotated = TrackUtils.getHitToRotatedTable(event); + + final List<ReconstructedParticle> unonstrainedV0List = event.get(ReconstructedParticle.class, + unconstrainedV0CandidatesColName); + for (final ReconstructedParticle uncV0 : unonstrainedV0List) { + if (isGBL != TrackType.isGBL(uncV0.getType())) { + continue; + } + final Vertex uncVert = uncV0.getStartVertex(); + final Hep3Vector pVtxRot = VecOp.mult(beamAxisRotation, uncV0.getMomentum()); + final Hep3Vector vtxPosRot = VecOp.mult(beamAxisRotation, uncVert.getPosition()); + final double theta = Math.acos(pVtxRot.z() / pVtxRot.magnitude()); + final double phi = Math.atan2(pVtxRot.y(), pVtxRot.x()); + unconVx.fill(vtxPosRot.x()); + unconVy.fill(vtxPosRot.y()); + unconVz.fill(vtxPosRot.z()); + unconMass.fill(uncV0.getMass()); + unconChi2.fill(uncVert.getChi2()); + unconVzVsChi2.fill(uncVert.getChi2(), vtxPosRot.z()); + unconChi2VsTrkChi2.fill( + Math.max(uncV0.getParticles().get(0).getTracks().get(0).getChi2(), uncV0.getParticles().get(1) + .getTracks().get(0).getChi2()), uncVert.getChi2()); + + VtxZVsMass.fill(uncV0.getMass(), vtxPosRot.z()); + VtxXVsVtxZ.fill(vtxPosRot.x(), vtxPosRot.z()); + VtxYVsVtxZ.fill(vtxPosRot.y(), vtxPosRot.z()); + VtxXVsVtxY.fill(vtxPosRot.x(), vtxPosRot.y()); + VtxXVsVtxPx.fill(pVtxRot.x(), vtxPosRot.x()); + VtxYVsVtxPy.fill(pVtxRot.y(), vtxPosRot.y()); + VtxZVsVtxPx.fill(pVtxRot.x(), vtxPosRot.z()); + VtxZVsVtxPy.fill(pVtxRot.y(), vtxPosRot.z()); + VtxZVsVtxPz.fill(pVtxRot.z(), vtxPosRot.z()); + + // this always has 2 tracks. + final List<ReconstructedParticle> trks = uncV0.getParticles(); + // Track ele = trks.get(0).getTracks().get(0); + // Track pos = trks.get(1).getTracks().get(0); + // //if track #0 has charge>0 it's the electron! This seems mixed up, but remember the track + // //charge is assigned assuming a positive B-field, while ours is negative + // if (trks.get(0).getCharge() > 0) { + // pos = trks.get(0).getTracks().get(0); + // ele = trks.get(1).getTracks().get(0); + // } + // aida.histogram2D(plotDir + trkType + triggerType + "/" + "P(e) vs P(p)").fill(getMomentum(ele), + // getMomentum(pos)); + // aida.histogram2D(plotDir + trkType + triggerType + "/" + + // "Px(e) vs Px(p)").fill(ele.getTrackStates().get(0).getMomentum()[1], + // pos.getTrackStates().get(0).getMomentum()[1]); + // aida.histogram2D(plotDir + trkType + triggerType + "/" + + // "Py(e) vs Py(p)").fill(ele.getTrackStates().get(0).getMomentum()[2], + // pos.getTrackStates().get(0).getMomentum()[2]); + ReconstructedParticle ele = trks.get(0); + ReconstructedParticle pos = trks.get(1); + // ReconParticles have the charge correct. + if (trks.get(0).getCharge() > 0) { + pos = trks.get(0); + ele = trks.get(1); + } + if (ele.getCharge() < 0 && pos.getCharge() > 0) { + VtxZVsTrkChi2.fill( + Math.max(uncV0.getParticles().get(0).getTracks().get(0).getChi2(), uncV0.getParticles().get(1) + .getTracks().get(0).getChi2()), uncVert.getPosition().z()); + + final Double[] eleIso = TrackUtils.getIsolations(ele.getTracks().get(0), hitToStrips, hitToRotated); + final Double[] posIso = TrackUtils.getIsolations(pos.getTracks().get(0), hitToStrips, hitToRotated); + if (eleIso[0] != null && posIso[0] != null) { + final double eleL1Iso = Math.min(Math.abs(eleIso[0]), Math.abs(eleIso[1])); + final double posL1Iso = Math.min(Math.abs(posIso[0]), Math.abs(posIso[1])); + final double minL1Iso = Math.min(eleL1Iso, posL1Iso); + VtxZVsL1Iso.fill(minL1Iso, uncVert.getPosition().z()); + } + + final double pe = ele.getMomentum().magnitude(); + final double pp = pos.getMomentum().magnitude(); + final Hep3Vector pEleRot = VecOp.mult(beamAxisRotation, ele.getMomentum()); + final Hep3Vector pPosRot = VecOp.mult(beamAxisRotation, pos.getMomentum()); + + pEleVspPos.fill(pe, pp); + pEle.fill(pe); + pPos.fill(pp); + + pxEleVspxPos.fill(pEleRot.x(), pPosRot.x()); + pyEleVspyPos.fill(pEleRot.y(), pPosRot.y()); + if (pe < v0MaxPCut && pp < v0MaxPCut && pe + pp > v0ESumMinCut && pe + pp < v0ESumMaxCut) { + pEleVspPosWithCut.fill(pe, pp); + } + } + + final double eleT = TrackUtils.getTrackTime(ele.getTracks().get(0), hitToStrips, hitToRotated); + final double posT = TrackUtils.getTrackTime(pos.getTracks().get(0), hitToStrips, hitToRotated); + final double meanT = (eleT + posT) / 2.0; + v0Time.fill(meanT); + v0Dt.fill(eleT - posT); + trigTimeV0Time.fill(meanT, event.getTimeStamp() % 24); + trigTime.fill(event.getTimeStamp() % 24); + } + + final List<ReconstructedParticle> beamConstrainedV0List = event.get(ReconstructedParticle.class, + beamConV0CandidatesColName); + nV0.fill(beamConstrainedV0List.size()); + for (final ReconstructedParticle bsV0 : beamConstrainedV0List) { + + if (isGBL != TrackType.isGBL(bsV0.getType())) { + continue; + } + nTotV0++; + final Vertex bsVert = bsV0.getStartVertex(); + final Hep3Vector vtxPosRot = VecOp.mult(beamAxisRotation, bsVert.getPosition()); + bsconVx.fill(vtxPosRot.x()); + bsconVy.fill(vtxPosRot.y()); + bsconVz.fill(vtxPosRot.z()); + bsconMass.fill(bsV0.getMass()); + bsconChi2.fill(bsVert.getChi2()); + bsconVzVsChi2.fill(bsVert.getChi2(), vtxPosRot.z()); + bsconChi2VsTrkChi2.fill( + Math.max(bsV0.getParticles().get(0).getTracks().get(0).getChi2(), bsV0.getParticles().get(1) + .getTracks().get(0).getChi2()), bsVert.getChi2()); + sumMass += bsV0.getMass(); + sumVx += vtxPosRot.x(); + sumVy += vtxPosRot.y(); + sumVz += vtxPosRot.z(); + sumChi2 += bsVert.getChi2(); + } + + final List<ReconstructedParticle> targetConstrainedV0List = event.get(ReconstructedParticle.class, + targetV0ConCandidatesColName); + for (final ReconstructedParticle tarV0 : targetConstrainedV0List) { + + if (isGBL != TrackType.isGBL(tarV0.getType())) { + continue; + } + + final Vertex tarVert = tarV0.getStartVertex(); + final Hep3Vector vtxPosRot = VecOp.mult(beamAxisRotation, tarVert.getPosition()); + tarconVx.fill(vtxPosRot.x()); + tarconVy.fill(vtxPosRot.y()); + tarconVz.fill(vtxPosRot.z()); + tarconMass.fill(tarV0.getMass()); + tarconChi2.fill(tarVert.getChi2()); + tarconVzVsChi2.fill(tarVert.getChi2(), vtxPosRot.z()); + tarconChi2VsTrkChi2.fill( + Math.max(tarV0.getParticles().get(0).getTracks().get(0).getChi2(), tarV0.getParticles().get(1) + .getTracks().get(0).getChi2()), tarVert.getChi2()); + } + final List<ReconstructedParticle> finalStateParticles = event.get(ReconstructedParticle.class, + finalStateParticlesColName); + if (debug) { + LOGGER.info("This events has " + finalStateParticles.size() + " final state particles"); + } + + ReconstructedParticle ele1 = null; + ReconstructedParticle ele2 = null; + int sumCharge = 0; + int numChargedParticles = 0; + for (final ReconstructedParticle fsPart : finalStateParticles) { + if (isGBL != TrackType.isGBL(fsPart.getType())) { + continue; + } + if (debug) { + LOGGER.info("PDGID = " + fsPart.getParticleIDUsed() + "; charge = " + fsPart.getCharge() + "; pz = " + + fsPart.getMomentum().x()); + } + final double charge = fsPart.getCharge(); + sumCharge += charge; + if (charge != 0) { + numChargedParticles++; + if (charge < 1) { + if (ele1 == null) { + ele1 = fsPart; + } else if (!hasSharedStrips(ele1, fsPart, hitToStrips, hitToRotated)) { + ele2 = fsPart; + } + } + } + } + sumChargeHisto.fill(sumCharge); + numChargeHisto.fill(numChargedParticles); + + if (ele1 != null && ele2 != null) { + final Hep3Vector p1 = VecOp.mult(beamAxisRotation, ele1.getMomentum()); + final Hep3Vector p2 = VecOp.mult(beamAxisRotation, ele2.getMomentum()); + // Hep3Vector beamAxis = new BasicHep3Vector(Math.sin(0.0305), 0, Math.cos(0.0305)); + // LOGGER.info(p1); + // LOGGER.info(VecOp.mult(rot, p1)); + + final double theta1 = Math.acos(p1.z() / p1.magnitude()); + final double theta2 = Math.acos(p2.z() / p2.magnitude()); + final double phi1 = Math.atan2(p1.y(), p1.x()); + final double phi2 = Math.atan2(p2.y(), p2.x()); + phiEleVsphiEle.fill(phi1, phi2); + pEleVspEle.fill(ele1.getMomentum().magnitude(), ele2.getMomentum().magnitude()); + pyEleVspyEle.fill(ele1.getMomentum().y(), ele2.getMomentum().y()); + pxEleVspxEle.fill(ele1.getMomentum().x(), ele2.getMomentum().x()); + // remove beam electrons + if (ele1.getMomentum().magnitude() < beambeamCut && ele2.getMomentum().magnitude() < beambeamCut) { + pEleVspEleNoBeam.fill(ele1.getMomentum().magnitude(), ele2.getMomentum().magnitude()); + pyEleVspyEleNoBeam.fill(ele1.getMomentum().y(), ele2.getMomentum().y()); + pxEleVspxEleNoBeam.fill(ele1.getMomentum().x(), ele2.getMomentum().x()); + } + // look at beam-beam events + if (ele1.getMomentum().magnitude() > beambeamCut && ele2.getMomentum().magnitude() > beambeamCut) { + pEleVspEleBeamBeam.fill(ele1.getMomentum().magnitude(), ele2.getMomentum().magnitude()); + pEleVsthetaBeamBeam.fill(p1.magnitude(), theta1); + pEleVsthetaBeamBeam.fill(p2.magnitude(), theta2); + thetaEleVsthetaBeamBeam.fill(theta1, theta2); + } + + // look at "Moller" events (if that's what they really are + if (ele1.getMomentum().magnitude() + ele2.getMomentum().magnitude() > molPSumMin + && ele1.getMomentum().magnitude() + ele2.getMomentum().magnitude() < molPSumMax + && p1.magnitude() < beambeamCut && p2.magnitude() < beambeamCut) { + + final Track ele1trk = ele1.getTracks().get(0); + final Track ele2trk = ele2.getTracks().get(0); + final SeedTrack stEle1 = TrackUtils.makeSeedTrackFromBaseTrack(ele1trk); + final SeedTrack stEle2 = TrackUtils.makeSeedTrackFromBaseTrack(ele2trk); + final BilliorTrack btEle1 = new BilliorTrack(stEle1.getSeedCandidate().getHelix()); + final BilliorTrack btEle2 = new BilliorTrack(stEle2.getSeedCandidate().getHelix()); + final BilliorVertex bv = this.fitVertex(btEle1, btEle2, TrackUtils.getBField(event.getDetector()) + .magnitude()); + // LOGGER.info("ee vertex: "+bv.toString()); + final double invMass = bv.getParameters().get("invMass"); + mollerMass.fill(invMass); + mollerVx.fill(bv.getPosition().x()); + mollerVy.fill(bv.getPosition().y()); + mollerVz.fill(bv.getPosition().z()); + mollerXVsVtxZ.fill(bv.getPosition().x(), bv.getPosition().z()); + mollerYVsVtxZ.fill(bv.getPosition().y(), bv.getPosition().z()); + mollerXVsVtxY.fill(bv.getPosition().x(), bv.getPosition().y()); + + final double ux = (ele1.getMomentum().x() + ele2.getMomentum().x()) + / (ele1.getMomentum().z() + ele2.getMomentum().z()); + final double uy = (ele1.getMomentum().y() + ele2.getMomentum().y()) + / (ele1.getMomentum().z() + ele2.getMomentum().z()); + mollerUx.fill(ux); + mollerUy.fill(uy); + + // higher and lower energy electrons in moller pair + final double pt1 = ele1.getMomentum().magnitude(); + final double pt2 = ele2.getMomentum().magnitude(); + final double ph = pt1 > pt2 ? pt1 : pt2; + final double pl = pt1 > pt2 ? pt2 : pt1; + + mollerHiP.fill(ph); + mollerLoP.fill(pl); + + mollerEitherP.fill(ph); + mollerEitherP.fill(pl); + mollerPsum.fill(pt1 + pt2); + + if (Math.abs(bv.getPosition().x()) < 2 && Math.abs(bv.getPosition().y()) < 0.5) { + mollerMassVtxCut.fill(invMass); + mollerVzVtxCut.fill(bv.getPosition().z()); + } + pEleVspEleMoller.fill(p1.magnitude(), p2.magnitude()); + pEleVsthetaMoller.fill(p1.magnitude(), theta1); + pEleVsthetaMoller.fill(p2.magnitude(), theta2); + thetaEleVsthetaMoller.fill(theta1, theta2); + } + } + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/ecal/EcalCellIDPrintDriver.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/ecal/EcalCellIDPrintDriver.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/ecal/EcalCellIDPrintDriver.java Wed Mar 9 11:43:24 2016 @@ -19,63 +19,63 @@ */ public class EcalCellIDPrintDriver extends Driver { - Subdetector ecal; - IDDecoder dec; - String ecalName = "Ecal"; - String ecalCollectionName = "EcalReadoutHits"; - String outputFileName; - PrintWriter outputStream = null; + Subdetector ecal; + IDDecoder dec; + String ecalName = "Ecal"; + String ecalCollectionName = "EcalReadoutHits"; + String outputFileName; + PrintWriter outputStream = null; - public EcalCellIDPrintDriver() { - } + public EcalCellIDPrintDriver() { + } - public void setEcalCollectionName(String ecalCollectionName) { - this.ecalCollectionName = ecalCollectionName; - } + public void setEcalCollectionName(String ecalCollectionName) { + this.ecalCollectionName = ecalCollectionName; + } - public void setEcalName(String ecalName) { - this.ecalName = ecalName; - } + public void setEcalName(String ecalName) { + this.ecalName = ecalName; + } - public void setOutputFileName(String outputFileName) { - this.outputFileName = outputFileName; - } + public void setOutputFileName(String outputFileName) { + this.outputFileName = outputFileName; + } - public void startOfData() { - if (outputFileName != null) { - try { - outputStream = new PrintWriter(outputFileName); - } catch (IOException ex) { - throw new RuntimeException("Invalid outputFilePath!"); - } - } else { - outputStream = new PrintWriter(System.out, true); - } - } + public void startOfData() { + if (outputFileName != null) { + try { + outputStream = new PrintWriter(outputFileName); + } catch (IOException ex) { + throw new RuntimeException("Invalid outputFilePath!"); + } + } else { + outputStream = new PrintWriter(System.out, true); + } + } - public void detectorChanged(Detector detector) { - // Get the Subdetector. - ecal = (Subdetector) detector.getSubdetector(ecalName); - dec = ecal.getIDDecoder(); - } + public void detectorChanged(Detector detector) { + // Get the Subdetector. + ecal = (Subdetector) detector.getSubdetector(ecalName); + dec = ecal.getIDDecoder(); + } - public void process(EventHeader event) { - // Get the list of ECal hits. - if (event.hasCollection(RawCalorimeterHit.class, ecalCollectionName)) { - List<RawCalorimeterHit> hits = event.get(RawCalorimeterHit.class, ecalCollectionName); - //outputStream.println("Reading RawCalorimeterHit from event " + event.getEventNumber()); - for (RawCalorimeterHit hit : hits) { - dec.setID(hit.getCellID()); - outputStream.printf("x=%d\ty=%d\n", dec.getValue("ix"), dec.getValue("iy")); - } - } - if (event.hasCollection(RawTrackerHit.class, ecalCollectionName)) { - List<RawTrackerHit> hits = event.get(RawTrackerHit.class, ecalCollectionName); - //outputStream.println("Reading RawCalorimeterHit from event " + event.getEventNumber()); - for (RawTrackerHit hit : hits) { - dec.setID(hit.getCellID()); - outputStream.printf("x=%d\ty=%d\n", dec.getValue("ix"), dec.getValue("iy")); - } - } - } + public void process(EventHeader event) { + // Get the list of ECal hits. + if (event.hasCollection(RawCalorimeterHit.class, ecalCollectionName)) { + List<RawCalorimeterHit> hits = event.get(RawCalorimeterHit.class, ecalCollectionName); + //outputStream.println("Reading RawCalorimeterHit from event " + event.getEventNumber()); + for (RawCalorimeterHit hit : hits) { + dec.setID(hit.getCellID()); + outputStream.printf("x=%d\ty=%d\n", dec.getValue("ix"), dec.getValue("iy")); + } + } + if (event.hasCollection(RawTrackerHit.class, ecalCollectionName)) { + List<RawTrackerHit> hits = event.get(RawTrackerHit.class, ecalCollectionName); + //outputStream.println("Reading RawCalorimeterHit from event " + event.getEventNumber()); + for (RawTrackerHit hit : hits) { + dec.setID(hit.getCellID()); + outputStream.printf("x=%d\ty=%d\n", dec.getValue("ix"), dec.getValue("iy")); + } + } + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/ecal/EcalClusterPlots.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/ecal/EcalClusterPlots.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/ecal/EcalClusterPlots.java Wed Mar 9 11:43:24 2016 @@ -17,7 +17,7 @@ public class EcalClusterPlots extends Driver { - //AIDAFrame plotterFrame; + //AIDAFrame plotterFrame; String inputCollection = "EcalClusters"; AIDA aida = AIDA.defaultInstance(); IPlotter plotter, plotter2, plotter3, plotter4; @@ -47,7 +47,7 @@ @Override protected void detectorChanged(Detector detector) { - //plotterFrame = new AIDAFrame(); + //plotterFrame = new AIDAFrame(); //plotterFrame.setTitle("HPS ECal Cluster Plots"); // Setup the plotter. @@ -172,6 +172,6 @@ @Override public void endOfData() { - //plotterFrame.dispose(); + //plotterFrame.dispose(); } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/ecal/EcalHitPlots.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/ecal/EcalHitPlots.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/ecal/EcalHitPlots.java Wed Mar 9 11:43:24 2016 @@ -192,8 +192,8 @@ } else if (AbstractIntData.getTag(data) == SSPData.BANK_TAG) { //SSPData triggerData = new SSPData(data); // TODO: TOP, BOTTOM, AND, and OR trigger are test - // run-specific parameters and are not supported by - // SSPData. + // run-specific parameters and are not supported by + // SSPData. int orTrig = 0; //triggerData.getOrTrig(); if(orTrig != 0) { for (int i = 0; i < 32; i++) { @@ -237,7 +237,7 @@ double botTime = Double.POSITIVE_INFINITY; double orTime = Double.POSITIVE_INFINITY; for (CalorimeterHit hit : hits) { - /* + /* if (hit.getIdentifierFieldValue("iy") > 0) { topX.fill(hit.getIdentifierFieldValue("ix"),hit.getPosition()[0]); topY.fill(hit.getIdentifierFieldValue("iy"),hit.getPosition()[1]); Modified: java/trunk/analysis/src/main/java/org/hps/analysis/ecal/FEEClusterPlotter.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/ecal/FEEClusterPlotter.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/ecal/FEEClusterPlotter.java Wed Mar 9 11:43:24 2016 @@ -28,8 +28,8 @@ */ public class FEEClusterPlotter extends Driver { - - //private AIDAFrame plotterFrame; + + //private AIDAFrame plotterFrame; private AIDA aida = AIDA.defaultInstance(); IPlotter plotter; IAnalysisFactory fac = aida.analysisFactory(); @@ -53,7 +53,7 @@ aida.tree().cd("/"); for (EcalChannel cc : ecalConditions.getChannelCollection()) { //aida.histogram1D(getHistoName(cc),200,0.5,1.3); - aida.histogram1D(getHistoName(cc),200,0.9,2.8); + aida.histogram1D(getHistoName(cc),200,0.9,2.8); } } @@ -67,39 +67,39 @@ //only keep singles triggers: if (!event.hasCollection(GenericObject.class,"TriggerBank")) - throw new Driver.NextEventException(); + throw new Driver.NextEventException(); boolean isSingles=false; for (GenericObject gob : event.get(GenericObject.class,"TriggerBank")) - { - if (!(AbstractIntData.getTag(gob) == TIData.BANK_TAG)) continue; - TIData tid = new TIData(gob); - if (tid.isSingle0Trigger() || tid.isSingle1Trigger()) - { - isSingles=true; - break; - } + { + if (!(AbstractIntData.getTag(gob) == TIData.BANK_TAG)) continue; + TIData tid = new TIData(gob); + if (tid.isSingle0Trigger() || tid.isSingle1Trigger()) + { + isSingles=true; + break; + } } if (isSingles){ - List<Cluster> clusters = event.get(Cluster.class, inputCollection); - for (Cluster clus : clusters) { - List<CalorimeterHit> hits = clus.getCalorimeterHits(); - CalorimeterHit seed = hits.get(0); - - double seedE = seed.getCorrectedEnergy(); - double clusE = clus.getEnergy(); - double time = seed.getTime(); - - //if ((seedE/clusE > 0.6) && seedE >0.45 && time>30 && time <70){ - if ((seedE/clusE > 0.6) && seedE >0.65 && time>30 && time <70){ - - EcalChannel cc = findChannel(seed); - aida.histogram1D(getHistoName(cc)).fill(clusE); - } - } + List<Cluster> clusters = event.get(Cluster.class, inputCollection); + for (Cluster clus : clusters) { + List<CalorimeterHit> hits = clus.getCalorimeterHits(); + CalorimeterHit seed = hits.get(0); + + double seedE = seed.getCorrectedEnergy(); + double clusE = clus.getEnergy(); + double time = seed.getTime(); + + //if ((seedE/clusE > 0.6) && seedE >0.45 && time>30 && time <70){ + if ((seedE/clusE > 0.6) && seedE >0.65 && time>30 && time <70){ + + EcalChannel cc = findChannel(seed); + aida.histogram1D(getHistoName(cc)).fill(clusE); + } + } } } - + public void setOutputPlots(String output) { this.outputPlots = output; } @@ -121,5 +121,5 @@ Logger.getLogger(FEEClusterPlotter.class.getName()).log(Level.SEVERE, null, ex); } } - } + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/ecal/HPSEcalFADCPlotsDriver.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/ecal/HPSEcalFADCPlotsDriver.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/ecal/HPSEcalFADCPlotsDriver.java Wed Mar 9 11:43:24 2016 @@ -20,90 +20,90 @@ */ public class HPSEcalFADCPlotsDriver extends Driver { - String edepCollectionName = "EcalHits"; - String rawCollectionName = null; - String ecalCollectionName = null; - String clusterCollectionName = "EcalClusters"; - AIDA aida = AIDA.defaultInstance(); - IHistogram1D edepE; - IHistogram1D rawE; - IHistogram1D ecalE; - IHistogram1D clusterE; - ICloud2D window_E; - double edepThreshold = 0.05; + String edepCollectionName = "EcalHits"; + String rawCollectionName = null; + String ecalCollectionName = null; + String clusterCollectionName = "EcalClusters"; + AIDA aida = AIDA.defaultInstance(); + IHistogram1D edepE; + IHistogram1D rawE; + IHistogram1D ecalE; + IHistogram1D clusterE; + ICloud2D window_E; + double edepThreshold = 0.05; - public void setEdepThreshold(double edepThreshold) { - this.edepThreshold = edepThreshold; - } + public void setEdepThreshold(double edepThreshold) { + this.edepThreshold = edepThreshold; + } - public void setRawCollectionName(String rawCollectionName) { - this.rawCollectionName = rawCollectionName; - } + public void setRawCollectionName(String rawCollectionName) { + this.rawCollectionName = rawCollectionName; + } - public void setEcalCollectionName(String ecalCollectionName) { - this.ecalCollectionName = ecalCollectionName; - } + public void setEcalCollectionName(String ecalCollectionName) { + this.ecalCollectionName = ecalCollectionName; + } - public void setClusterCollectionName(String clusterCollectionName) { - this.clusterCollectionName = clusterCollectionName; - } + public void setClusterCollectionName(String clusterCollectionName) { + this.clusterCollectionName = clusterCollectionName; + } - public void startOfData() { - edepE = aida.histogram1D( - "FADC plots: " + edepCollectionName + " : Hits", - 500, 0.0, 5.0); - if (rawCollectionName != null) { - rawE = aida.histogram1D( - "FADC plots: " + rawCollectionName + " : Hits", - 500, 0.0, 500.0); - window_E = aida.cloud2D("FADC plots: " + rawCollectionName + " : Window vs. E"); - } - if (ecalCollectionName != null) { - ecalE = aida.histogram1D( - "FADC plots: " + ecalCollectionName + " : Hits", - 500, 0.0, 5.0); - } - clusterE = aida.histogram1D( - "FADC plots: " + clusterCollectionName + " : Clusters", - 500, 0.0, 5.0); - } + public void startOfData() { + edepE = aida.histogram1D( + "FADC plots: " + edepCollectionName + " : Hits", + 500, 0.0, 5.0); + if (rawCollectionName != null) { + rawE = aida.histogram1D( + "FADC plots: " + rawCollectionName + " : Hits", + 500, 0.0, 500.0); + window_E = aida.cloud2D("FADC plots: " + rawCollectionName + " : Window vs. E"); + } + if (ecalCollectionName != null) { + ecalE = aida.histogram1D( + "FADC plots: " + ecalCollectionName + " : Hits", + 500, 0.0, 5.0); + } + clusterE = aida.histogram1D( + "FADC plots: " + clusterCollectionName + " : Clusters", + 500, 0.0, 5.0); + } - public void process(EventHeader event) { - List<Cluster> clusters = event.get(Cluster.class, clusterCollectionName); - if (clusters == null) - throw new RuntimeException("Missing cluster collection!"); + public void process(EventHeader event) { + List<Cluster> clusters = event.get(Cluster.class, clusterCollectionName); + if (clusters == null) + throw new RuntimeException("Missing cluster collection!"); - List<CalorimeterHit> edepHits = event.get(CalorimeterHit.class, edepCollectionName); - if (edepHits == null) - throw new RuntimeException("Missing hit collection!"); + List<CalorimeterHit> edepHits = event.get(CalorimeterHit.class, edepCollectionName); + if (edepHits == null) + throw new RuntimeException("Missing hit collection!"); - if (rawCollectionName != null) { - List<RawCalorimeterHit> rawHits = event.get(RawCalorimeterHit.class, rawCollectionName); - if (rawHits == null) - throw new RuntimeException("Missing hit collection!"); + if (rawCollectionName != null) { + List<RawCalorimeterHit> rawHits = event.get(RawCalorimeterHit.class, rawCollectionName); + if (rawHits == null) + throw new RuntimeException("Missing hit collection!"); - for (RawCalorimeterHit hit : rawHits) { - rawE.fill(hit.getAmplitude()); - //window_E.fill(hit.getAmplitude(),hit.getWindowSize()); - } - } + for (RawCalorimeterHit hit : rawHits) { + rawE.fill(hit.getAmplitude()); + //window_E.fill(hit.getAmplitude(),hit.getWindowSize()); + } + } - if (ecalCollectionName != null) { - List<CalorimeterHit> ecalHits = event.get(CalorimeterHit.class, ecalCollectionName); - if (ecalHits == null) - throw new RuntimeException("Missing hit collection!"); + if (ecalCollectionName != null) { + List<CalorimeterHit> ecalHits = event.get(CalorimeterHit.class, ecalCollectionName); + if (ecalHits == null) + throw new RuntimeException("Missing hit collection!"); - for (CalorimeterHit hit : ecalHits) { - ecalE.fill(hit.getRawEnergy()); - } - } + for (CalorimeterHit hit : ecalHits) { + ecalE.fill(hit.getRawEnergy()); + } + } - for (CalorimeterHit hit : edepHits) { - if (hit.getRawEnergy() > edepThreshold) - edepE.fill(hit.getRawEnergy()); - } - for (Cluster cluster : clusters) { - clusterE.fill(cluster.getEnergy()); - } - } + for (CalorimeterHit hit : edepHits) { + if (hit.getRawEnergy() > edepThreshold) + edepE.fill(hit.getRawEnergy()); + } + for (Cluster cluster : clusters) { + clusterE.fill(cluster.getEnergy()); + } + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/ecal/HPSEcalTriggerPlotsDriver.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/ecal/HPSEcalTriggerPlotsDriver.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/ecal/HPSEcalTriggerPlotsDriver.java Wed Mar 9 11:43:24 2016 @@ -23,7 +23,7 @@ * Exp $ */ public class HPSEcalTriggerPlotsDriver extends Driver { - // LCSim collection names. + // LCSim collection names. String ecalCollectionName = "EcalHits"; String clusterCollectionName = "EcalClusters"; @@ -55,46 +55,46 @@ } public void startOfData() { - // Initialize a hit histogram for each declared energy. - for(int e = 0; e < energyCut.length; e++) { - hitXYPlot[e] = aida.histogram2D("Trigger Plots: " + ecalCollectionName + - " : Hits above " + energyCut[e] + " MeV", 46, -23, 23, 11, -5.5, 5.5); - } - // Initialize the remaining plots. + // Initialize a hit histogram for each declared energy. + for(int e = 0; e < energyCut.length; e++) { + hitXYPlot[e] = aida.histogram2D("Trigger Plots: " + ecalCollectionName + + " : Hits above " + energyCut[e] + " MeV", 46, -23, 23, 11, -5.5, 5.5); + } + // Initialize the remaining plots. crystalDeadTime = aida.histogram2D("Trigger Plots: " + ecalCollectionName + - " : Crystal dead time", 46, -23, 23, 11, -5.5, 5.5); + " : Crystal dead time", 46, -23, 23, 11, -5.5, 5.5); clusterHitXYPlot = aida.histogram2D("Trigger Plots: " + clusterCollectionName + - " : Crystals in clusters", 47, -23.5, 23.5, 11, -5.5, 5.5); + " : Crystals in clusters", 47, -23.5, 23.5, 11, -5.5, 5.5); seedHitXYPlot = aida.histogram2D("Trigger Plots: " + clusterCollectionName + - " : Seed hits", 47, -23.5, 23.5, 11, -5.5, 5.5); + " : Seed hits", 47, -23.5, 23.5, 11, -5.5, 5.5); triggerClusterHitXYPlot = aida.histogram2D("Trigger Plots: " + clusterCollectionName + " : Crystals in clusters, with trigger", 47, -23.5, 23.5, 11, -5.5, 5.5); triggerSeedHitXYPlot = aida.histogram2D("Trigger Plots: " + clusterCollectionName + - " : Seed hits, with trigger", 47, -23.5, 23.5, 11, -5.5, 5.5); + " : Seed hits, with trigger", 47, -23.5, 23.5, 11, -5.5, 5.5); } public void process(EventHeader event) { - // If the current event has the indicated hit collection, - // use it as the hit list. - List<CalorimeterHit> hits; - if(event.hasCollection(CalorimeterHit.class, ecalCollectionName)) { - hits = event.get(CalorimeterHit.class, ecalCollectionName); - } - // If it does not, then use an empty list to avoid crashing. - else { hits = new ArrayList<CalorimeterHit>(0); } - - // If the current event has the indicated cluster collection, - // use it as the cluster list. - List<Cluster> clusters; - if(event.hasCollection(Cluster.class, clusterCollectionName)) { - clusters = event.get(Cluster.class, clusterCollectionName); - } - // If it does not, then use an empty list to avoid crashing. - else { clusters = new ArrayList<Cluster>(0); } + // If the current event has the indicated hit collection, + // use it as the hit list. + List<CalorimeterHit> hits; + if(event.hasCollection(CalorimeterHit.class, ecalCollectionName)) { + hits = event.get(CalorimeterHit.class, ecalCollectionName); + } + // If it does not, then use an empty list to avoid crashing. + else { hits = new ArrayList<CalorimeterHit>(0); } + + // If the current event has the indicated cluster collection, + // use it as the cluster list. + List<Cluster> clusters; + if(event.hasCollection(Cluster.class, clusterCollectionName)) { + clusters = event.get(Cluster.class, clusterCollectionName); + } + // If it does not, then use an empty list to avoid crashing. + else { clusters = new ArrayList<Cluster>(0); } // Populate hit plots. for (CalorimeterHit hit : hits) { - // Get the hit crystal position. + // Get the hit crystal position. int ix = hit.getIdentifierFieldValue("ix"); int iy = hit.getIdentifierFieldValue("iy"); double energy = hit.getRawEnergy(); @@ -102,9 +102,9 @@ // Loop through the energy plots and fill them if the hit // is over the current energy threshold/ for(int e = 0; e < energyCut.length; e++) { - if(energy > energyCut[e] * EcalUtils.MeV) { - hitXYPlot[e].fill(ix - 0.5 * Math.signum(ix), iy); - } + if(energy > energyCut[e] * EcalUtils.MeV) { + hitXYPlot[e].fill(ix - 0.5 * Math.signum(ix), iy); + } } // Generate the dead time plot. @@ -121,8 +121,8 @@ // Populate cluster based plots. for (Cluster cluster : clusters) { - // Get the cluster's seed hit position. - CalorimeterHit seed = cluster.getCalorimeterHits().get(0); + // Get the cluster's seed hit position. + CalorimeterHit seed = cluster.getCalorimeterHits().get(0); int ix = seed.getIdentifierFieldValue("ix"); int iy = seed.getIdentifierFieldValue("iy"); @@ -135,7 +135,7 @@ // Populate the component hit histogram. for (CalorimeterHit hit : cluster.getCalorimeterHits()) { - // Get the component hit location. + // Get the component hit location. ix = hit.getIdentifierFieldValue("ix"); iy = hit.getIdentifierFieldValue("iy"); Modified: java/trunk/analysis/src/main/java/org/hps/analysis/ecal/HPSMCParticlePlotsDriver.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/ecal/HPSMCParticlePlotsDriver.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/ecal/HPSMCParticlePlotsDriver.java Wed Mar 9 11:43:24 2016 @@ -25,138 +25,138 @@ */ public class HPSMCParticlePlotsDriver extends Driver { - AIDA aida = AIDA.defaultInstance(); + AIDA aida = AIDA.defaultInstance(); //private AIDAFrame pFrame; IAnalysisFactory af = aida.analysisFactory(); public boolean _hideFrame = false; // MCParticle plots. - ICloud1D primaryEPlot; - ICloud1D fsCountPlot; - IHistogram1D fsCountVsEventPlot; - ICloud1D fsCountTypePlot; - ICloud1D fsCountEventTypePlot; - ICloud1D fsCountEventTypePlot2; - ICloud1D fsCountTypePlot500; - IHistogram1D fsEPlot; - IHistogram1D fsGammaEPlot; - IHistogram1D fsElectronEPlot; - IHistogram1D fsPositronEPlot; - IHistogram1D fsThetayPlot; - ICloud1D fsGammaThetaPlot; - IHistogram1D fsGammaThetayPlot; - IHistogram1D fsGammaThetayTrigPlot; - ICloud2D fsGammaThetayEPlot; - ICloud1D fsElectronThetaPlot; - IHistogram1D fsElectronThetayPlot; - IHistogram1D fsElectronThetayTrigPlot; - ICloud2D fsElectronThetayEPlot; - ICloud1D fsPositronThetaPlot; - IHistogram1D fsPositronThetayPlot; - IHistogram1D fsPositronThetayTrigPlot; - ICloud2D fsPositronThetayEPlot; + ICloud1D primaryEPlot; + ICloud1D fsCountPlot; + IHistogram1D fsCountVsEventPlot; + ICloud1D fsCountTypePlot; + ICloud1D fsCountEventTypePlot; + ICloud1D fsCountEventTypePlot2; + ICloud1D fsCountTypePlot500; + IHistogram1D fsEPlot; + IHistogram1D fsGammaEPlot; + IHistogram1D fsElectronEPlot; + IHistogram1D fsPositronEPlot; + IHistogram1D fsThetayPlot; + ICloud1D fsGammaThetaPlot; + IHistogram1D fsGammaThetayPlot; + IHistogram1D fsGammaThetayTrigPlot; + ICloud2D fsGammaThetayEPlot; + ICloud1D fsElectronThetaPlot; + IHistogram1D fsElectronThetayPlot; + IHistogram1D fsElectronThetayTrigPlot; + ICloud2D fsElectronThetayEPlot; + ICloud1D fsPositronThetaPlot; + IHistogram1D fsPositronThetayPlot; + IHistogram1D fsPositronThetayTrigPlot; + ICloud2D fsPositronThetayEPlot; ICloud1D eventEPlot; - class MCParticleEComparator implements Comparator<MCParticle> { - - public int compare(MCParticle p1, MCParticle p2) { - double e1 = p1.getEnergy(); - double e2 = p2.getEnergy(); - if (e1 < e2) { - return -1; - } else if (e1 == e2) { - return 0; - } else { - return 1; - } - } - } + class MCParticleEComparator implements Comparator<MCParticle> { + + public int compare(MCParticle p1, MCParticle p2) { + double e1 = p1.getEnergy(); + double e2 = p2.getEnergy(); + if (e1 < e2) { + return -1; + } else if (e1 == e2) { + return 0; + } else { + return 1; + } + } + } public void setHideFrame(boolean hideFrame) { this._hideFrame = hideFrame; } - @Override - public void startOfData() { - fsCountPlot = aida.cloud1D("MCParticle: Number of Final State Particles"); - fsCountPlot.annotation().addItem("xAxisLabel", "Number of FS Particles"); + @Override + public void startOfData() { + fsCountPlot = aida.cloud1D("MCParticle: Number of Final State Particles"); + fsCountPlot.annotation().addItem("xAxisLabel", "Number of FS Particles"); fsCountVsEventPlot = aida.histogram1D("MCParticle: Number of Final State Particles vs Event Nr", 501, -0.5, 500.5); - fsCountVsEventPlot.annotation().addItem("xAxisLabel", "Event Number"); + fsCountVsEventPlot.annotation().addItem("xAxisLabel", "Event Number"); fsCountTypePlot = aida.cloud1D("MCParticle: Number of Final State Particles Type"); - fsCountTypePlot.annotation().addItem("xAxisLabel", "Number of FS Particles of Type"); + fsCountTypePlot.annotation().addItem("xAxisLabel", "Number of FS Particles of Type"); fsCountTypePlot500 = aida.cloud1D("MCParticle: Number of Final State Particles Type E>0.5GeV"); - fsCountTypePlot500.annotation().addItem("xAxisLabel", "Number of FS Particles of Type E>0.5GeV"); + fsCountTypePlot500.annotation().addItem("xAxisLabel", "Number of FS Particles of Type E>0.5GeV"); fsCountEventTypePlot = aida.cloud1D("MCParticle: Number of Final State Types"); - fsCountEventTypePlot.annotation().addItem("xAxisLabel", "Number of FS Types"); + fsCountEventTypePlot.annotation().addItem("xAxisLabel", "Number of FS Types"); fsCountEventTypePlot2 = aida.cloud1D("MCParticle: Number of Final State Types Gamma E>500"); - fsCountEventTypePlot2.annotation().addItem("xAxisLabel", "Number of FS Types Gamma E>500"); - - fsEPlot = aida.histogram1D("MCParticle: FS Particle E",100,0,3); - fsEPlot.annotation().addItem("xAxisLabel", "Particle E [GeV]"); - - fsGammaEPlot = aida.histogram1D("MCParticle: FS Gamma E",100,0,3); - fsGammaEPlot.annotation().addItem("xAxisLabel", "Particle E [GeV]"); - - fsElectronEPlot = aida.histogram1D("MCParticle: FS Electron E",100,0,3); - fsElectronEPlot.annotation().addItem("xAxisLabel", "Particle E [GeV]"); - - fsPositronEPlot = aida.histogram1D("MCParticle: FS Positron E",100,0,3); - fsPositronEPlot.annotation().addItem("xAxisLabel", "Particle E [GeV]"); - - fsGammaThetaPlot = aida.cloud1D("MCParticle: FS Gamma Theta"); - fsGammaThetaPlot.annotation().addItem("xAxisLabel", "Particle angle [rad]"); + fsCountEventTypePlot2.annotation().addItem("xAxisLabel", "Number of FS Types Gamma E>500"); + + fsEPlot = aida.histogram1D("MCParticle: FS Particle E",100,0,3); + fsEPlot.annotation().addItem("xAxisLabel", "Particle E [GeV]"); + + fsGammaEPlot = aida.histogram1D("MCParticle: FS Gamma E",100,0,3); + fsGammaEPlot.annotation().addItem("xAxisLabel", "Particle E [GeV]"); + + fsElectronEPlot = aida.histogram1D("MCParticle: FS Electron E",100,0,3); + fsElectronEPlot.annotation().addItem("xAxisLabel", "Particle E [GeV]"); + + fsPositronEPlot = aida.histogram1D("MCParticle: FS Positron E",100,0,3); + fsPositronEPlot.annotation().addItem("xAxisLabel", "Particle E [GeV]"); + + fsGammaThetaPlot = aida.cloud1D("MCParticle: FS Gamma Theta"); + fsGammaThetaPlot.annotation().addItem("xAxisLabel", "Particle angle [rad]"); fsThetayPlot = aida.histogram1D("MCParticle: FS Particle Thetay",100,0,0.1); - fsThetayPlot.annotation().addItem("xAxisLabel", "Particle Thetay angle [rad]"); + fsThetayPlot.annotation().addItem("xAxisLabel", "Particle Thetay angle [rad]"); fsGammaThetayPlot = aida.histogram1D("MCParticle: FS Gamma Thetay",100,0,0.1); - fsGammaThetayPlot.annotation().addItem("xAxisLabel", "Particle Thetay angle [rad]"); + fsGammaThetayPlot.annotation().addItem("xAxisLabel", "Particle Thetay angle [rad]"); fsGammaThetayTrigPlot = aida.histogram1D("MCParticle: FS Gamma Thetay Trig",100,0,0.1); - fsGammaThetayTrigPlot.annotation().addItem("xAxisLabel", "Particle Thetay angle [rad]"); + fsGammaThetayTrigPlot.annotation().addItem("xAxisLabel", "Particle Thetay angle [rad]"); fsGammaThetayEPlot = aida.cloud2D("MCParticle: FS Gamma Thetay vs E"); - fsGammaThetayEPlot.annotation().addItem("xAxisLabel", "Particle Thetay angle [rad]"); - fsGammaThetayEPlot.annotation().addItem("yAxisLabel", "Particle Energy [GeV]"); - - fsElectronThetaPlot = aida.cloud1D("MCParticle: FS Electron Theta"); - fsElectronThetaPlot.annotation().addItem("xAxisLabel", "Particle angle [rad]"); + fsGammaThetayEPlot.annotation().addItem("xAxisLabel", "Particle Thetay angle [rad]"); + fsGammaThetayEPlot.annotation().addItem("yAxisLabel", "Particle Energy [GeV]"); + + fsElectronThetaPlot = aida.cloud1D("MCParticle: FS Electron Theta"); + fsElectronThetaPlot.annotation().addItem("xAxisLabel", "Particle angle [rad]"); fsElectronThetayPlot = aida.histogram1D("MCParticle: FS Electron Thetay",100,0,0.1); - fsElectronThetayPlot.annotation().addItem("xAxisLabel", "Particle Thetay angle [rad]"); + fsElectronThetayPlot.annotation().addItem("xAxisLabel", "Particle Thetay angle [rad]"); fsElectronThetayTrigPlot = aida.histogram1D("MCParticle: FS Electron Thetay Trig",100,0,0.1); - fsElectronThetayTrigPlot.annotation().addItem("xAxisLabel", "Particle Thetay angle [rad]"); + fsElectronThetayTrigPlot.annotation().addItem("xAxisLabel", "Particle Thetay angle [rad]"); fsElectronThetayEPlot = aida.cloud2D("MCParticle: FS Electron Thetay vs E"); - fsElectronThetayEPlot.annotation().addItem("xAxisLabel", "Particle Thetay angle [rad]"); - fsElectronThetayEPlot.annotation().addItem("yAxisLabel", "Particle Energy [GeV]"); - - fsPositronThetaPlot = aida.cloud1D("MCParticle: FS Positron Theta"); - fsPositronThetaPlot.annotation().addItem("xAxisLabel", "Particle angle [rad]"); + fsElectronThetayEPlot.annotation().addItem("xAxisLabel", "Particle Thetay angle [rad]"); + fsElectronThetayEPlot.annotation().addItem("yAxisLabel", "Particle Energy [GeV]"); + + fsPositronThetaPlot = aida.cloud1D("MCParticle: FS Positron Theta"); + fsPositronThetaPlot.annotation().addItem("xAxisLabel", "Particle angle [rad]"); fsPositronThetayPlot = aida.histogram1D("MCParticle: FS Positron Thetay",100,0,0.1); - fsPositronThetayPlot.annotation().addItem("xAxisLabel", "Particle Thetay angle [rad]"); + fsPositronThetayPlot.annotation().addItem("xAxisLabel", "Particle Thetay angle [rad]"); fsPositronThetayTrigPlot = aida.histogram1D("MCParticle: FS Positron Thetay Trig",100,0,0.1); - fsPositronThetayTrigPlot.annotation().addItem("xAxisLabel", "Particle Thetay angle [rad]"); + fsPositronThetayTrigPlot.annotation().addItem("xAxisLabel", "Particle Thetay angle [rad]"); fsPositronThetayEPlot = aida.cloud2D("MCParticle: FS Positron Thetay vs E"); - fsPositronThetayEPlot.annotation().addItem("xAxisLabel", "Particle Thetay angle [rad]"); - fsPositronThetayEPlot.annotation().addItem("yAxisLabel", "Particle Energy [GeV]"); - - - primaryEPlot = aida.cloud1D("MCParticle: Highest Primary E in Event"); - primaryEPlot.annotation().addItem("xAxisLabel", "E [GeV]"); - - eventEPlot = aida.cloud1D("MCParticle: Total Gen FS Electron E in Event"); - eventEPlot.annotation().addItem("xAxisLabel", "E [GeV]"); + fsPositronThetayEPlot.annotation().addItem("xAxisLabel", "Particle Thetay angle [rad]"); + fsPositronThetayEPlot.annotation().addItem("yAxisLabel", "Particle Energy [GeV]"); + + + primaryEPlot = aida.cloud1D("MCParticle: Highest Primary E in Event"); + primaryEPlot.annotation().addItem("xAxisLabel", "E [GeV]"); + + eventEPlot = aida.cloud1D("MCParticle: Total Gen FS Electron E in Event"); + eventEPlot.annotation().addItem("xAxisLabel", "E [GeV]"); //pFrame = new AIDAFrame(); @@ -205,19 +205,19 @@ - } - - @Override - public void process(EventHeader event) { - - // MCParticles - List<MCParticle> mcparticles = event.get(MCParticle.class).get(0); - - // Final State particles. - List<MCParticle> fsParticles = makeGenFSParticleList(mcparticles); - - //System.out.println("fsParticles="+fsParticles.size()); - fsCountPlot.fill(fsParticles.size()); + } + + @Override + public void process(EventHeader event) { + + // MCParticles + List<MCParticle> mcparticles = event.get(MCParticle.class).get(0); + + // Final State particles. + List<MCParticle> fsParticles = makeGenFSParticleList(mcparticles); + + //System.out.println("fsParticles="+fsParticles.size()); + fsCountPlot.fill(fsParticles.size()); for (int i=0;i<fsParticles.size();++i) fsCountVsEventPlot.fill(event.getEventNumber()); @@ -229,69 +229,69 @@ int[] ngammas = {0,0}; int count = 0; double trigThr = 0.2; - for (MCParticle fs : fsParticles) { + for (MCParticle fs : fsParticles) { //System.out.println("Index " + count); - double fsE = fs.getEnergy(); - double theta = Math.atan2(Math.sqrt(fs.getPX() * fs.getPX() + fs.getPY() * fs.getPY()), fs.getPZ()); - double thetay = Math.atan2(fs.getPY(), fs.getPZ()); - int fsPdg = fs.getPDGID(); - fsEPlot.fill(fsE); + double fsE = fs.getEnergy(); + double theta = Math.atan2(Math.sqrt(fs.getPX() * fs.getPX() + fs.getPY() * fs.getPY()), fs.getPZ()); + double thetay = Math.atan2(fs.getPY(), fs.getPZ()); + int fsPdg = fs.getPDGID(); + fsEPlot.fill(fsE); this.fsThetayPlot.fill(Math.abs(thetay)); fsCountTypePlot.fill(fsPdg); if(fsE>0.5) fsCountTypePlot500.fill(fsPdg); - if (ParticleTypeClassifier.isElectron(fsPdg)) { - fsElectronEPlot.fill(fsE); - fsElectronThetaPlot.fill(theta); - fsElectronThetayPlot.fill(Math.abs(thetay)); - if(fsE>trigThr) fsElectronThetayTrigPlot.fill(Math.abs(thetay)); - fsElectronThetayEPlot.fill(Math.abs(thetay),fsE); + if (ParticleTypeClassifier.isElectron(fsPdg)) { + fsElectronEPlot.fill(fsE); + fsElectronThetaPlot.fill(theta); + fsElectronThetayPlot.fill(Math.abs(thetay)); + if(fsE>trigThr) fsElectronThetayTrigPlot.fill(Math.abs(thetay)); + fsElectronThetayEPlot.fill(Math.abs(thetay),fsE); nelectrons[0]++; if(fsGammaEmax>0.5) nelectrons[1]++; - } else if (ParticleTypeClassifier.isPositron(fsPdg)) { - fsPositronEPlot.fill(fsE); - fsPositronThetaPlot.fill(theta); - fsPositronThetayPlot.fill(Math.abs(thetay)); - if(fsE>trigThr) fsPositronThetayTrigPlot.fill(Math.abs(thetay)); - fsPositronThetayEPlot.fill(Math.abs(thetay),fsE); + } else if (ParticleTypeClassifier.isPositron(fsPdg)) { + fsPositronEPlot.fill(fsE); + fsPositronThetaPlot.fill(theta); + fsPositronThetayPlot.fill(Math.abs(thetay)); + if(fsE>trigThr) fsPositronThetayTrigPlot.fill(Math.abs(thetay)); + fsPositronThetayEPlot.fill(Math.abs(thetay),fsE); npositrons[0]++; if(fsGammaEmax>0.5) npositrons[1]++; - } else if (ParticleTypeClassifier.isPhoton(fsPdg)) { - fsGammaEPlot.fill(fsE); - fsGammaThetaPlot.fill(theta); - fsGammaThetayPlot.fill(Math.abs(thetay)); - if(fsE>trigThr) fsGammaThetayTrigPlot.fill(Math.abs(thetay)); - fsGammaThetayEPlot.fill(Math.abs(thetay),fsE); + } else if (ParticleTypeClassifier.isPhoton(fsPdg)) { + fsGammaEPlot.fill(fsE); + fsGammaThetaPlot.fill(theta); + fsGammaThetayPlot.fill(Math.abs(thetay)); + if(fsE>trigThr) fsGammaThetayTrigPlot.fill(Math.abs(thetay)); + fsGammaThetayEPlot.fill(Math.abs(thetay),fsE); ngammas[0]++; if(fsGammaEmax>0.5) { ngammas[1]++; //System.out.println("Counting high E gamma at count "+ count); } - } - } + } + } fsCountEventTypePlot.fill(getEventTypeId(nelectrons[0],npositrons[0],ngammas[0])); fsCountEventTypePlot2.fill(getEventTypeId(nelectrons[1],npositrons[1],ngammas[1])); - // Sort MCParticles on energy. - //Collections.sort(fsParticles, new MCParticleEComparator()); - - // Energy of top two FS particles. - //double e2 = fsParticles.get(0).getEnergy() + fsParticles.get(1).getEnergy(); - - // Energy of top three FS particles. - //double e3 = e2 + fsParticles.get(2).getEnergy(); - - if (!fsParticles.isEmpty()) { - // primary particle with most E - double primaryE = getPrimary(fsParticles).getEnergy(); - primaryEPlot.fill(primaryE); - } - - // event electron energy - double eventE = getPrimaryElectronE(fsParticles); - eventEPlot.fill(eventE); - } + // Sort MCParticles on energy. + //Collections.sort(fsParticles, new MCParticleEComparator()); + + // Energy of top two FS particles. + //double e2 = fsParticles.get(0).getEnergy() + fsParticles.get(1).getEnergy(); + + // Energy of top three FS particles. + //double e3 = e2 + fsParticles.get(2).getEnergy(); + + if (!fsParticles.isEmpty()) { + // primary particle with most E + double primaryE = getPrimary(fsParticles).getEnergy(); + primaryEPlot.fill(primaryE); + } + + // event electron energy + double eventE = getPrimaryElectronE(fsParticles); + eventEPlot.fill(eventE); + } public int getEventTypeId(int ne, int np, int ng) { @@ -314,57 +314,57 @@ return 0; } - public double getHighestPhotonE(List<MCParticle> particles) { - double Emax = -1; + public double getHighestPhotonE(List<MCParticle> particles) { + double Emax = -1; double E=0; int count = 0; - for (MCParticle particle : particles) { - if (ParticleTypeClassifier.isPhoton(particle.getPDGID())) { - E = particle.getEnergy(); + for (MCParticle particle : particles) { + if (ParticleTypeClassifier.isPhoton(particle.getPDGID())) { + E = particle.getEnergy(); if(E>Emax) { Emax = E; //System.out.println("Emax from photon with index " + count); } - count++; + count++; } - } - return Emax; - } + } + return Emax; + } private double getPrimaryElectronE(List<MCParticle> particles) { - double totalE = 0; - for (MCParticle particle : particles) { - if (Math.abs(particle.getPDGID()) == 11) { - totalE += particle.getEnergy(); - } - } - return totalE; - } - - private MCParticle getPrimary(List<MCParticle> particles) { - double maxE = 0; - MCParticle primary = null; - for (MCParticle particle : particles) { - if (particle.getEnergy() > maxE) { - maxE = particle.getEnergy(); - primary = particle; - } - } - return primary; - } - - public static List<MCParticle> makeGenFSParticleList(List<MCParticle> mcparticles) { - List<MCParticle> fsParticles = new ArrayList<MCParticle>(); - for (MCParticle mcparticle : mcparticles) { - if (mcparticle.getGeneratorStatus() == MCParticle.FINAL_STATE) { - double theta = Math.atan2(Math.sqrt(mcparticle.getPX() * mcparticle.getPX() + mcparticle.getPY() * mcparticle.getPY()), mcparticle.getPZ()); - if (theta > 1e-3) { - fsParticles.add(mcparticle); - } - } - } - return fsParticles; - } + double totalE = 0; + for (MCParticle particle : particles) { + if (Math.abs(particle.getPDGID()) == 11) { + totalE += particle.getEnergy(); + } + } + return totalE; + } + + private MCParticle getPrimary(List<MCParticle> particles) { + double maxE = 0; + MCParticle primary = null; + for (MCParticle particle : particles) { + if (particle.getEnergy() > maxE) { + maxE = particle.getEnergy(); + primary = particle; + } + } + return primary; + } + + public static List<MCParticle> makeGenFSParticleList(List<MCParticle> mcparticles) { + List<MCParticle> fsParticles = new ArrayList<MCParticle>(); + for (MCParticle mcparticle : mcparticles) { + if (mcparticle.getGeneratorStatus() == MCParticle.FINAL_STATE) { + double theta = Math.atan2(Math.sqrt(mcparticle.getPX() * mcparticle.getPX() + mcparticle.getPY() * mcparticle.getPY()), mcparticle.getPZ()); + if (theta > 1e-3) { + fsParticles.add(mcparticle); + } + } + } + return fsParticles; + } public void endOfData() { Modified: java/trunk/analysis/src/main/java/org/hps/analysis/examples/StripGoldenEventsDriver.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/examples/StripGoldenEventsDriver.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/examples/StripGoldenEventsDriver.java Wed Mar 9 11:43:24 2016 @@ -27,7 +27,7 @@ boolean skipEvent = false; if (event.hasCollection(ReconstructedParticle.class, "UnconstrainedV0Candidates")) { List<ReconstructedParticle> vertices = event.get(ReconstructedParticle.class, "UnconstrainedV0Candidates"); - //System.out.println("Thete are: "+vertices.size()+" Unconstrained V0 candidates"); + //System.out.println("Thete are: "+vertices.size()+" Unconstrained V0 candidates"); if (vertices.size() > 1 || vertices.isEmpty()) { skipEvent = true; } else { @@ -38,14 +38,14 @@ List<Track> trks = rp.getTracks(); // require each track to have six hits if (trks.get(0).getTrackerHits().size() != 6) { - //System.out.println("Thete are: "+trks.get(0).getTrackerHits().size()+" hits on Track"); + //System.out.println("Thete are: "+trks.get(0).getTrackerHits().size()+" hits on Track"); skipEvent = true; } } // require no other tracks in the event if (event.get(Track.class, "MatchedTracks").size() > 2) { skipEvent = true; - //System.out.println("Thete are: "+event.get(Track.class, "MatchedTracks").size()+" Matched tracks"); + //System.out.println("Thete are: "+event.get(Track.class, "MatchedTracks").size()+" Matched tracks"); } // require no other clusters in the event if (event.get(Cluster.class, "EcalClustersGTP").size() > 2) { Modified: java/trunk/analysis/src/main/java/org/hps/analysis/examples/StripMollerEventsDriver.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/examples/StripMollerEventsDriver.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/examples/StripMollerEventsDriver.java Wed Mar 9 11:43:24 2016 @@ -94,7 +94,7 @@ skipEvent = false; } } - //System.out.println("Thete are: "+event.get(Track.class, "MatchedTracks").size()+" Matched tracks"); + //System.out.println("Thete are: "+event.get(Track.class, "MatchedTracks").size()+" Matched tracks"); } } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/DataTriggerSimDriver.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/DataTriggerSimDriver.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/DataTriggerSimDriver.java Wed Mar 9 11:43:24 2016 @@ -54,448 +54,448 @@ * @see SimTriggerData */ public class DataTriggerSimDriver extends Driver { - // Store the LCIO collection names for the needed objects. - private boolean filterUnverifiable = false; - private String bankCollectionName = "TriggerBank"; - private String clusterCollectionName = "EcalClusters"; - private String simTriggerCollectionName = "SimTriggers"; - - // Store the SSP bank. - private SSPData sspBank = null; - - // Store cluster verifiability parameters. - private int nsa = 0; - private int nsb = 0; - private int windowWidth = 0; - - // Define trigger simulation modules. - private boolean[] pairTriggerEnabled = new boolean[2]; - private boolean[] singlesTriggerEnabled = new boolean[2]; - private boolean[][] pairCutsEnabled = new boolean[2][7]; - private boolean[][] singlesCutsEnabled = new boolean[2][3]; - private TriggerModule[] pairsTrigger = new TriggerModule[2]; - private TriggerModule[] singlesTrigger = new TriggerModule[2]; - - // Reference variables. - private static final int ENERGY_MIN = TriggerDiagnosticUtil.SINGLES_ENERGY_MIN; - private static final int ENERGY_MAX = TriggerDiagnosticUtil.SINGLES_ENERGY_MAX; - private static final int HIT_COUNT = TriggerDiagnosticUtil.SINGLES_HIT_COUNT; - private static final int ENERGY_SUM = TriggerDiagnosticUtil.PAIR_ENERGY_SUM; - private static final int ENERGY_DIFF = TriggerDiagnosticUtil.PAIR_ENERGY_DIFF; - private static final int ENERGY_SLOPE = TriggerDiagnosticUtil.PAIR_ENERGY_SLOPE; - private static final int COPLANARITY = TriggerDiagnosticUtil.PAIR_COPLANARITY; - - /** - * Connects the driver to the the <code>ConfigurationManager</code> - * in order to obtain the correct trigger information. Trigger - * settings are stored in the <code>TriggerModule</code> objects. - */ - @Override - public void startOfData() { - // Define the first singles trigger. - singlesTrigger[0] = new TriggerModule(); - singlesTrigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.500); - singlesTrigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 8.191); - singlesTrigger[0].setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 0); - - // Define the second singles trigger. - singlesTrigger[1] = new TriggerModule(); - singlesTrigger[1].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.000); - singlesTrigger[1].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 8.191); - singlesTrigger[1].setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 0); - - // Define the first pairs trigger. - pairsTrigger[0] = new TriggerModule(); - pairsTrigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.000); - pairsTrigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 8.191); - pairsTrigger[0].setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 0); - pairsTrigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, 0.000); - pairsTrigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, 8.191); - pairsTrigger[0].setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, 8.191); - pairsTrigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.000); - pairsTrigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_F, 0.001); - pairsTrigger[0].setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 180); - pairsTrigger[0].setCutValue(TriggerModule.PAIR_TIME_COINCIDENCE, 8); - - // Define the second pairs trigger. - pairsTrigger[1] = new TriggerModule(); - pairsTrigger[1].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.000); - pairsTrigger[1].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 8.191); - pairsTrigger[1].setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 0); - pairsTrigger[1].setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, 0.000); - pairsTrigger[1].setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, 8.191); - pairsTrigger[1].setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, 8.191); - pairsTrigger[1].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.000); - pairsTrigger[1].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_F, 0.001); - pairsTrigger[1].setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 180); - pairsTrigger[1].setCutValue(TriggerModule.PAIR_TIME_COINCIDENCE, 8); - - // Listen for the configuration manager to provide the real - // trigger settings. - ConfigurationManager.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - // Get the DAQ configuration. - DAQConfig daq = ConfigurationManager.getInstance(); - - // Get cluster verifiability parameters. - nsa = daq.getFADCConfig().getNSA(); - nsb = daq.getFADCConfig().getNSB(); - windowWidth = daq.getFADCConfig().getWindowWidth(); - - // Load the DAQ settings from the configuration manager. - singlesTrigger[0].loadDAQConfiguration(daq.getSSPConfig().getSingles1Config()); - singlesTrigger[1].loadDAQConfiguration(daq.getSSPConfig().getSingles2Config()); - pairsTrigger[0].loadDAQConfiguration(daq.getSSPConfig().getPair1Config()); - pairsTrigger[1].loadDAQConfiguration(daq.getSSPConfig().getPair2Config()); - - // Get the trigger configurations from the DAQ. - SinglesTriggerConfig[] singles = { daq.getSSPConfig().getSingles1Config(), - daq.getSSPConfig().getSingles2Config() }; - PairTriggerConfig[] pairs = { daq.getSSPConfig().getPair1Config(), - daq.getSSPConfig().getPair2Config() }; - - // Update the enabled/disabled statuses. - for(int i = 0; i < 2; i++) { - // Set the trigger enabled status. - pairTriggerEnabled[i] = pairs[i].isEnabled(); - singlesTriggerEnabled[i] = singles[i].isEnabled(); - - // Set the singles cut statuses. - singlesCutsEnabled[i][ENERGY_MIN] = singles[i].getEnergyMinCutConfig().isEnabled(); - singlesCutsEnabled[i][ENERGY_MAX] = singles[i].getEnergyMaxCutConfig().isEnabled(); - singlesCutsEnabled[i][HIT_COUNT] = singles[i].getHitCountCutConfig().isEnabled(); - - // Set the pair cut statuses. - pairCutsEnabled[i][ENERGY_MIN] = pairs[i].getEnergyMinCutConfig().isEnabled(); - pairCutsEnabled[i][ENERGY_MAX] = pairs[i].getEnergyMaxCutConfig().isEnabled(); - pairCutsEnabled[i][HIT_COUNT] = pairs[i].getHitCountCutConfig().isEnabled(); - pairCutsEnabled[i][3 + ENERGY_SUM] = pairs[i].getEnergySumCutConfig().isEnabled(); - pairCutsEnabled[i][3 + ENERGY_DIFF] = pairs[i].getEnergyDifferenceCutConfig().isEnabled(); - pairCutsEnabled[i][3 + ENERGY_SLOPE] = pairs[i].getEnergySlopeCutConfig().isEnabled(); - pairCutsEnabled[i][3 + COPLANARITY] = pairs[i].getCoplanarityCutConfig().isEnabled(); - } - } - }); - } - - /** - * Processes an LCIO event and simulates triggers in the same manner - * as the hardware for both <code>SSPCluster</code> objects as well - * as <code>Cluster</code> objects reconstructed from FADC hits. - * Triggers are then output to the data stream. - * @param event - The <code>EventHeader</code> object representing - * the current LCIO event. - */ - @Override - public void process(EventHeader event) { - // If the DAQ configuration manager has not been initialized, - // then no action can be performed. - if(!ConfigurationManager.isInitialized()) { - // Put an empty trigger results module into the data stream. - SimTriggerData triggerData = new SimTriggerData(); - List<SimTriggerData> dataList = new ArrayList<SimTriggerData>(1); - dataList.add(triggerData); - event.put(simTriggerCollectionName, dataList, SimTriggerData.class, 0); - - // Nothing further can be done, since trigger settings are - // not yet defined. - return; - } - - // Get the SSP bank. - if(event.hasCollection(GenericObject.class, bankCollectionName)) { - // Get the bank list. - List<GenericObject> bankList = event.get(GenericObject.class, bankCollectionName); - - // Search through the banks and get the SSP and TI banks. - for(GenericObject obj : bankList) { - // If this is an SSP bank, parse it. - if(AbstractIntData.getTag(obj) == SSPData.BANK_TAG) { - sspBank = new SSPData(obj); - } - } - } - - // Get a list of SSPClusters. - List<SSPCluster> sspClusters = null; - if(sspBank != null) { sspClusters = sspBank.getClusters(); } - else { sspClusters = new ArrayList<SSPCluster>(0); } - - // Get reconstructed clusters. - List<Cluster> reconClusters = null; - if(event.hasCollection(Cluster.class, clusterCollectionName)) { - reconClusters = event.get(Cluster.class, clusterCollectionName); - } - else { reconClusters = new ArrayList<Cluster>(0); } - - // If only "verifiable" clusters should be used, test all the - // reconstructed clusters for verifiability. - if(filterUnverifiable) { - // Create a list to store the verifiable clusters. - List<Cluster> goodClusters = new ArrayList<Cluster>(); - - // Iterate over all the clusters and test them to see if - // they are verifiable. - for(Cluster cluster : reconClusters) { - if(TriggerDiagnosticUtil.isVerifiable(cluster, nsa, nsb, windowWidth)) { - goodClusters.add(cluster); - } - } - - // Replace the old cluster list with the new one. - reconClusters = goodClusters; - } - - // Generate simulated triggers. - SimTriggerModule<Cluster> reconModule = constructTriggers(reconClusters, Cluster.class); - SimTriggerModule<SSPCluster> sspModule = constructTriggers(sspClusters, SSPCluster.class); - - // Insert the trigger results in the data stream. - SimTriggerData triggerData = new SimTriggerData(reconModule, sspModule); - List<SimTriggerData> dataList = new ArrayList<SimTriggerData>(1); - dataList.add(triggerData); - event.put(simTriggerCollectionName, dataList, SimTriggerData.class, 0); - } - - /** - * Constructs simulated triggers in the same manner as the hardware. - * Method can accept either <code>Cluster</code> objects, any object - * that is a subclass of <code>Cluster</code>, or objects of type - * <code>SSPCluster</code>. - * @param clusters - A <code>List</code> collection of the cluster - * objects from which triggers are to be derived. - * @param clusterType - The class of the cluster objects from which - * triggers are to be derived. This can be <code>Cluster</code>, - * <code>SSPCluster</code>, or a subclass thereof. - * @return Returns a <code>SimTriggerModule</code> object containing - * the simulated trigger results. - * @throws IllegalArgumentException Occurs if the class of the - * cluster objects is not of a supported type. - * - */ - private <E> SimTriggerModule<E> constructTriggers(List<E> clusters, Class<E> clusterType) throws IllegalArgumentException { - // Verify that the cluster type is supported. - if(!clusterType.equals(Cluster.class) && !clusterType.equals(SSPCluster.class)) { - throw new IllegalArgumentException("Class \"" + clusterType.getSimpleName() + "\" is not a supported cluster type."); - } - - // Store the singles and pair triggers. - List<List<PairTrigger<E[]>>> pairTriggers = new ArrayList<List<PairTrigger<E[]>>>(2); - pairTriggers.add(new ArrayList<PairTrigger<E[]>>()); - pairTriggers.add(new ArrayList<PairTrigger<E[]>>()); - List<List<SinglesTrigger<E>>> singlesTriggers = new ArrayList<List<SinglesTrigger<E>>>(2); - singlesTriggers.add(new ArrayList<SinglesTrigger<E>>()); - singlesTriggers.add(new ArrayList<SinglesTrigger<E>>()); - - // Run the clusters through the singles trigger to determine - // whether or not they pass it. - for(E cluster : clusters) { - // Simulate each of the cluster singles triggers. - triggerLoop: - for(int triggerNum = 0; triggerNum < 2; triggerNum++) { - // Track whether the cluster passed each singles cut. - boolean passSeedLow = true; - boolean passSeedHigh = true; - boolean passClusterLow = false; - boolean passClusterHigh = false; - boolean passHitCount = false; - - // Perform the trigger cuts appropriately for the type - // of cluster. - if(cluster instanceof Cluster) { - // Cast the cluster to the appropriate type. - Cluster c = (Cluster) cluster; - - // Perform each trigger cut. - passClusterLow = singlesTrigger[triggerNum].clusterTotalEnergyCutLow(c); - passClusterHigh = singlesTrigger[triggerNum].clusterTotalEnergyCutHigh(c); - passHitCount = singlesTrigger[triggerNum].clusterHitCountCut(c); - } else if(cluster instanceof SSPCluster) { - // Cast the cluster to the appropriate type. - SSPCluster c = (SSPCluster) cluster; - - // Perform each trigger cut. - passClusterLow = singlesTrigger[triggerNum].clusterTotalEnergyCutLow(c); - passClusterHigh = singlesTrigger[triggerNum].clusterTotalEnergyCutHigh(c); - passHitCount = singlesTrigger[triggerNum].clusterHitCountCut(c); - } - - // Make a trigger to store the results. - SinglesTrigger<E> trigger = new SinglesTrigger<E>(cluster, triggerNum); - trigger.setStateSeedEnergyLow(passSeedLow); - trigger.setStateSeedEnergyHigh(passSeedHigh); - trigger.setStateClusterEnergyLow(passClusterLow); - trigger.setStateClusterEnergyHigh(passClusterHigh); - trigger.setStateHitCount(passHitCount); - - // A trigger will only be reported by the SSP if it - // passes all of the enabled cuts for that trigger. - // Check whether this trigger meets these conditions. - if(singlesCutsEnabled[triggerNum][ENERGY_MIN] && !trigger.getStateClusterEnergyLow()) { - continue triggerLoop; - } if(singlesCutsEnabled[triggerNum][ENERGY_MAX] && !trigger.getStateClusterEnergyHigh()) { - continue triggerLoop; - } if(singlesCutsEnabled[triggerNum][HIT_COUNT] && !trigger.getStateHitCount()) { - continue triggerLoop; - } - - // Store the trigger. - singlesTriggers.get(triggerNum).add(trigger); - } - } - - // Store cluster pairs. - List<E[]> pairs = TriggerModule.getTopBottomPairs(clusters, clusterType); - - // Simulate the pair triggers and record the results. - for(E[] pair : pairs) { - // Simulate each of the cluster pair triggers. - pairTriggerLoop: - for(int triggerIndex = 0; triggerIndex < 2; triggerIndex++) { - // Track whether the cluster passed each singles cut. - boolean passSeedLow = true; - boolean passSeedHigh = true; - boolean passClusterLow = false; - boolean passClusterHigh = false; - boolean passHitCount = false; - boolean passPairEnergySumLow = false; - boolean passPairEnergySumHigh = false; - boolean passPairEnergyDifference = false; - boolean passPairEnergySlope = false; - boolean passPairCoplanarity = false; - boolean passTimeCoincidence = false; - - // Apply the trigger cuts appropriately according to the - // cluster type. - if(clusterType.equals(Cluster.class)) { - // Cast the cluster object. - Cluster[] reconPair = { (Cluster) pair[0], (Cluster) pair[1] }; - - // Check that the pair passes the time coincidence cut. - // If it does not, it is not a valid pair and should be - // destroyed. - if(!pairsTrigger[triggerIndex].pairTimeCoincidenceCut(reconPair)) { - continue pairTriggerLoop; - } - - passClusterLow = pairsTrigger[triggerIndex].clusterTotalEnergyCutLow(reconPair[0]) - && pairsTrigger[triggerIndex].clusterTotalEnergyCutLow(reconPair[1]); - passClusterHigh = pairsTrigger[triggerIndex].clusterTotalEnergyCutHigh(reconPair[0]) - && pairsTrigger[triggerIndex].clusterTotalEnergyCutHigh(reconPair[1]); - passHitCount = pairsTrigger[triggerIndex].clusterHitCountCut(reconPair[0]) - && pairsTrigger[triggerIndex].clusterHitCountCut(reconPair[1]); - passPairEnergySumLow = pairsTrigger[triggerIndex].pairEnergySumCutLow(reconPair); - passPairEnergySumHigh = pairsTrigger[triggerIndex].pairEnergySumCutHigh(reconPair); - passPairEnergyDifference = pairsTrigger[triggerIndex].pairEnergyDifferenceCut(reconPair); - passPairEnergySlope = pairsTrigger[triggerIndex].pairEnergySlopeCut(reconPair); - passPairCoplanarity = pairsTrigger[triggerIndex].pairCoplanarityCut(reconPair); - passTimeCoincidence = pairsTrigger[triggerIndex].pairTimeCoincidenceCut(reconPair); - } else if(clusterType.equals(SSPCluster.class)) { - // Cast the cluster object. - SSPCluster[] sspPair = { (SSPCluster) pair[0], (SSPCluster) pair[1] }; - - // Check that the pair passes the time coincidence cut. - // If it does not, it is not a valid pair and should be - // destroyed. - if(!pairsTrigger[triggerIndex].pairTimeCoincidenceCut(sspPair)) { - continue pairTriggerLoop; - } - - // Perform each trigger cut. - passClusterLow = pairsTrigger[triggerIndex].clusterTotalEnergyCutLow(sspPair[0]) - && pairsTrigger[triggerIndex].clusterTotalEnergyCutLow(sspPair[1]); - passClusterHigh = pairsTrigger[triggerIndex].clusterTotalEnergyCutHigh(sspPair[0]) - && pairsTrigger[triggerIndex].clusterTotalEnergyCutHigh(sspPair[1]); - passHitCount = pairsTrigger[triggerIndex].clusterHitCountCut(sspPair[0]) - && pairsTrigger[triggerIndex].clusterHitCountCut(sspPair[1]); - passPairEnergySumLow = pairsTrigger[triggerIndex].pairEnergySumCutLow(sspPair); - passPairEnergySumHigh = pairsTrigger[triggerIndex].pairEnergySumCutHigh(sspPair); - passPairEnergyDifference = pairsTrigger[triggerIndex].pairEnergyDifferenceCut(sspPair); - passPairEnergySlope = pairsTrigger[triggerIndex].pairEnergySlopeCut(sspPair); - passPairCoplanarity = pairsTrigger[triggerIndex].pairCoplanarityCut(sspPair); - passTimeCoincidence = pairsTrigger[triggerIndex].pairTimeCoincidenceCut(sspPair); - } - - // Create a trigger from the results. - PairTrigger<E[]> trigger = new PairTrigger<E[]>(pair, triggerIndex); - trigger.setStateSeedEnergyLow(passSeedLow); - trigger.setStateSeedEnergyHigh(passSeedHigh); - trigger.setStateClusterEnergyLow(passClusterLow); - trigger.setStateClusterEnergyHigh(passClusterHigh); - trigger.setStateHitCount(passHitCount); - trigger.setStateEnergySumLow(passPairEnergySumLow); - trigger.setStateEnergySumHigh(passPairEnergySumHigh); - trigger.setStateEnergyDifference(passPairEnergyDifference); - trigger.setStateEnergySlope(passPairEnergySlope); - trigger.setStateCoplanarity(passPairCoplanarity); - trigger.setStateTimeCoincidence(passTimeCoincidence); - - // A trigger will only be reported by the SSP if it - // passes all of the enabled cuts for that trigger. - // Check whether this trigger meets these conditions. - if(pairCutsEnabled[triggerIndex][ENERGY_MIN] && !trigger.getStateClusterEnergyLow()) { - continue pairTriggerLoop; - } if(pairCutsEnabled[triggerIndex][ENERGY_MAX] && !trigger.getStateClusterEnergyHigh()) { - continue pairTriggerLoop; - } if(pairCutsEnabled[triggerIndex][HIT_COUNT] && !trigger.getStateHitCount()) { - continue pairTriggerLoop; - } if(pairCutsEnabled[triggerIndex][3 + ENERGY_SUM] && !trigger.getStateEnergySum()) { - continue pairTriggerLoop; - } if(pairCutsEnabled[triggerIndex][3 + ENERGY_DIFF] && !trigger.getStateEnergyDifference()) { - continue pairTriggerLoop; - } if(pairCutsEnabled[triggerIndex][3 + ENERGY_SLOPE] && !trigger.getStateEnergySlope()) { - continue pairTriggerLoop; - } if(pairCutsEnabled[triggerIndex][3 + COPLANARITY] && !trigger.getStateCoplanarity()) { - continue pairTriggerLoop; - } - - // Add the trigger to the list. - pairTriggers.get(triggerIndex).add(trigger); - } - } - - // Create a new simulated trigger module to contain the results. - return new SimTriggerModule<E>(singlesTriggers.get(0), singlesTriggers.get(1), - pairTriggers.get(0), pairTriggers.get(1)); - } - - /** - * Sets the name of the LCIO collection containing the TI and SSP - * banks. - * @param bankCollectionName - The bank collection name. - */ - public void setBankCollectionName(String bankCollectionName) { - this.bankCollectionName = bankCollectionName; - } - - /** - * Sets the name of the LCIO collection containing the simulated - * reconstructed clusters. - * @param clusterCollectionName - The cluster collection name. - */ - public void setClusterCollectionName(String clusterCollectionName) { - this.clusterCollectionName = clusterCollectionName; - } - - /** - * Sets whether or not triggers should be formed using all clusters, - * or only those that where the integration window for the cluster - * is completely within the bounds of the event window. - * @param state - <code>true</code> means that only clusters where - * the entire cluster integration window is within the event time - * window will be used, while <code>false</code> means that all - * clusters will be used. - */ - public void setFilterUnverifiableClusters(boolean state) { - this.filterUnverifiable = state; - } - - /** - * Sets the name of the LCIO collection containing simulated triggers. - * @param triggerCollection - The trigger collection name. - */ - public void setTriggerCollectionName(String triggerCollection) { - this.simTriggerCollectionName = triggerCollection; - } + // Store the LCIO collection names for the needed objects. + private boolean filterUnverifiable = false; + private String bankCollectionName = "TriggerBank"; + private String clusterCollectionName = "EcalClusters"; + private String simTriggerCollectionName = "SimTriggers"; + + // Store the SSP bank. + private SSPData sspBank = null; + + // Store cluster verifiability parameters. + private int nsa = 0; + private int nsb = 0; + private int windowWidth = 0; + + // Define trigger simulation modules. + private boolean[] pairTriggerEnabled = new boolean[2]; + private boolean[] singlesTriggerEnabled = new boolean[2]; + private boolean[][] pairCutsEnabled = new boolean[2][7]; + private boolean[][] singlesCutsEnabled = new boolean[2][3]; + private TriggerModule[] pairsTrigger = new TriggerModule[2]; + private TriggerModule[] singlesTrigger = new TriggerModule[2]; + + // Reference variables. + private static final int ENERGY_MIN = TriggerDiagnosticUtil.SINGLES_ENERGY_MIN; + private static final int ENERGY_MAX = TriggerDiagnosticUtil.SINGLES_ENERGY_MAX; + private static final int HIT_COUNT = TriggerDiagnosticUtil.SINGLES_HIT_COUNT; + private static final int ENERGY_SUM = TriggerDiagnosticUtil.PAIR_ENERGY_SUM; + private static final int ENERGY_DIFF = TriggerDiagnosticUtil.PAIR_ENERGY_DIFF; + private static final int ENERGY_SLOPE = TriggerDiagnosticUtil.PAIR_ENERGY_SLOPE; + private static final int COPLANARITY = TriggerDiagnosticUtil.PAIR_COPLANARITY; + + /** + * Connects the driver to the the <code>ConfigurationManager</code> + * in order to obtain the correct trigger information. Trigger + * settings are stored in the <code>TriggerModule</code> objects. + */ + @Override + public void startOfData() { + // Define the first singles trigger. + singlesTrigger[0] = new TriggerModule(); + singlesTrigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.500); + singlesTrigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 8.191); + singlesTrigger[0].setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 0); + + // Define the second singles trigger. + singlesTrigger[1] = new TriggerModule(); + singlesTrigger[1].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.000); + singlesTrigger[1].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 8.191); + singlesTrigger[1].setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 0); + + // Define the first pairs trigger. + pairsTrigger[0] = new TriggerModule(); + pairsTrigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.000); + pairsTrigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 8.191); + pairsTrigger[0].setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 0); + pairsTrigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, 0.000); + pairsTrigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, 8.191); + pairsTrigger[0].setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, 8.191); + pairsTrigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.000); + pairsTrigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_F, 0.001); + pairsTrigger[0].setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 180); + pairsTrigger[0].setCutValue(TriggerModule.PAIR_TIME_COINCIDENCE, 8); + + // Define the second pairs trigger. + pairsTrigger[1] = new TriggerModule(); + pairsTrigger[1].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.000); + pairsTrigger[1].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 8.191); + pairsTrigger[1].setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 0); + pairsTrigger[1].setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, 0.000); + pairsTrigger[1].setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, 8.191); + pairsTrigger[1].setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, 8.191); + pairsTrigger[1].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.000); + pairsTrigger[1].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_F, 0.001); + pairsTrigger[1].setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 180); + pairsTrigger[1].setCutValue(TriggerModule.PAIR_TIME_COINCIDENCE, 8); + + // Listen for the configuration manager to provide the real + // trigger settings. + ConfigurationManager.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + // Get the DAQ configuration. + DAQConfig daq = ConfigurationManager.getInstance(); + + // Get cluster verifiability parameters. + nsa = daq.getFADCConfig().getNSA(); + nsb = daq.getFADCConfig().getNSB(); + windowWidth = daq.getFADCConfig().getWindowWidth(); + + // Load the DAQ settings from the configuration manager. + singlesTrigger[0].loadDAQConfiguration(daq.getSSPConfig().getSingles1Config()); + singlesTrigger[1].loadDAQConfiguration(daq.getSSPConfig().getSingles2Config()); + pairsTrigger[0].loadDAQConfiguration(daq.getSSPConfig().getPair1Config()); + pairsTrigger[1].loadDAQConfiguration(daq.getSSPConfig().getPair2Config()); + + // Get the trigger configurations from the DAQ. + SinglesTriggerConfig[] singles = { daq.getSSPConfig().getSingles1Config(), + daq.getSSPConfig().getSingles2Config() }; + PairTriggerConfig[] pairs = { daq.getSSPConfig().getPair1Config(), + daq.getSSPConfig().getPair2Config() }; + + // Update the enabled/disabled statuses. + for(int i = 0; i < 2; i++) { + // Set the trigger enabled status. + pairTriggerEnabled[i] = pairs[i].isEnabled(); + singlesTriggerEnabled[i] = singles[i].isEnabled(); + + // Set the singles cut statuses. + singlesCutsEnabled[i][ENERGY_MIN] = singles[i].getEnergyMinCutConfig().isEnabled(); + singlesCutsEnabled[i][ENERGY_MAX] = singles[i].getEnergyMaxCutConfig().isEnabled(); + singlesCutsEnabled[i][HIT_COUNT] = singles[i].getHitCountCutConfig().isEnabled(); + + // Set the pair cut statuses. + pairCutsEnabled[i][ENERGY_MIN] = pairs[i].getEnergyMinCutConfig().isEnabled(); + pairCutsEnabled[i][ENERGY_MAX] = pairs[i].getEnergyMaxCutConfig().isEnabled(); + pairCutsEnabled[i][HIT_COUNT] = pairs[i].getHitCountCutConfig().isEnabled(); + pairCutsEnabled[i][3 + ENERGY_SUM] = pairs[i].getEnergySumCutConfig().isEnabled(); + pairCutsEnabled[i][3 + ENERGY_DIFF] = pairs[i].getEnergyDifferenceCutConfig().isEnabled(); + pairCutsEnabled[i][3 + ENERGY_SLOPE] = pairs[i].getEnergySlopeCutConfig().isEnabled(); + pairCutsEnabled[i][3 + COPLANARITY] = pairs[i].getCoplanarityCutConfig().isEnabled(); + } + } + }); + } + + /** + * Processes an LCIO event and simulates triggers in the same manner + * as the hardware for both <code>SSPCluster</code> objects as well + * as <code>Cluster</code> objects reconstructed from FADC hits. + * Triggers are then output to the data stream. + * @param event - The <code>EventHeader</code> object representing + * the current LCIO event. + */ + @Override + public void process(EventHeader event) { + // If the DAQ configuration manager has not been initialized, + // then no action can be performed. + if(!ConfigurationManager.isInitialized()) { + // Put an empty trigger results module into the data stream. + SimTriggerData triggerData = new SimTriggerData(); + List<SimTriggerData> dataList = new ArrayList<SimTriggerData>(1); + dataList.add(triggerData); + event.put(simTriggerCollectionName, dataList, SimTriggerData.class, 0); + + // Nothing further can be done, since trigger settings are + // not yet defined. + return; + } + + // Get the SSP bank. + if(event.hasCollection(GenericObject.class, bankCollectionName)) { + // Get the bank list. + List<GenericObject> bankList = event.get(GenericObject.class, bankCollectionName); + + // Search through the banks and get the SSP and TI banks. + for(GenericObject obj : bankList) { + // If this is an SSP bank, parse it. + if(AbstractIntData.getTag(obj) == SSPData.BANK_TAG) { + sspBank = new SSPData(obj); + } + } + } + + // Get a list of SSPClusters. + List<SSPCluster> sspClusters = null; + if(sspBank != null) { sspClusters = sspBank.getClusters(); } + else { sspClusters = new ArrayList<SSPCluster>(0); } + + // Get reconstructed clusters. + List<Cluster> reconClusters = null; + if(event.hasCollection(Cluster.class, clusterCollectionName)) { + reconClusters = event.get(Cluster.class, clusterCollectionName); + } + else { reconClusters = new ArrayList<Cluster>(0); } + + // If only "verifiable" clusters should be used, test all the + // reconstructed clusters for verifiability. + if(filterUnverifiable) { + // Create a list to store the verifiable clusters. + List<Cluster> goodClusters = new ArrayList<Cluster>(); + + // Iterate over all the clusters and test them to see if + // they are verifiable. + for(Cluster cluster : reconClusters) { + if(TriggerDiagnosticUtil.isVerifiable(cluster, nsa, nsb, windowWidth)) { + goodClusters.add(cluster); + } + } + + // Replace the old cluster list with the new one. + reconClusters = goodClusters; + } + + // Generate simulated triggers. + SimTriggerModule<Cluster> reconModule = constructTriggers(reconClusters, Cluster.class); + SimTriggerModule<SSPCluster> sspModule = constructTriggers(sspClusters, SSPCluster.class); + + // Insert the trigger results in the data stream. + SimTriggerData triggerData = new SimTriggerData(reconModule, sspModule); + List<SimTriggerData> dataList = new ArrayList<SimTriggerData>(1); + dataList.add(triggerData); + event.put(simTriggerCollectionName, dataList, SimTriggerData.class, 0); + } + + /** + * Constructs simulated triggers in the same manner as the hardware. + * Method can accept either <code>Cluster</code> objects, any object + * that is a subclass of <code>Cluster</code>, or objects of type + * <code>SSPCluster</code>. + * @param clusters - A <code>List</code> collection of the cluster + * objects from which triggers are to be derived. + * @param clusterType - The class of the cluster objects from which + * triggers are to be derived. This can be <code>Cluster</code>, + * <code>SSPCluster</code>, or a subclass thereof. + * @return Returns a <code>SimTriggerModule</code> object containing + * the simulated trigger results. + * @throws IllegalArgumentException Occurs if the class of the + * cluster objects is not of a supported type. + * + */ + private <E> SimTriggerModule<E> constructTriggers(List<E> clusters, Class<E> clusterType) throws IllegalArgumentException { + // Verify that the cluster type is supported. + if(!clusterType.equals(Cluster.class) && !clusterType.equals(SSPCluster.class)) { + throw new IllegalArgumentException("Class \"" + clusterType.getSimpleName() + "\" is not a supported cluster type."); + } + + // Store the singles and pair triggers. + List<List<PairTrigger<E[]>>> pairTriggers = new ArrayList<List<PairTrigger<E[]>>>(2); + pairTriggers.add(new ArrayList<PairTrigger<E[]>>()); + pairTriggers.add(new ArrayList<PairTrigger<E[]>>()); + List<List<SinglesTrigger<E>>> singlesTriggers = new ArrayList<List<SinglesTrigger<E>>>(2); + singlesTriggers.add(new ArrayList<SinglesTrigger<E>>()); + singlesTriggers.add(new ArrayList<SinglesTrigger<E>>()); + + // Run the clusters through the singles trigger to determine + // whether or not they pass it. + for(E cluster : clusters) { + // Simulate each of the cluster singles triggers. + triggerLoop: + for(int triggerNum = 0; triggerNum < 2; triggerNum++) { + // Track whether the cluster passed each singles cut. + boolean passSeedLow = true; + boolean passSeedHigh = true; + boolean passClusterLow = false; + boolean passClusterHigh = false; + boolean passHitCount = false; + + // Perform the trigger cuts appropriately for the type + // of cluster. + if(cluster instanceof Cluster) { + // Cast the cluster to the appropriate type. + Cluster c = (Cluster) cluster; + + // Perform each trigger cut. + passClusterLow = singlesTrigger[triggerNum].clusterTotalEnergyCutLow(c); + passClusterHigh = singlesTrigger[triggerNum].clusterTotalEnergyCutHigh(c); + passHitCount = singlesTrigger[triggerNum].clusterHitCountCut(c); + } else if(cluster instanceof SSPCluster) { + // Cast the cluster to the appropriate type. + SSPCluster c = (SSPCluster) cluster; + + // Perform each trigger cut. + passClusterLow = singlesTrigger[triggerNum].clusterTotalEnergyCutLow(c); + passClusterHigh = singlesTrigger[triggerNum].clusterTotalEnergyCutHigh(c); + passHitCount = singlesTrigger[triggerNum].clusterHitCountCut(c); + } + + // Make a trigger to store the results. + SinglesTrigger<E> trigger = new SinglesTrigger<E>(cluster, triggerNum); + trigger.setStateSeedEnergyLow(passSeedLow); + trigger.setStateSeedEnergyHigh(passSeedHigh); + trigger.setStateClusterEnergyLow(passClusterLow); + trigger.setStateClusterEnergyHigh(passClusterHigh); + trigger.setStateHitCount(passHitCount); + + // A trigger will only be reported by the SSP if it + // passes all of the enabled cuts for that trigger. + // Check whether this trigger meets these conditions. + if(singlesCutsEnabled[triggerNum][ENERGY_MIN] && !trigger.getStateClusterEnergyLow()) { + continue triggerLoop; + } if(singlesCutsEnabled[triggerNum][ENERGY_MAX] && !trigger.getStateClusterEnergyHigh()) { + continue triggerLoop; + } if(singlesCutsEnabled[triggerNum][HIT_COUNT] && !trigger.getStateHitCount()) { + continue triggerLoop; + } + + // Store the trigger. + singlesTriggers.get(triggerNum).add(trigger); + } + } + + // Store cluster pairs. + List<E[]> pairs = TriggerModule.getTopBottomPairs(clusters, clusterType); + + // Simulate the pair triggers and record the results. + for(E[] pair : pairs) { + // Simulate each of the cluster pair triggers. + pairTriggerLoop: + for(int triggerIndex = 0; triggerIndex < 2; triggerIndex++) { + // Track whether the cluster passed each singles cut. + boolean passSeedLow = true; + boolean passSeedHigh = true; + boolean passClusterLow = false; + boolean passClusterHigh = false; + boolean passHitCount = false; + boolean passPairEnergySumLow = false; + boolean passPairEnergySumHigh = false; + boolean passPairEnergyDifference = false; + boolean passPairEnergySlope = false; + boolean passPairCoplanarity = false; + boolean passTimeCoincidence = false; + + // Apply the trigger cuts appropriately according to the + // cluster type. + if(clusterType.equals(Cluster.class)) { + // Cast the cluster object. + Cluster[] reconPair = { (Cluster) pair[0], (Cluster) pair[1] }; + + // Check that the pair passes the time coincidence cut. + // If it does not, it is not a valid pair and should be + // destroyed. + if(!pairsTrigger[triggerIndex].pairTimeCoincidenceCut(reconPair)) { + continue pairTriggerLoop; + } + + passClusterLow = pairsTrigger[triggerIndex].clusterTotalEnergyCutLow(reconPair[0]) + && pairsTrigger[triggerIndex].clusterTotalEnergyCutLow(reconPair[1]); + passClusterHigh = pairsTrigger[triggerIndex].clusterTotalEnergyCutHigh(reconPair[0]) + && pairsTrigger[triggerIndex].clusterTotalEnergyCutHigh(reconPair[1]); + passHitCount = pairsTrigger[triggerIndex].clusterHitCountCut(reconPair[0]) + && pairsTrigger[triggerIndex].clusterHitCountCut(reconPair[1]); + passPairEnergySumLow = pairsTrigger[triggerIndex].pairEnergySumCutLow(reconPair); + passPairEnergySumHigh = pairsTrigger[triggerIndex].pairEnergySumCutHigh(reconPair); + passPairEnergyDifference = pairsTrigger[triggerIndex].pairEnergyDifferenceCut(reconPair); + passPairEnergySlope = pairsTrigger[triggerIndex].pairEnergySlopeCut(reconPair); + passPairCoplanarity = pairsTrigger[triggerIndex].pairCoplanarityCut(reconPair); + passTimeCoincidence = pairsTrigger[triggerIndex].pairTimeCoincidenceCut(reconPair); + } else if(clusterType.equals(SSPCluster.class)) { + // Cast the cluster object. + SSPCluster[] sspPair = { (SSPCluster) pair[0], (SSPCluster) pair[1] }; + + // Check that the pair passes the time coincidence cut. + // If it does not, it is not a valid pair and should be + // destroyed. + if(!pairsTrigger[triggerIndex].pairTimeCoincidenceCut(sspPair)) { + continue pairTriggerLoop; + } + + // Perform each trigger cut. + passClusterLow = pairsTrigger[triggerIndex].clusterTotalEnergyCutLow(sspPair[0]) + && pairsTrigger[triggerIndex].clusterTotalEnergyCutLow(sspPair[1]); + passClusterHigh = pairsTrigger[triggerIndex].clusterTotalEnergyCutHigh(sspPair[0]) + && pairsTrigger[triggerIndex].clusterTotalEnergyCutHigh(sspPair[1]); + passHitCount = pairsTrigger[triggerIndex].clusterHitCountCut(sspPair[0]) + && pairsTrigger[triggerIndex].clusterHitCountCut(sspPair[1]); + passPairEnergySumLow = pairsTrigger[triggerIndex].pairEnergySumCutLow(sspPair); + passPairEnergySumHigh = pairsTrigger[triggerIndex].pairEnergySumCutHigh(sspPair); + passPairEnergyDifference = pairsTrigger[triggerIndex].pairEnergyDifferenceCut(sspPair); + passPairEnergySlope = pairsTrigger[triggerIndex].pairEnergySlopeCut(sspPair); + passPairCoplanarity = pairsTrigger[triggerIndex].pairCoplanarityCut(sspPair); + passTimeCoincidence = pairsTrigger[triggerIndex].pairTimeCoincidenceCut(sspPair); + } + + // Create a trigger from the results. + PairTrigger<E[]> trigger = new PairTrigger<E[]>(pair, triggerIndex); + trigger.setStateSeedEnergyLow(passSeedLow); + trigger.setStateSeedEnergyHigh(passSeedHigh); + trigger.setStateClusterEnergyLow(passClusterLow); + trigger.setStateClusterEnergyHigh(passClusterHigh); + trigger.setStateHitCount(passHitCount); + trigger.setStateEnergySumLow(passPairEnergySumLow); + trigger.setStateEnergySumHigh(passPairEnergySumHigh); + trigger.setStateEnergyDifference(passPairEnergyDifference); + trigger.setStateEnergySlope(passPairEnergySlope); + trigger.setStateCoplanarity(passPairCoplanarity); + trigger.setStateTimeCoincidence(passTimeCoincidence); + + // A trigger will only be reported by the SSP if it + // passes all of the enabled cuts for that trigger. + // Check whether this trigger meets these conditions. + if(pairCutsEnabled[triggerIndex][ENERGY_MIN] && !trigger.getStateClusterEnergyLow()) { + continue pairTriggerLoop; + } if(pairCutsEnabled[triggerIndex][ENERGY_MAX] && !trigger.getStateClusterEnergyHigh()) { + continue pairTriggerLoop; + } if(pairCutsEnabled[triggerIndex][HIT_COUNT] && !trigger.getStateHitCount()) { + continue pairTriggerLoop; + } if(pairCutsEnabled[triggerIndex][3 + ENERGY_SUM] && !trigger.getStateEnergySum()) { + continue pairTriggerLoop; + } if(pairCutsEnabled[triggerIndex][3 + ENERGY_DIFF] && !trigger.getStateEnergyDifference()) { + continue pairTriggerLoop; + } if(pairCutsEnabled[triggerIndex][3 + ENERGY_SLOPE] && !trigger.getStateEnergySlope()) { + continue pairTriggerLoop; + } if(pairCutsEnabled[triggerIndex][3 + COPLANARITY] && !trigger.getStateCoplanarity()) { + continue pairTriggerLoop; + } + + // Add the trigger to the list. + pairTriggers.get(triggerIndex).add(trigger); + } + } + + // Create a new simulated trigger module to contain the results. + return new SimTriggerModule<E>(singlesTriggers.get(0), singlesTriggers.get(1), + pairTriggers.get(0), pairTriggers.get(1)); + } + + /** + * Sets the name of the LCIO collection containing the TI and SSP + * banks. + * @param bankCollectionName - The bank collection name. + */ + public void setBankCollectionName(String bankCollectionName) { + this.bankCollectionName = bankCollectionName; + } + + /** + * Sets the name of the LCIO collection containing the simulated + * reconstructed clusters. + * @param clusterCollectionName - The cluster collection name. + */ + public void setClusterCollectionName(String clusterCollectionName) { + this.clusterCollectionName = clusterCollectionName; + } + + /** + * Sets whether or not triggers should be formed using all clusters, + * or only those that where the integration window for the cluster + * is completely within the bounds of the event window. + * @param state - <code>true</code> means that only clusters where + * the entire cluster integration window is within the event time + * window will be used, while <code>false</code> means that all + * clusters will be used. + */ + public void setFilterUnverifiableClusters(boolean state) { + this.filterUnverifiable = state; + } + + /** + * Sets the name of the LCIO collection containing simulated triggers. + * @param triggerCollection - The trigger collection name. + */ + public void setTriggerCollectionName(String triggerCollection) { + this.simTriggerCollectionName = triggerCollection; + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/SimTriggerData.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/SimTriggerData.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/SimTriggerData.java Wed Mar 9 11:43:24 2016 @@ -13,47 +13,47 @@ * @author Kyle McCarty <[log in to unmask]> */ public class SimTriggerData { - private final SimTriggerModule<Cluster> reconTriggers; - private final SimTriggerModule<SSPCluster> sspTriggers; - - /** - * Instantiates a new <code>SimTriggerData</code> object with empty - * trigger results modules. - */ - SimTriggerData() { - reconTriggers = new SimTriggerModule<Cluster>(); - sspTriggers = new SimTriggerModule<SSPCluster>(); - } - - /** - * Instantiates a new <code>SimTriggerData</code> object that will - * contain the argument trigger modules. - * @param reconTriggers - The simulated reconstructed cluster - * triggers module. - * @param sspTriggers - The simulated SSP cluster triggers module. - */ - SimTriggerData(SimTriggerModule<Cluster> reconTriggers, SimTriggerModule<SSPCluster> sspTriggers) { - this.reconTriggers = reconTriggers; - this.sspTriggers = sspTriggers; - } - - /** - * Gets the module containing all simulated SSP trigger data for - * each of the four primary triggers. - * @return Returns the trigger data in a <code>SimTriggerModule</code> - * object. - */ - public SimTriggerModule<SSPCluster> getSimSSPTriggers() { - return sspTriggers; - } - - /** - * Gets the module containing all simulated LCSim trigger data for - * each of the four primary triggers. - * @return Returns the trigger data in a <code>SimTriggerModule</code> - * object. - */ - public SimTriggerModule<Cluster> getSimReconTriggers() { - return reconTriggers; - } + private final SimTriggerModule<Cluster> reconTriggers; + private final SimTriggerModule<SSPCluster> sspTriggers; + + /** + * Instantiates a new <code>SimTriggerData</code> object with empty + * trigger results modules. + */ + SimTriggerData() { + reconTriggers = new SimTriggerModule<Cluster>(); + sspTriggers = new SimTriggerModule<SSPCluster>(); + } + + /** + * Instantiates a new <code>SimTriggerData</code> object that will + * contain the argument trigger modules. + * @param reconTriggers - The simulated reconstructed cluster + * triggers module. + * @param sspTriggers - The simulated SSP cluster triggers module. + */ + SimTriggerData(SimTriggerModule<Cluster> reconTriggers, SimTriggerModule<SSPCluster> sspTriggers) { + this.reconTriggers = reconTriggers; + this.sspTriggers = sspTriggers; + } + + /** + * Gets the module containing all simulated SSP trigger data for + * each of the four primary triggers. + * @return Returns the trigger data in a <code>SimTriggerModule</code> + * object. + */ + public SimTriggerModule<SSPCluster> getSimSSPTriggers() { + return sspTriggers; + } + + /** + * Gets the module containing all simulated LCSim trigger data for + * each of the four primary triggers. + * @return Returns the trigger data in a <code>SimTriggerModule</code> + * object. + */ + public SimTriggerModule<Cluster> getSimReconTriggers() { + return reconTriggers; + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/SimTriggerModule.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/SimTriggerModule.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/SimTriggerModule.java Wed Mar 9 11:43:24 2016 @@ -18,71 +18,71 @@ * @see DataTriggerSimDriver */ public class SimTriggerModule<E> { - private final List<SinglesTrigger<E>> singles0; - private final List<SinglesTrigger<E>> singles1; - private final List<PairTrigger<E[]>> pair0; - private final List<PairTrigger<E[]>> pair1; - - /** - * Constructs a new <code>SimTriggerModule</code> with the no - * triggers results for any triggers. - */ - SimTriggerModule() { - singles0 = new ArrayList<SinglesTrigger<E>>(0); - singles1 = new ArrayList<SinglesTrigger<E>>(0); - pair0 = new ArrayList<PairTrigger<E[]>>(0); - pair1 = new ArrayList<PairTrigger<E[]>>(0); - } - - /** - * Constructs a new <code>SimTriggerModule</code> with the specified - * trigger results for each of the four primary triggers. - * @param singles0Triggers - The results for the singles 0 trigger. - * @param singles1Triggers - The results for the singles 1 trigger. - * @param pair0Triggers - The results for the pair 0 trigger. - * @param pair1Triggers - The results for the pair 1 trigger. - */ - SimTriggerModule(List<SinglesTrigger<E>> singles0Triggers, List<SinglesTrigger<E>> singles1Triggers, - List<PairTrigger<E[]>> pair0Triggers, List<PairTrigger<E[]>> pair1Triggers) { - this.singles0 = singles0Triggers; - this.singles1 = singles1Triggers; - this.pair0 = pair0Triggers; - this.pair1 = pair1Triggers; - } - - /** - * Gets the simulated trigger results for the singles 0 trigger. - * @return Returns the trigger results as a <code>List</code> of - * <code>SinglesTrigger</code> objects. - */ - public List<SinglesTrigger<E>> getSingles0Triggers() { - return singles0; - } - - /** - * Gets the simulated trigger results for the singles 1 trigger. - * @return Returns the trigger results as a <code>List</code> of - * <code>SinglesTrigger</code> objects. - */ - public List<SinglesTrigger<E>> getSingles1Triggers() { - return singles1; - } - - /** - * Gets the simulated trigger results for the pair 0 trigger. - * @return Returns the trigger results as a <code>List</code> of - * <code>PairTrigger</code> objects. - */ - public List<PairTrigger<E[]>> getPair0Triggers() { - return pair0; - } - - /** - * Gets the simulated trigger results for the pair 1 trigger. - * @return Returns the trigger results as a <code>List</code> of - * <code>PairTrigger</code> objects. - */ - public List<PairTrigger<E[]>> getPair1Triggers() { - return pair1; - } + private final List<SinglesTrigger<E>> singles0; + private final List<SinglesTrigger<E>> singles1; + private final List<PairTrigger<E[]>> pair0; + private final List<PairTrigger<E[]>> pair1; + + /** + * Constructs a new <code>SimTriggerModule</code> with the no + * triggers results for any triggers. + */ + SimTriggerModule() { + singles0 = new ArrayList<SinglesTrigger<E>>(0); + singles1 = new ArrayList<SinglesTrigger<E>>(0); + pair0 = new ArrayList<PairTrigger<E[]>>(0); + pair1 = new ArrayList<PairTrigger<E[]>>(0); + } + + /** + * Constructs a new <code>SimTriggerModule</code> with the specified + * trigger results for each of the four primary triggers. + * @param singles0Triggers - The results for the singles 0 trigger. + * @param singles1Triggers - The results for the singles 1 trigger. + * @param pair0Triggers - The results for the pair 0 trigger. + * @param pair1Triggers - The results for the pair 1 trigger. + */ + SimTriggerModule(List<SinglesTrigger<E>> singles0Triggers, List<SinglesTrigger<E>> singles1Triggers, + List<PairTrigger<E[]>> pair0Triggers, List<PairTrigger<E[]>> pair1Triggers) { + this.singles0 = singles0Triggers; + this.singles1 = singles1Triggers; + this.pair0 = pair0Triggers; + this.pair1 = pair1Triggers; + } + + /** + * Gets the simulated trigger results for the singles 0 trigger. + * @return Returns the trigger results as a <code>List</code> of + * <code>SinglesTrigger</code> objects. + */ + public List<SinglesTrigger<E>> getSingles0Triggers() { + return singles0; + } + + /** + * Gets the simulated trigger results for the singles 1 trigger. + * @return Returns the trigger results as a <code>List</code> of + * <code>SinglesTrigger</code> objects. + */ + public List<SinglesTrigger<E>> getSingles1Triggers() { + return singles1; + } + + /** + * Gets the simulated trigger results for the pair 0 trigger. + * @return Returns the trigger results as a <code>List</code> of + * <code>PairTrigger</code> objects. + */ + public List<PairTrigger<E[]>> getPair0Triggers() { + return pair0; + } + + /** + * Gets the simulated trigger results for the pair 1 trigger. + * @return Returns the trigger results as a <code>List</code> of + * <code>PairTrigger</code> objects. + */ + public List<PairTrigger<E[]>> getPair1Triggers() { + return pair1; + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/TriggerDiagnosticDriver.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/TriggerDiagnosticDriver.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/TriggerDiagnosticDriver.java Wed Mar 9 11:43:24 2016 @@ -52,54 +52,54 @@ import org.lcsim.util.aida.AIDA; public class TriggerDiagnosticDriver extends Driver { - // Store the LCIO collection names for the needed objects. - private String hitCollectionName = "EcalCalHits"; - private String bankCollectionName = "TriggerBank"; - private String clusterCollectionName = "EcalClusters"; - private String diagnosticCollectionName = "DiagnosticSnapshot"; - private static final int clusterCollectionFlag = 1 << LCIOConstants.CLBIT_HITS; - private String[] singlesCandidateCollectionName = { "Singles0TriggerCandidates", "Singles1TriggerCandidates" }; - private String[] pairCandidateCollectionName = { "Pair0TriggerCandidates", "Pair1TriggerCandidates" }; - - // Store the lists of parsed objects. - private TIData tiBank; - private SSPData sspBank; - private List<SSPCluster> sspClusters; - private List<Cluster> reconClusters = new ArrayList<Cluster>(); - private SimTriggerData triggerData = null; - - // Trigger modules for performing trigger analysis. - //private int activeTrigger = -1; - private boolean[] tiFlags = new boolean[6]; - private TriggerModule[] singlesTrigger = new TriggerModule[2]; - private TriggerModule[] pairsTrigger = new TriggerModule[2]; - private boolean[][] singlesCutsEnabled = new boolean[2][3]; - private boolean[][] pairCutsEnabled = new boolean[2][7]; - private boolean[] singlesTriggerEnabled = new boolean[2]; - private boolean[] pairTriggerEnabled = new boolean[2]; - - // Verification settings. - private int nsa = 100; - private int nsb = 20; - private int windowWidth = 200; - private int hitAcceptance = 1; - private int noiseThreshold = 50; - private double energyAcceptance = 0.003; - private boolean readDAQConfig = false; - private int localWindowThreshold = 1000000000; - private boolean performClusterVerification = true; - private boolean performSinglesTriggerVerification = true; - private boolean performPairTriggerVerification = true; - private boolean enforceTimeCompliance = false; - - // Efficiency tracking variables. - private RunDiagStats localStats = new RunDiagStats(); - private RunDiagStats globalStats = new RunDiagStats(); - - // Track which clusters/pairs are trigger candidates. - private List<List<Cluster>> singlesCandidates = new ArrayList<List<Cluster>>(2); - private List<List<LCRelation>> pairCandidates = new ArrayList<List<LCRelation>>(2); - + // Store the LCIO collection names for the needed objects. + private String hitCollectionName = "EcalCalHits"; + private String bankCollectionName = "TriggerBank"; + private String clusterCollectionName = "EcalClusters"; + private String diagnosticCollectionName = "DiagnosticSnapshot"; + private static final int clusterCollectionFlag = 1 << LCIOConstants.CLBIT_HITS; + private String[] singlesCandidateCollectionName = { "Singles0TriggerCandidates", "Singles1TriggerCandidates" }; + private String[] pairCandidateCollectionName = { "Pair0TriggerCandidates", "Pair1TriggerCandidates" }; + + // Store the lists of parsed objects. + private TIData tiBank; + private SSPData sspBank; + private List<SSPCluster> sspClusters; + private List<Cluster> reconClusters = new ArrayList<Cluster>(); + private SimTriggerData triggerData = null; + + // Trigger modules for performing trigger analysis. + //private int activeTrigger = -1; + private boolean[] tiFlags = new boolean[6]; + private TriggerModule[] singlesTrigger = new TriggerModule[2]; + private TriggerModule[] pairsTrigger = new TriggerModule[2]; + private boolean[][] singlesCutsEnabled = new boolean[2][3]; + private boolean[][] pairCutsEnabled = new boolean[2][7]; + private boolean[] singlesTriggerEnabled = new boolean[2]; + private boolean[] pairTriggerEnabled = new boolean[2]; + + // Verification settings. + private int nsa = 100; + private int nsb = 20; + private int windowWidth = 200; + private int hitAcceptance = 1; + private int noiseThreshold = 50; + private double energyAcceptance = 0.003; + private boolean readDAQConfig = false; + private int localWindowThreshold = 1000000000; + private boolean performClusterVerification = true; + private boolean performSinglesTriggerVerification = true; + private boolean performPairTriggerVerification = true; + private boolean enforceTimeCompliance = false; + + // Efficiency tracking variables. + private RunDiagStats localStats = new RunDiagStats(); + private RunDiagStats globalStats = new RunDiagStats(); + + // Track which clusters/pairs are trigger candidates. + private List<List<Cluster>> singlesCandidates = new ArrayList<List<Cluster>>(2); + private List<List<LCRelation>> pairCandidates = new ArrayList<List<LCRelation>>(2); + // Verbose settings. private boolean clusterFail = false; private boolean singlesEfficiencyFail = false; @@ -115,2125 +115,2125 @@ private int statPrintInterval = Integer.MAX_VALUE; // Cut index arrays for trigger verification. - private static final int ENERGY_MIN = TriggerDiagnosticUtil.SINGLES_ENERGY_MIN; - private static final int ENERGY_MAX = TriggerDiagnosticUtil.SINGLES_ENERGY_MAX; - private static final int HIT_COUNT = TriggerDiagnosticUtil.SINGLES_HIT_COUNT; - private static final int ENERGY_SUM = TriggerDiagnosticUtil.PAIR_ENERGY_SUM; - private static final int ENERGY_DIFF = TriggerDiagnosticUtil.PAIR_ENERGY_DIFF; - private static final int ENERGY_SLOPE = TriggerDiagnosticUtil.PAIR_ENERGY_SLOPE; - private static final int COPLANARITY = TriggerDiagnosticUtil.PAIR_COPLANARITY; - - // Track the total run time. - private long startTime = -1; - private long endTime = -1; - - // Cut names for logging. - private static final String[][] cutNames = { - { "E_min", "E_max", "hit count", "null" }, - { "E_sum", "E_diff", "E_slope", "coplanar" } - }; - - // Temporary AIDA Plots - private TriggerPlotsModule globalTriggerPlots = new TriggerPlotsModule(0, 0); - private static final int RECON = 0; - private static final int SSP = 1; - private static final int ALL = 0; - private static final int MATCHED = 1; - private static final int FAILED = 2; - private AIDA aida = AIDA.defaultInstance(); - private IHistogram1D[][] clusterHitPlot = { - { - aida.histogram1D("Clustering/Recon Cluster Hit Count (All)", 9, 0.5, 9.5), - aida.histogram1D("Clustering/Recon Cluster Hit Count (Matched)", 9, 0.5, 9.5), - aida.histogram1D("Clustering/Recon Cluster Hit Count (Failed)", 9, 0.5, 9.5) - }, - { - aida.histogram1D("Clustering/SSP Cluster Hit Count (All)", 9, 0.5, 9.5), - aida.histogram1D("Clustering/SSP Cluster Hit Count (Matched)", 9, 0.5, 9.5), - aida.histogram1D("Clustering/SSP Cluster Hit Count (Failed)", 9, 0.5, 9.5) - } - }; - private IHistogram1D[][] clusterEnergyPlot = { - { - aida.histogram1D("Clustering/Recon Cluster Energy (All)", 300, 0.0, 3.0), - aida.histogram1D("Clustering/Recon Cluster Energy (Matched)", 300, 0.0, 3.0), - aida.histogram1D("Clustering/Recon Cluster Energy (Failed)", 300, 0.0, 3.0) - }, - { - aida.histogram1D("Clustering/SSP Cluster Energy (All)", 300, 0.0, 3.0), - aida.histogram1D("Clustering/SSP Cluster Energy (Matched)", 300, 0.0, 3.0), - aida.histogram1D("Clustering/SSP Cluster Energy (Failed)", 300, 0.0, 3.0) - } - }; - private IHistogram1D[][] clusterTimePlot = { - { - aida.histogram1D("Clustering/Recon Cluster Time (All)", 115, 0, 460), - aida.histogram1D("Clustering/Recon Cluster Time (Matched)", 115, 0, 460), - aida.histogram1D("Clustering/Recon Cluster Time (Failed)", 115, 0, 460) - }, - { - aida.histogram1D("Clustering/SSP Cluster Time (All)", 115, 0, 460), - aida.histogram1D("Clustering/SSP Cluster Time (Matched)", 115, 0, 460), - aida.histogram1D("Clustering/SSP Cluster Time (Failed)", 115, 0, 460) - } - }; - private IHistogram2D[][] clusterPositionPlot = { - { - aida.histogram2D("Clustering/Recon Cluster Position (All)", 47, -23.5, 23.5, 11, -5.5, 5.5), - aida.histogram2D("Clustering/Recon Cluster Position (Matched)", 47, -23.5, 23.5, 11, -5.5, 5.5), - aida.histogram2D("Clustering/Recon Cluster Position (Failed)", 47, -23.5, 23.5, 11, -5.5, 5.5) - }, - { - aida.histogram2D("Clustering/SSP Cluster Position (All)", 47, -23.5, 23.5, 11, -5.5, 5.5), - aida.histogram2D("Clustering/SSP Cluster Position (Matched)", 47, -23.5, 23.5, 11, -5.5, 5.5), - aida.histogram2D("Clustering/SSP Cluster Position (Failed)", 47, -23.5, 23.5, 11, -5.5, 5.5) - } - }; - private IHistogram2D[] energyhitDiffPlot = { - aida.histogram2D("Clustering/Recon-SSP Energy-Hit Difference (All)", 21, -0.010, 0.010, 6, -3, 3), - aida.histogram2D("Clustering/Recon-SSP Energy-Hit Difference (Matched)", 21, -0.010, 0.010, 6, -3, 3), - aida.histogram2D("Clustering/Recon-SSP Energy-Hit Difference (Failed)", 21, -0.010, 0.010, 6, -3, 3) - }; - private ICloud2D[] efficiencyTimeHist = { - aida.cloud2D("Clustering/Cluster Efficiency vs. Time"), - aida.cloud2D("Singles Trigger 0/Cluster Efficiency vs. Time"), - aida.cloud2D("Singles Trigger 1/Cluster Efficiency vs. Time"), - aida.cloud2D("Pair Trigger 0/Cluster Efficiency vs. Time"), - aida.cloud2D("Pair Trigger 1/Cluster Efficiency vs. Time") - }; - - /** - * Define the trigger modules. This should be replaced by parsing - * the DAQ configuration at some point. - */ - @Override - public void startOfData() { - // By default, all triggers and cuts are enabled. - for(int i = 0; i < 2; i++) { - // Enable the triggers. - pairTriggerEnabled[i] = true; - singlesTriggerEnabled[i] = true; - - // Enable the singles cuts. - for(int j = 0; j < singlesCutsEnabled.length; j++) { - singlesCutsEnabled[i][j] = true; - } - - // Enable the pair cuts. - for(int j = 0; j < pairCutsEnabled.length; j++) { - pairCutsEnabled[i][j] = true; - } - } - - // If the DAQ configuration should be read, attach a listener - // to track when it updates. - if(readDAQConfig) { - ConfigurationManager.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - // Get the DAQ configuration. - DAQConfig daq = ConfigurationManager.getInstance(); - - // Update the plotting energy slope values. - globalTriggerPlots.setEnergySlopeParamF(0, daq.getSSPConfig().getPair1Config().getEnergySlopeCutConfig().getParameterF()); - globalTriggerPlots.setEnergySlopeParamF(1, daq.getSSPConfig().getPair2Config().getEnergySlopeCutConfig().getParameterF()); - - // Load the DAQ settings from the configuration manager. - singlesTrigger[0].loadDAQConfiguration(daq.getSSPConfig().getSingles1Config()); - singlesTrigger[1].loadDAQConfiguration(daq.getSSPConfig().getSingles2Config()); - pairsTrigger[0].loadDAQConfiguration(daq.getSSPConfig().getPair1Config()); - pairsTrigger[1].loadDAQConfiguration(daq.getSSPConfig().getPair2Config()); - nsa = daq.getFADCConfig().getNSA(); - nsb = daq.getFADCConfig().getNSB(); - windowWidth = daq.getFADCConfig().getWindowWidth(); - - // Get the trigger configurations from the DAQ. - SinglesTriggerConfig[] singles = { daq.getSSPConfig().getSingles1Config(), - daq.getSSPConfig().getSingles2Config() }; - PairTriggerConfig[] pairs = { daq.getSSPConfig().getPair1Config(), - daq.getSSPConfig().getPair2Config() }; - - // Update the enabled/disabled statuses. - for(int i = 0; i < 2; i++) { - // Set the trigger enabled status. - pairTriggerEnabled[i] = pairs[i].isEnabled(); - singlesTriggerEnabled[i] = singles[i].isEnabled(); - - // Set the singles cut statuses. - singlesCutsEnabled[i][ENERGY_MIN] = singles[i].getEnergyMinCutConfig().isEnabled(); - singlesCutsEnabled[i][ENERGY_MAX] = singles[i].getEnergyMaxCutConfig().isEnabled(); - singlesCutsEnabled[i][HIT_COUNT] = singles[i].getHitCountCutConfig().isEnabled(); - - // Set the pair cut statuses. - pairCutsEnabled[i][ENERGY_MIN] = pairs[i].getEnergyMinCutConfig().isEnabled(); - pairCutsEnabled[i][ENERGY_MAX] = pairs[i].getEnergyMaxCutConfig().isEnabled(); - pairCutsEnabled[i][HIT_COUNT] = pairs[i].getHitCountCutConfig().isEnabled(); - pairCutsEnabled[i][3 + ENERGY_SUM] = pairs[i].getEnergySumCutConfig().isEnabled(); - pairCutsEnabled[i][3 + ENERGY_DIFF] = pairs[i].getEnergyDifferenceCutConfig().isEnabled(); - pairCutsEnabled[i][3 + ENERGY_SLOPE] = pairs[i].getEnergySlopeCutConfig().isEnabled(); - pairCutsEnabled[i][3 + COPLANARITY] = pairs[i].getCoplanarityCutConfig().isEnabled(); - } - - // Update the trigger plots values. - globalTriggerPlots.setEnergySlopeParamF(0, daq.getSSPConfig().getPair1Config().getEnergySlopeCutConfig().getParameterF()); - globalTriggerPlots.setEnergySlopeParamF(1, daq.getSSPConfig().getPair2Config().getEnergySlopeCutConfig().getParameterF()); - - // Print a DAQ configuration settings header. - System.out.println(); - System.out.println(); - System.out.println("======================================================================"); - System.out.println("=== DAQ Configuration Settings ======================================="); - System.out.println("======================================================================"); - logSettings(); - } - }); - } - - // Print the cluster verification header. - System.out.println(); - System.out.println(); - System.out.println("======================================================================"); - System.out.println("=== Cluster/Trigger Verification Settings ============================"); - System.out.println("======================================================================"); - - // Define the first singles trigger. - singlesTrigger[0] = new TriggerModule(); - singlesTrigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.500); - singlesTrigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 8.191); - singlesTrigger[0].setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 0); - - // Define the second singles trigger. - singlesTrigger[1] = new TriggerModule(); - singlesTrigger[1].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.000); - singlesTrigger[1].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 8.191); - singlesTrigger[1].setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 0); - - // Define the first pairs trigger. - pairsTrigger[0] = new TriggerModule(); - pairsTrigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.000); - pairsTrigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 8.191); - pairsTrigger[0].setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 0); - pairsTrigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, 0.000); - pairsTrigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, 8.191); - pairsTrigger[0].setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, 8.191); - pairsTrigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.000); - pairsTrigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_F, 0.001); - pairsTrigger[0].setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 180); - pairsTrigger[0].setCutValue(TriggerModule.PAIR_TIME_COINCIDENCE, 8); - - // Define the second pairs trigger. - pairsTrigger[1] = new TriggerModule(); - pairsTrigger[1].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.000); - pairsTrigger[1].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 8.191); - pairsTrigger[1].setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 0); - pairsTrigger[1].setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, 0.000); - pairsTrigger[1].setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, 8.191); - pairsTrigger[1].setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, 8.191); - pairsTrigger[1].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.000); - pairsTrigger[1].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_F, 0.001); - pairsTrigger[1].setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 180); - pairsTrigger[1].setCutValue(TriggerModule.PAIR_TIME_COINCIDENCE, 8); - - // Print the initial settings. - logSettings(); - } - - /** - * Prints the total run statistics. - */ - @Override - public void endOfData() { - // Output the statistics. - logStatistics(); - - /* - // Calculate the values needed for the efficiency histogram. - long totalTime = entryList.get(entryList.size()).time / 1000000000; - int entries = (int) (totalTime / (localWindowThreshold / 1000000000)) + 1; - - // Generate a histogram containing the efficiencies. - IHistogram1D[] efficiencyHist = new IHistogram1D[5]; - for(int i = 0; i < 5; i++) { - efficiencyHist[i] = aida.histogram1D("Efficiency " + i, entries, 0.0, totalTime + (localWindowThreshold / 1000000000)); - } - - // Input the efficiencies. - for(EfficiencyEntry entry : entryList) { - for(int i = 0; i < 5; i++) { - efficiencyHist[i].fill(entry.time / 1000000000, entry.efficiency[i]); - } - } - */ - } - - /** - * Gets the banks and clusters from the event. - */ - @Override - public void process(EventHeader event) { - // ========================================================== - // ==== Event Pre-Initialization ============================ - // ========================================================== - - // If DAQ settings are to be used, check if they are initialized - // yet. If not, skip the event. - if(readDAQConfig) { - if(!ConfigurationManager.isInitialized()) { - return; - } - } - - // Reset the candidate cluster lists. - singlesCandidates.clear(); - singlesCandidates.add(new ArrayList<Cluster>()); - singlesCandidates.add(new ArrayList<Cluster>()); - pairCandidates.clear(); - pairCandidates.add(new ArrayList<LCRelation>()); - pairCandidates.add(new ArrayList<LCRelation>()); - - // Increment the total event count. - localStats.sawEvent(event.getTimeStamp()); - globalStats.sawEvent(event.getTimeStamp()); - - // Print the statistics every so often during a run. - if(globalStats.getEventCount() % statPrintInterval == 0) { - logStatistics(); - } - - // Reset the output buffer and print flags. - clusterFail = false; - singlesInternalFail = false; - singlesEfficiencyFail = false; - pairInternalFail = false; - pairEfficiencyFail = false; - OutputLogger.clearLog(); - - // Track the times. - if(startTime == -1) { startTime = event.getTimeStamp(); } - else { endTime = event.getTimeStamp(); } - - - - // ========================================================== - // ==== Output GTP Information ============================== - // ========================================================== - + private static final int ENERGY_MIN = TriggerDiagnosticUtil.SINGLES_ENERGY_MIN; + private static final int ENERGY_MAX = TriggerDiagnosticUtil.SINGLES_ENERGY_MAX; + private static final int HIT_COUNT = TriggerDiagnosticUtil.SINGLES_HIT_COUNT; + private static final int ENERGY_SUM = TriggerDiagnosticUtil.PAIR_ENERGY_SUM; + private static final int ENERGY_DIFF = TriggerDiagnosticUtil.PAIR_ENERGY_DIFF; + private static final int ENERGY_SLOPE = TriggerDiagnosticUtil.PAIR_ENERGY_SLOPE; + private static final int COPLANARITY = TriggerDiagnosticUtil.PAIR_COPLANARITY; + + // Track the total run time. + private long startTime = -1; + private long endTime = -1; + + // Cut names for logging. + private static final String[][] cutNames = { + { "E_min", "E_max", "hit count", "null" }, + { "E_sum", "E_diff", "E_slope", "coplanar" } + }; + + // Temporary AIDA Plots + private TriggerPlotsModule globalTriggerPlots = new TriggerPlotsModule(0, 0); + private static final int RECON = 0; + private static final int SSP = 1; + private static final int ALL = 0; + private static final int MATCHED = 1; + private static final int FAILED = 2; + private AIDA aida = AIDA.defaultInstance(); + private IHistogram1D[][] clusterHitPlot = { + { + aida.histogram1D("Clustering/Recon Cluster Hit Count (All)", 9, 0.5, 9.5), + aida.histogram1D("Clustering/Recon Cluster Hit Count (Matched)", 9, 0.5, 9.5), + aida.histogram1D("Clustering/Recon Cluster Hit Count (Failed)", 9, 0.5, 9.5) + }, + { + aida.histogram1D("Clustering/SSP Cluster Hit Count (All)", 9, 0.5, 9.5), + aida.histogram1D("Clustering/SSP Cluster Hit Count (Matched)", 9, 0.5, 9.5), + aida.histogram1D("Clustering/SSP Cluster Hit Count (Failed)", 9, 0.5, 9.5) + } + }; + private IHistogram1D[][] clusterEnergyPlot = { + { + aida.histogram1D("Clustering/Recon Cluster Energy (All)", 300, 0.0, 3.0), + aida.histogram1D("Clustering/Recon Cluster Energy (Matched)", 300, 0.0, 3.0), + aida.histogram1D("Clustering/Recon Cluster Energy (Failed)", 300, 0.0, 3.0) + }, + { + aida.histogram1D("Clustering/SSP Cluster Energy (All)", 300, 0.0, 3.0), + aida.histogram1D("Clustering/SSP Cluster Energy (Matched)", 300, 0.0, 3.0), + aida.histogram1D("Clustering/SSP Cluster Energy (Failed)", 300, 0.0, 3.0) + } + }; + private IHistogram1D[][] clusterTimePlot = { + { + aida.histogram1D("Clustering/Recon Cluster Time (All)", 115, 0, 460), + aida.histogram1D("Clustering/Recon Cluster Time (Matched)", 115, 0, 460), + aida.histogram1D("Clustering/Recon Cluster Time (Failed)", 115, 0, 460) + }, + { + aida.histogram1D("Clustering/SSP Cluster Time (All)", 115, 0, 460), + aida.histogram1D("Clustering/SSP Cluster Time (Matched)", 115, 0, 460), + aida.histogram1D("Clustering/SSP Cluster Time (Failed)", 115, 0, 460) + } + }; + private IHistogram2D[][] clusterPositionPlot = { + { + aida.histogram2D("Clustering/Recon Cluster Position (All)", 47, -23.5, 23.5, 11, -5.5, 5.5), + aida.histogram2D("Clustering/Recon Cluster Position (Matched)", 47, -23.5, 23.5, 11, -5.5, 5.5), + aida.histogram2D("Clustering/Recon Cluster Position (Failed)", 47, -23.5, 23.5, 11, -5.5, 5.5) + }, + { + aida.histogram2D("Clustering/SSP Cluster Position (All)", 47, -23.5, 23.5, 11, -5.5, 5.5), + aida.histogram2D("Clustering/SSP Cluster Position (Matched)", 47, -23.5, 23.5, 11, -5.5, 5.5), + aida.histogram2D("Clustering/SSP Cluster Position (Failed)", 47, -23.5, 23.5, 11, -5.5, 5.5) + } + }; + private IHistogram2D[] energyhitDiffPlot = { + aida.histogram2D("Clustering/Recon-SSP Energy-Hit Difference (All)", 21, -0.010, 0.010, 6, -3, 3), + aida.histogram2D("Clustering/Recon-SSP Energy-Hit Difference (Matched)", 21, -0.010, 0.010, 6, -3, 3), + aida.histogram2D("Clustering/Recon-SSP Energy-Hit Difference (Failed)", 21, -0.010, 0.010, 6, -3, 3) + }; + private ICloud2D[] efficiencyTimeHist = { + aida.cloud2D("Clustering/Cluster Efficiency vs. Time"), + aida.cloud2D("Singles Trigger 0/Cluster Efficiency vs. Time"), + aida.cloud2D("Singles Trigger 1/Cluster Efficiency vs. Time"), + aida.cloud2D("Pair Trigger 0/Cluster Efficiency vs. Time"), + aida.cloud2D("Pair Trigger 1/Cluster Efficiency vs. Time") + }; + + /** + * Define the trigger modules. This should be replaced by parsing + * the DAQ configuration at some point. + */ + @Override + public void startOfData() { + // By default, all triggers and cuts are enabled. + for(int i = 0; i < 2; i++) { + // Enable the triggers. + pairTriggerEnabled[i] = true; + singlesTriggerEnabled[i] = true; + + // Enable the singles cuts. + for(int j = 0; j < singlesCutsEnabled.length; j++) { + singlesCutsEnabled[i][j] = true; + } + + // Enable the pair cuts. + for(int j = 0; j < pairCutsEnabled.length; j++) { + pairCutsEnabled[i][j] = true; + } + } + + // If the DAQ configuration should be read, attach a listener + // to track when it updates. + if(readDAQConfig) { + ConfigurationManager.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + // Get the DAQ configuration. + DAQConfig daq = ConfigurationManager.getInstance(); + + // Update the plotting energy slope values. + globalTriggerPlots.setEnergySlopeParamF(0, daq.getSSPConfig().getPair1Config().getEnergySlopeCutConfig().getParameterF()); + globalTriggerPlots.setEnergySlopeParamF(1, daq.getSSPConfig().getPair2Config().getEnergySlopeCutConfig().getParameterF()); + + // Load the DAQ settings from the configuration manager. + singlesTrigger[0].loadDAQConfiguration(daq.getSSPConfig().getSingles1Config()); + singlesTrigger[1].loadDAQConfiguration(daq.getSSPConfig().getSingles2Config()); + pairsTrigger[0].loadDAQConfiguration(daq.getSSPConfig().getPair1Config()); + pairsTrigger[1].loadDAQConfiguration(daq.getSSPConfig().getPair2Config()); + nsa = daq.getFADCConfig().getNSA(); + nsb = daq.getFADCConfig().getNSB(); + windowWidth = daq.getFADCConfig().getWindowWidth(); + + // Get the trigger configurations from the DAQ. + SinglesTriggerConfig[] singles = { daq.getSSPConfig().getSingles1Config(), + daq.getSSPConfig().getSingles2Config() }; + PairTriggerConfig[] pairs = { daq.getSSPConfig().getPair1Config(), + daq.getSSPConfig().getPair2Config() }; + + // Update the enabled/disabled statuses. + for(int i = 0; i < 2; i++) { + // Set the trigger enabled status. + pairTriggerEnabled[i] = pairs[i].isEnabled(); + singlesTriggerEnabled[i] = singles[i].isEnabled(); + + // Set the singles cut statuses. + singlesCutsEnabled[i][ENERGY_MIN] = singles[i].getEnergyMinCutConfig().isEnabled(); + singlesCutsEnabled[i][ENERGY_MAX] = singles[i].getEnergyMaxCutConfig().isEnabled(); + singlesCutsEnabled[i][HIT_COUNT] = singles[i].getHitCountCutConfig().isEnabled(); + + // Set the pair cut statuses. + pairCutsEnabled[i][ENERGY_MIN] = pairs[i].getEnergyMinCutConfig().isEnabled(); + pairCutsEnabled[i][ENERGY_MAX] = pairs[i].getEnergyMaxCutConfig().isEnabled(); + pairCutsEnabled[i][HIT_COUNT] = pairs[i].getHitCountCutConfig().isEnabled(); + pairCutsEnabled[i][3 + ENERGY_SUM] = pairs[i].getEnergySumCutConfig().isEnabled(); + pairCutsEnabled[i][3 + ENERGY_DIFF] = pairs[i].getEnergyDifferenceCutConfig().isEnabled(); + pairCutsEnabled[i][3 + ENERGY_SLOPE] = pairs[i].getEnergySlopeCutConfig().isEnabled(); + pairCutsEnabled[i][3 + COPLANARITY] = pairs[i].getCoplanarityCutConfig().isEnabled(); + } + + // Update the trigger plots values. + globalTriggerPlots.setEnergySlopeParamF(0, daq.getSSPConfig().getPair1Config().getEnergySlopeCutConfig().getParameterF()); + globalTriggerPlots.setEnergySlopeParamF(1, daq.getSSPConfig().getPair2Config().getEnergySlopeCutConfig().getParameterF()); + + // Print a DAQ configuration settings header. + System.out.println(); + System.out.println(); + System.out.println("======================================================================"); + System.out.println("=== DAQ Configuration Settings ======================================="); + System.out.println("======================================================================"); + logSettings(); + } + }); + } + + // Print the cluster verification header. + System.out.println(); + System.out.println(); + System.out.println("======================================================================"); + System.out.println("=== Cluster/Trigger Verification Settings ============================"); + System.out.println("======================================================================"); + + // Define the first singles trigger. + singlesTrigger[0] = new TriggerModule(); + singlesTrigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.500); + singlesTrigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 8.191); + singlesTrigger[0].setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 0); + + // Define the second singles trigger. + singlesTrigger[1] = new TriggerModule(); + singlesTrigger[1].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.000); + singlesTrigger[1].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 8.191); + singlesTrigger[1].setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 0); + + // Define the first pairs trigger. + pairsTrigger[0] = new TriggerModule(); + pairsTrigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.000); + pairsTrigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 8.191); + pairsTrigger[0].setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 0); + pairsTrigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, 0.000); + pairsTrigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, 8.191); + pairsTrigger[0].setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, 8.191); + pairsTrigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.000); + pairsTrigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_F, 0.001); + pairsTrigger[0].setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 180); + pairsTrigger[0].setCutValue(TriggerModule.PAIR_TIME_COINCIDENCE, 8); + + // Define the second pairs trigger. + pairsTrigger[1] = new TriggerModule(); + pairsTrigger[1].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.000); + pairsTrigger[1].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 8.191); + pairsTrigger[1].setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 0); + pairsTrigger[1].setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, 0.000); + pairsTrigger[1].setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, 8.191); + pairsTrigger[1].setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, 8.191); + pairsTrigger[1].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.000); + pairsTrigger[1].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_F, 0.001); + pairsTrigger[1].setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 180); + pairsTrigger[1].setCutValue(TriggerModule.PAIR_TIME_COINCIDENCE, 8); + + // Print the initial settings. + logSettings(); + } + + /** + * Prints the total run statistics. + */ + @Override + public void endOfData() { + // Output the statistics. + logStatistics(); + + /* + // Calculate the values needed for the efficiency histogram. + long totalTime = entryList.get(entryList.size()).time / 1000000000; + int entries = (int) (totalTime / (localWindowThreshold / 1000000000)) + 1; + + // Generate a histogram containing the efficiencies. + IHistogram1D[] efficiencyHist = new IHistogram1D[5]; + for(int i = 0; i < 5; i++) { + efficiencyHist[i] = aida.histogram1D("Efficiency " + i, entries, 0.0, totalTime + (localWindowThreshold / 1000000000)); + } + + // Input the efficiencies. + for(EfficiencyEntry entry : entryList) { + for(int i = 0; i < 5; i++) { + efficiencyHist[i].fill(entry.time / 1000000000, entry.efficiency[i]); + } + } + */ + } + + /** + * Gets the banks and clusters from the event. + */ + @Override + public void process(EventHeader event) { + // ========================================================== + // ==== Event Pre-Initialization ============================ + // ========================================================== + + // If DAQ settings are to be used, check if they are initialized + // yet. If not, skip the event. + if(readDAQConfig) { + if(!ConfigurationManager.isInitialized()) { + return; + } + } + + // Reset the candidate cluster lists. + singlesCandidates.clear(); + singlesCandidates.add(new ArrayList<Cluster>()); + singlesCandidates.add(new ArrayList<Cluster>()); + pairCandidates.clear(); + pairCandidates.add(new ArrayList<LCRelation>()); + pairCandidates.add(new ArrayList<LCRelation>()); + + // Increment the total event count. + localStats.sawEvent(event.getTimeStamp()); + globalStats.sawEvent(event.getTimeStamp()); + + // Print the statistics every so often during a run. + if(globalStats.getEventCount() % statPrintInterval == 0) { + logStatistics(); + } + + // Reset the output buffer and print flags. + clusterFail = false; + singlesInternalFail = false; + singlesEfficiencyFail = false; + pairInternalFail = false; + pairEfficiencyFail = false; + OutputLogger.clearLog(); + + // Track the times. + if(startTime == -1) { startTime = event.getTimeStamp(); } + else { endTime = event.getTimeStamp(); } + + + + // ========================================================== + // ==== Output GTP Information ============================== + // ========================================================== + // Print the verification header. - OutputLogger.printNewLine(2); - OutputLogger.println("======================================================================"); - OutputLogger.println("==== FADC/GTP Readout ================================================"); - OutputLogger.println("======================================================================"); - - OutputLogger.println("FADC Hits:"); - for(CalorimeterHit hit : event.get(CalorimeterHit.class, "EcalCalHits")) { - int ix = hit.getIdentifierFieldValue("ix"); - int iy = hit.getIdentifierFieldValue("iy"); - OutputLogger.printf("\tHit at (%3d, %3d) with %7.3f GeV at time %3.0f ns%n", ix, iy, hit.getCorrectedEnergy(), hit.getTime()); - } - OutputLogger.printNewLine(2); - OutputLogger.println("GTP Clusters:"); - for(Cluster cluster : event.get(Cluster.class, clusterCollectionName)) { - OutputLogger.printf("\t%s%n", TriggerDiagnosticUtil.clusterToString(cluster)); - for(CalorimeterHit hit : cluster.getCalorimeterHits()) { - int ix = hit.getIdentifierFieldValue("ix"); - int iy = hit.getIdentifierFieldValue("iy"); - OutputLogger.printf("\t\t> (%3d, %3d) :: %7.3f GeV%n", ix, iy, hit.getCorrectedEnergy()); - } - } - - - - // ========================================================== - // ==== Initialize the Event ================================ - // ========================================================== - + OutputLogger.printNewLine(2); + OutputLogger.println("======================================================================"); + OutputLogger.println("==== FADC/GTP Readout ================================================"); + OutputLogger.println("======================================================================"); + + OutputLogger.println("FADC Hits:"); + for(CalorimeterHit hit : event.get(CalorimeterHit.class, "EcalCalHits")) { + int ix = hit.getIdentifierFieldValue("ix"); + int iy = hit.getIdentifierFieldValue("iy"); + OutputLogger.printf("\tHit at (%3d, %3d) with %7.3f GeV at time %3.0f ns%n", ix, iy, hit.getCorrectedEnergy(), hit.getTime()); + } + OutputLogger.printNewLine(2); + OutputLogger.println("GTP Clusters:"); + for(Cluster cluster : event.get(Cluster.class, clusterCollectionName)) { + OutputLogger.printf("\t%s%n", TriggerDiagnosticUtil.clusterToString(cluster)); + for(CalorimeterHit hit : cluster.getCalorimeterHits()) { + int ix = hit.getIdentifierFieldValue("ix"); + int iy = hit.getIdentifierFieldValue("iy"); + OutputLogger.printf("\t\t> (%3d, %3d) :: %7.3f GeV%n", ix, iy, hit.getCorrectedEnergy()); + } + } + + + + // ========================================================== + // ==== Initialize the Event ================================ + // ========================================================== + // Print the verification header. - OutputLogger.printNewLine(2); - OutputLogger.println("======================================================================"); - OutputLogger.println("==== Cluster/Trigger Verification ===================================="); - OutputLogger.println("======================================================================"); - - - - // ========================================================== - // ==== Obtain SSP and TI Banks ============================= - // ========================================================== - - // Get the SSP clusters. - if(event.hasCollection(GenericObject.class, bankCollectionName)) { - // Get the bank list. - List<GenericObject> bankList = event.get(GenericObject.class, bankCollectionName); - - // Search through the banks and get the SSP and TI banks. - for(GenericObject obj : bankList) { - // If this is an SSP bank, parse it. - if(AbstractIntData.getTag(obj) == SSPData.BANK_TAG) { - sspBank = new SSPData(obj); - } - - // Otherwise, if this is a TI bank, parse it. - else if(AbstractIntData.getTag(obj) == TIData.BANK_TAG) { - tiBank = new TIData(obj); - - tiFlags = new boolean[6]; - if(tiBank.isPulserTrigger()) { - OutputLogger.println("Trigger type :: Pulser"); - tiFlags[TriggerDiagStats.PULSER] = true; - } else if(tiBank.isSingle0Trigger()) { - OutputLogger.println("Trigger type :: Singles 1"); - tiFlags[TriggerDiagStats.SINGLES0] = true; - } else if(tiBank.isSingle1Trigger()) { - OutputLogger.println("Trigger type :: Singles 2"); - tiFlags[TriggerDiagStats.SINGLES1] = true; - } else if(tiBank.isPair0Trigger()) { - OutputLogger.println("Trigger type :: Pair 1"); - tiFlags[TriggerDiagStats.PAIR0] = true; - } else if(tiBank.isPair1Trigger()) { - OutputLogger.println("Trigger type :: Pair 2"); - tiFlags[TriggerDiagStats.PAIR1] = true; - } else if(tiBank.isCalibTrigger()) { - OutputLogger.println("Trigger type :: Cosmic"); - tiFlags[TriggerDiagStats.COSMIC] = true; - } else { - System.err.println("TriggerDiagnosticDriver: Skipping event; no TI trigger source found."); - return; - } - - // Pass the TI triggers to the run statistical data - // manager object. - localStats.getTriggerStats().sawTITriggers(tiFlags); - globalStats.getTriggerStats().sawTITriggers(tiFlags); - } - } - - // If there is an SSP bank, get the list of SSP clusters. - if(sspBank != null) { - sspClusters = sspBank.getClusters(); - if(sspClusters.size() == 1) { - OutputLogger.println("1 SSP cluster found."); - } else { - OutputLogger.printf("%d SSP clusters found.%n", sspClusters.size()); - } - } - } - - // Make sure that both an SSP bank and a TI bank were found. - if(tiBank == null || sspBank == null) { - System.err.println("TriggerDiagnosticDriver :: SEVERE WARNING :: TI bank or SSP bank missing from event!"); - return; - } - - // Output the event number and information. - OutputLogger.printf("Event Number %d (%d)%n", sspBank.getEventNumber(), event.getEventNumber()); - - - - // ========================================================== - // ==== Establish Event Integrity =========================== - // ========================================================== - - // Check that all of the required objects are present. - if(sspBank == null) { - OutputLogger.println("No SSP bank found for this event. No verification will be performed."); - if(verbose) { OutputLogger.printLog(); } - return; - } if(tiBank == null) { - OutputLogger.println("No TI bank found for this event. No verification will be performed."); - if(verbose) { OutputLogger.printLog(); } - return; - } - - - - // ========================================================== - // ==== Check the Noise Level =============================== - // ========================================================== - - // Check if there are hits. - if(event.hasCollection(CalorimeterHit.class, hitCollectionName)) { - // Check if there are more hits than the noise threshold. - if(event.get(CalorimeterHit.class, hitCollectionName).size() >= noiseThreshold) { - localStats.sawNoiseEvent(); - globalStats.sawNoiseEvent(); - OutputLogger.println("Noise event detected. Skipping event..."); - if(verbose) { OutputLogger.printLog(); } - return; - } - } - - - - // ========================================================== - // ==== Obtain Reconstructed Clusters ======================= - // ========================================================== - - // Get the reconstructed clusters. - if(event.hasCollection(Cluster.class, clusterCollectionName)) { - // Get the reconstructed clusters. - List<Cluster> allClusters = event.get(Cluster.class, clusterCollectionName); - - // Keep only the clusters that can be verified. - OutputLogger.println(); - OutputLogger.println("Process cluster for verifiability:"); - reconClusters.clear(); - for(Cluster reconCluster : allClusters) { - // Check that the cluster is within the safe region of the - // FADC readout window. If it is not, it will likely have - // inaccurate energy or hit values and may not produce the - // expected results. - OutputLogger.printf("\t%s", TriggerDiagnosticUtil.clusterToString(reconCluster)); - if(isVerifiable(reconCluster)) { - reconClusters.add(reconCluster); - OutputLogger.println(" [ verifiable ]"); - } else { OutputLogger.println(" [ unverifiable ]"); } - } - - // Output the number of verifiable clusters found. - if(reconClusters.size() == 1) { OutputLogger.println("1 verifiable reconstructed cluster found."); } - else { OutputLogger.printf("%d verifiable reconstructed clusters found.%n", reconClusters.size()); } - - // Output the number of unverifiable clusters found. - int unverifiableClusters = allClusters.size() - reconClusters.size(); - if(unverifiableClusters == 1) { OutputLogger.println("1 unverifiable reconstructed cluster found."); } - else { OutputLogger.printf("%d unverifiable reconstructed clusters found.%n", unverifiableClusters); } - } else { - reconClusters = new ArrayList<Cluster>(0); - OutputLogger.printf("No reconstructed clusters were found for collection \"%s\" in this event.%n", clusterCollectionName); - } - - - - // ========================================================== - // ==== Perform Event Verification ========================== - // ========================================================== - - // Perform the cluster verification step. - if(performClusterVerification) { clusterVerification(); } - - // Get the simulated triggers. - if(event.hasCollection(SimTriggerData.class, "SimTriggers")) { - List<SimTriggerData> stdList = event.get(SimTriggerData.class, "SimTriggers"); - triggerData = stdList.get(0); - } - - // Construct lists of triggers for the SSP clusters and the - // reconstructed clusters. - if(performSinglesTriggerVerification) { - singlesTriggerVerification(); - } - if(performPairTriggerVerification) { - pairTriggerVerification(); - } - - // Track how many events failed due to each type of verification. - if(clusterFail) { - localStats.failedClusterEvent(); - globalStats.failedClusterEvent(); - } if(pairInternalFail || pairEfficiencyFail) { - localStats.failedPairEvent(); - globalStats.failedPairEvent(); - } if(singlesInternalFail || singlesEfficiencyFail) { - localStats.failedSinglesEvent(); - globalStats.failedSinglesEvent(); - } - - - - // ========================================================== - // ==== Perform Event Write-Out ============================= - // ========================================================== - - if(verbose ||(clusterFail && printClusterFail) || - (singlesInternalFail && printSinglesTriggerInternalFail) || - (singlesEfficiencyFail && printSinglesTriggerEfficiencyFail) || - (pairInternalFail && printPairTriggerInternalFail) || - (pairEfficiencyFail && printPairTriggerEfficiencyFail)) { - OutputLogger.printLog(); - } - - - - // ========================================================== - // ==== Process Local Tracked Variables ===================== - // ========================================================== - if(localStats.getDuration() > localWindowThreshold) { - // Write a snapshot of the driver to the event stream. - List<DiagnosticSnapshot> snapshotList = new ArrayList<DiagnosticSnapshot>(2); - snapshotList.add(localStats.getSnapshot()); - snapshotList.add(globalStats.getSnapshot()); - - // Push the snapshot to the data stream. - event.put(diagnosticCollectionName, snapshotList); - - // Store values needed to calculate efficiency. - int[] matched = { - localStats.getClusterStats().getMatches(), - localStats.getTriggerStats().getSingles0Stats().getMatchedReconSimulatedTriggers(), - localStats.getTriggerStats().getSingles1Stats().getMatchedReconSimulatedTriggers(), - localStats.getTriggerStats().getPair0Stats().getMatchedReconSimulatedTriggers(), - localStats.getTriggerStats().getPair1Stats().getMatchedReconSimulatedTriggers() - }; - int[] total = { - localStats.getClusterStats().getReconClusterCount(), - localStats.getTriggerStats().getSingles0Stats().getReconSimulatedTriggers(), - localStats.getTriggerStats().getSingles1Stats().getReconSimulatedTriggers(), - localStats.getTriggerStats().getPair0Stats().getReconSimulatedTriggers(), - localStats.getTriggerStats().getPair1Stats().getReconSimulatedTriggers() - }; - - // Calculate the efficiencies and upper/lower errors. - double[] efficiency = new double[5]; - for(int i = 0; i < 5; i++) { - efficiency[i] = 1.0 * matched[i] / total[i]; - } - - // Get the time for the current snapshot. This is the total - // run time before the snapshot plus half of the snapshot. - long time = globalStats.getDuration() - (localStats.getDuration() / 2); - - // Add them to the appropriate cloud plot. - for(int i = 0; i < 5; i++) { efficiencyTimeHist[i].fill(time, efficiency[i]); } - - // Clear the local statistical data. - localStats.clear(); - } - - - - // ========================================================== - // ==== Write the Candidate Triggers ======================== - // ========================================================== - - // Write the candidates to a collection. - event.put(pairCandidateCollectionName[0], pairCandidates.get(0), LCRelation.class, 0); - event.put(pairCandidateCollectionName[1], pairCandidates.get(1), LCRelation.class, 0); - event.put(singlesCandidateCollectionName[0], singlesCandidates.get(0), Cluster.class, clusterCollectionFlag); - event.put(singlesCandidateCollectionName[1], singlesCandidates.get(1), Cluster.class, clusterCollectionFlag); - } + OutputLogger.printNewLine(2); + OutputLogger.println("======================================================================"); + OutputLogger.println("==== Cluster/Trigger Verification ===================================="); + OutputLogger.println("======================================================================"); + + + + // ========================================================== + // ==== Obtain SSP and TI Banks ============================= + // ========================================================== + + // Get the SSP clusters. + if(event.hasCollection(GenericObject.class, bankCollectionName)) { + // Get the bank list. + List<GenericObject> bankList = event.get(GenericObject.class, bankCollectionName); + + // Search through the banks and get the SSP and TI banks. + for(GenericObject obj : bankList) { + // If this is an SSP bank, parse it. + if(AbstractIntData.getTag(obj) == SSPData.BANK_TAG) { + sspBank = new SSPData(obj); + } + + // Otherwise, if this is a TI bank, parse it. + else if(AbstractIntData.getTag(obj) == TIData.BANK_TAG) { + tiBank = new TIData(obj); + + tiFlags = new boolean[6]; + if(tiBank.isPulserTrigger()) { + OutputLogger.println("Trigger type :: Pulser"); + tiFlags[TriggerDiagStats.PULSER] = true; + } else if(tiBank.isSingle0Trigger()) { + OutputLogger.println("Trigger type :: Singles 1"); + tiFlags[TriggerDiagStats.SINGLES0] = true; + } else if(tiBank.isSingle1Trigger()) { + OutputLogger.println("Trigger type :: Singles 2"); + tiFlags[TriggerDiagStats.SINGLES1] = true; + } else if(tiBank.isPair0Trigger()) { + OutputLogger.println("Trigger type :: Pair 1"); + tiFlags[TriggerDiagStats.PAIR0] = true; + } else if(tiBank.isPair1Trigger()) { + OutputLogger.println("Trigger type :: Pair 2"); + tiFlags[TriggerDiagStats.PAIR1] = true; + } else if(tiBank.isCalibTrigger()) { + OutputLogger.println("Trigger type :: Cosmic"); + tiFlags[TriggerDiagStats.COSMIC] = true; + } else { + System.err.println("TriggerDiagnosticDriver: Skipping event; no TI trigger source found."); + return; + } + + // Pass the TI triggers to the run statistical data + // manager object. + localStats.getTriggerStats().sawTITriggers(tiFlags); + globalStats.getTriggerStats().sawTITriggers(tiFlags); + } + } + + // If there is an SSP bank, get the list of SSP clusters. + if(sspBank != null) { + sspClusters = sspBank.getClusters(); + if(sspClusters.size() == 1) { + OutputLogger.println("1 SSP cluster found."); + } else { + OutputLogger.printf("%d SSP clusters found.%n", sspClusters.size()); + } + } + } + + // Make sure that both an SSP bank and a TI bank were found. + if(tiBank == null || sspBank == null) { + System.err.println("TriggerDiagnosticDriver :: SEVERE WARNING :: TI bank or SSP bank missing from event!"); + return; + } + + // Output the event number and information. + OutputLogger.printf("Event Number %d (%d)%n", sspBank.getEventNumber(), event.getEventNumber()); + + + + // ========================================================== + // ==== Establish Event Integrity =========================== + // ========================================================== + + // Check that all of the required objects are present. + if(sspBank == null) { + OutputLogger.println("No SSP bank found for this event. No verification will be performed."); + if(verbose) { OutputLogger.printLog(); } + return; + } if(tiBank == null) { + OutputLogger.println("No TI bank found for this event. No verification will be performed."); + if(verbose) { OutputLogger.printLog(); } + return; + } + + + + // ========================================================== + // ==== Check the Noise Level =============================== + // ========================================================== + + // Check if there are hits. + if(event.hasCollection(CalorimeterHit.class, hitCollectionName)) { + // Check if there are more hits than the noise threshold. + if(event.get(CalorimeterHit.class, hitCollectionName).size() >= noiseThreshold) { + localStats.sawNoiseEvent(); + globalStats.sawNoiseEvent(); + OutputLogger.println("Noise event detected. Skipping event..."); + if(verbose) { OutputLogger.printLog(); } + return; + } + } + + + + // ========================================================== + // ==== Obtain Reconstructed Clusters ======================= + // ========================================================== + + // Get the reconstructed clusters. + if(event.hasCollection(Cluster.class, clusterCollectionName)) { + // Get the reconstructed clusters. + List<Cluster> allClusters = event.get(Cluster.class, clusterCollectionName); + + // Keep only the clusters that can be verified. + OutputLogger.println(); + OutputLogger.println("Process cluster for verifiability:"); + reconClusters.clear(); + for(Cluster reconCluster : allClusters) { + // Check that the cluster is within the safe region of the + // FADC readout window. If it is not, it will likely have + // inaccurate energy or hit values and may not produce the + // expected results. + OutputLogger.printf("\t%s", TriggerDiagnosticUtil.clusterToString(reconCluster)); + if(isVerifiable(reconCluster)) { + reconClusters.add(reconCluster); + OutputLogger.println(" [ verifiable ]"); + } else { OutputLogger.println(" [ unverifiable ]"); } + } + + // Output the number of verifiable clusters found. + if(reconClusters.size() == 1) { OutputLogger.println("1 verifiable reconstructed cluster found."); } + else { OutputLogger.printf("%d verifiable reconstructed clusters found.%n", reconClusters.size()); } + + // Output the number of unverifiable clusters found. + int unverifiableClusters = allClusters.size() - reconClusters.size(); + if(unverifiableClusters == 1) { OutputLogger.println("1 unverifiable reconstructed cluster found."); } + else { OutputLogger.printf("%d unverifiable reconstructed clusters found.%n", unverifiableClusters); } + } else { + reconClusters = new ArrayList<Cluster>(0); + OutputLogger.printf("No reconstructed clusters were found for collection \"%s\" in this event.%n", clusterCollectionName); + } + + + + // ========================================================== + // ==== Perform Event Verification ========================== + // ========================================================== + + // Perform the cluster verification step. + if(performClusterVerification) { clusterVerification(); } + + // Get the simulated triggers. + if(event.hasCollection(SimTriggerData.class, "SimTriggers")) { + List<SimTriggerData> stdList = event.get(SimTriggerData.class, "SimTriggers"); + triggerData = stdList.get(0); + } + + // Construct lists of triggers for the SSP clusters and the + // reconstructed clusters. + if(performSinglesTriggerVerification) { + singlesTriggerVerification(); + } + if(performPairTriggerVerification) { + pairTriggerVerification(); + } + + // Track how many events failed due to each type of verification. + if(clusterFail) { + localStats.failedClusterEvent(); + globalStats.failedClusterEvent(); + } if(pairInternalFail || pairEfficiencyFail) { + localStats.failedPairEvent(); + globalStats.failedPairEvent(); + } if(singlesInternalFail || singlesEfficiencyFail) { + localStats.failedSinglesEvent(); + globalStats.failedSinglesEvent(); + } + + + + // ========================================================== + // ==== Perform Event Write-Out ============================= + // ========================================================== + + if(verbose ||(clusterFail && printClusterFail) || + (singlesInternalFail && printSinglesTriggerInternalFail) || + (singlesEfficiencyFail && printSinglesTriggerEfficiencyFail) || + (pairInternalFail && printPairTriggerInternalFail) || + (pairEfficiencyFail && printPairTriggerEfficiencyFail)) { + OutputLogger.printLog(); + } + + + + // ========================================================== + // ==== Process Local Tracked Variables ===================== + // ========================================================== + if(localStats.getDuration() > localWindowThreshold) { + // Write a snapshot of the driver to the event stream. + List<DiagnosticSnapshot> snapshotList = new ArrayList<DiagnosticSnapshot>(2); + snapshotList.add(localStats.getSnapshot()); + snapshotList.add(globalStats.getSnapshot()); + + // Push the snapshot to the data stream. + event.put(diagnosticCollectionName, snapshotList); + + // Store values needed to calculate efficiency. + int[] matched = { + localStats.getClusterStats().getMatches(), + localStats.getTriggerStats().getSingles0Stats().getMatchedReconSimulatedTriggers(), + localStats.getTriggerStats().getSingles1Stats().getMatchedReconSimulatedTriggers(), + localStats.getTriggerStats().getPair0Stats().getMatchedReconSimulatedTriggers(), + localStats.getTriggerStats().getPair1Stats().getMatchedReconSimulatedTriggers() + }; + int[] total = { + localStats.getClusterStats().getReconClusterCount(), + localStats.getTriggerStats().getSingles0Stats().getReconSimulatedTriggers(), + localStats.getTriggerStats().getSingles1Stats().getReconSimulatedTriggers(), + localStats.getTriggerStats().getPair0Stats().getReconSimulatedTriggers(), + localStats.getTriggerStats().getPair1Stats().getReconSimulatedTriggers() + }; + + // Calculate the efficiencies and upper/lower errors. + double[] efficiency = new double[5]; + for(int i = 0; i < 5; i++) { + efficiency[i] = 1.0 * matched[i] / total[i]; + } + + // Get the time for the current snapshot. This is the total + // run time before the snapshot plus half of the snapshot. + long time = globalStats.getDuration() - (localStats.getDuration() / 2); + + // Add them to the appropriate cloud plot. + for(int i = 0; i < 5; i++) { efficiencyTimeHist[i].fill(time, efficiency[i]); } + + // Clear the local statistical data. + localStats.clear(); + } + + + + // ========================================================== + // ==== Write the Candidate Triggers ======================== + // ========================================================== + + // Write the candidates to a collection. + event.put(pairCandidateCollectionName[0], pairCandidates.get(0), LCRelation.class, 0); + event.put(pairCandidateCollectionName[1], pairCandidates.get(1), LCRelation.class, 0); + event.put(singlesCandidateCollectionName[0], singlesCandidates.get(0), Cluster.class, clusterCollectionFlag); + event.put(singlesCandidateCollectionName[1], singlesCandidates.get(1), Cluster.class, clusterCollectionFlag); + } - public void setPrintResultsEveryNEvents(int n) { - statPrintInterval = n; - } - - public void setPrintOnClusterFailure(boolean state) { - printClusterFail = state; - } - - public void setPrintOnSinglesEfficiencyFailure(boolean state) { - printSinglesTriggerEfficiencyFail = state; - } - - public void setPrintOnSinglesSSPFailure(boolean state) { - printSinglesTriggerInternalFail = state; - } - - public void setPrintOnPairEfficiencyFailure(boolean state) { - printPairTriggerEfficiencyFail = state; - } - - public void setPrintOnPairSSPFailure(boolean state) { - printPairTriggerInternalFail = state; - } - - public void setVerbose(boolean state) { - verbose = state; - } - - public void setHitCollectionName(String hitCollectionName) { - this.hitCollectionName = hitCollectionName; - } - - public void setClusterCollectionName(String clusterCollectionName) { - this.clusterCollectionName = clusterCollectionName; - } - - public void setBankCollectionName(String bankCollectionName) { - this.bankCollectionName = bankCollectionName; - } - - public void setNoiseThresholdCount(int noiseHits) { - noiseThreshold = noiseHits; - } - - public void setHitAcceptanceWindow(int window) { - hitAcceptance = window; - } - - public void setEnergyAcceptanceWindow(double window) { - energyAcceptance = window; - } - - public void setEnforceStrictTimeCompliance(boolean state) { - enforceTimeCompliance = state; - } - - public void setReadDAQConfig(boolean state) { - readDAQConfig = state; - } - - public void setLocalWindowThresholdMilliseconds(int localWindowThreshold) { - this.localWindowThreshold = localWindowThreshold; - } - - /** - * Attempts to match all reconstructed clusters that are safely - * within the integration window with clusters reported by the SSP. - * Method also tracks the ratio of valid reconstructed clusters to - * matches found.<br/> - * <br/> - * Note that unmatched SSP clusters are ignored. Since these may - * or may not correspond to reconstructed clusters that occur in - * the forbidden time region, it is impossible to say whether or - * not these legitimately failed to match or not. - */ - private void clusterVerification() { - // ========================================================== - // ==== Initialize Cluster Verification ===================== - // ========================================================== - - // Print the cluster verification header. - OutputLogger.printNewLine(2); - OutputLogger.println("======================================================================"); - OutputLogger.println("=== Cluster Verification ============================================="); - OutputLogger.println("======================================================================"); - - - - // ========================================================== - // ==== Perform Cluster Matching ============================ - // ========================================================== - - // Track the number of cluster pairs that were matched and that - // failed by failure type. - DetailedClusterEvent event; - - if(enforceTimeCompliance) { - event = matchClustersTimeCompliant(reconClusters, sspClusters, energyAcceptance, hitAcceptance); - } else { - event = matchClusters(reconClusters, sspClusters, energyAcceptance, hitAcceptance); - } - - // Add the event results to the global results. - localStats.getClusterStats().addEvent(event); - globalStats.getClusterStats().addEvent(event); - localStats.getClusterStats().sawSSPClusters(sspClusters.size()); - globalStats.getClusterStats().sawSSPClusters(sspClusters.size()); - localStats.getClusterStats().sawReconClusters(reconClusters.size()); - globalStats.getClusterStats().sawReconClusters(reconClusters.size()); - - - - // ========================================================== - // ==== Output Event Summary ================================ - // ========================================================== - - // Print the valid reconstructed clusters and populate their - // distribution graphs. - OutputLogger.println(); - OutputLogger.println("Verified Reconstructed Clusters:"); - if(!reconClusters.isEmpty()) { - for(Cluster reconCluster : reconClusters) { - OutputLogger.printf("\t%s%n", TriggerDiagnosticUtil.clusterToString(reconCluster)); - } - } else { OutputLogger.println("\tNone"); } - - // Print the SSP clusters and populate their distribution graphs. - OutputLogger.println("SSP Clusters:"); - if(!sspClusters.isEmpty()) { - for(SSPCluster sspCluster : sspClusters) { - OutputLogger.printf("\t%s%n", TriggerDiagnosticUtil.clusterToString(sspCluster)); - } - } else { OutputLogger.println("\tNone"); } - - // Print the matched clusters. - OutputLogger.println("Matched Clusters:"); - if(event.getMatches() != 0) { - // Iterate over the matched pairs. - for(ClusterMatchedPair pair : event.getClusterPairs()) { - // If the pair is a match, print it out. - if(pair.isMatch()) { - OutputLogger.printf("\t%s --> %s%n", - TriggerDiagnosticUtil.clusterToString(pair.getReconstructedCluster()), - TriggerDiagnosticUtil.clusterToString(pair.getSSPCluster())); - } - } - } - else { OutputLogger.println("\tNone"); } - - // Print event statistics. - OutputLogger.println(); - OutputLogger.println("Event Statistics:"); - OutputLogger.printf("\tRecon Clusters :: %d%n", reconClusters.size()); - OutputLogger.printf("\tClusters Matched :: %d%n", event.getMatches()); - OutputLogger.printf("\tFailed (Position) :: %d%n", event.getPositionFailures()); - OutputLogger.printf("\tFailed (Time) :: %d%n", event.getTimeFailures()); - OutputLogger.printf("\tFailed (Energy) :: %d%n", event.getEnergyFailures()); - OutputLogger.printf("\tFailed (Hit Count) :: %d%n", event.getHitCountFailures()); - OutputLogger.printf("\tCluster Efficiency :: %3.0f%%%n", 100.0 * event.getMatches() / reconClusters.size()); - - // Note whether there was a cluster match failure. - if(event.isFailState() || event.getMatches() - reconClusters.size() != 0) { - clusterFail = true; - } - - - - // TEMP :: Populate the cluster diagnostic plots. - - // Populate the ALL cluster plots. - for(Cluster cluster : reconClusters) { - clusterHitPlot[RECON][ALL].fill(cluster.getCalorimeterHits().size()); - clusterEnergyPlot[RECON][ALL].fill(cluster.getEnergy()); - clusterTimePlot[RECON][ALL].fill(cluster.getCalorimeterHits().get(0).getTime()); - Point position = TriggerDiagnosticUtil.getClusterPosition(cluster); - clusterPositionPlot[RECON][ALL].fill(position.x, position.y); - } - for(SSPCluster cluster : sspClusters) { - clusterHitPlot[SSP][ALL].fill(cluster.getHitCount()); - clusterEnergyPlot[SSP][ALL].fill(cluster.getEnergy()); - clusterTimePlot[SSP][ALL].fill(cluster.getTime()); - clusterPositionPlot[SSP][ALL].fill(cluster.getXIndex(), cluster.getYIndex()); - } - - // Populate the matched and failed plots. - for(ClusterMatchedPair pair : event.getClusterPairs()) { - if(pair.getFirstElement() != null && pair.getSecondElement() != null) { - double energyDiff = pair.getSecondElement().getEnergy() - pair.getFirstElement().getEnergy(); - int hitDiff = pair.getSecondElement().getHitCount() - pair.getFirstElement().getCalorimeterHits().size(); - energyhitDiffPlot[ALL].fill(energyDiff, hitDiff); - } - - if(pair.isMatch()) { - if(pair.getFirstElement() != null) { - clusterHitPlot[RECON][MATCHED].fill(pair.getFirstElement().getCalorimeterHits().size()); - clusterEnergyPlot[RECON][MATCHED].fill(pair.getFirstElement().getEnergy()); - clusterTimePlot[RECON][MATCHED].fill(pair.getFirstElement().getCalorimeterHits().get(0).getTime()); - Point position = TriggerDiagnosticUtil.getClusterPosition(pair.getFirstElement()); - clusterPositionPlot[RECON][MATCHED].fill(position.x, position.y); - } if(pair.getSecondElement() != null) { - clusterHitPlot[SSP][MATCHED].fill(pair.getSecondElement().getHitCount()); - clusterEnergyPlot[SSP][MATCHED].fill(pair.getSecondElement().getEnergy()); - clusterTimePlot[SSP][MATCHED].fill(pair.getSecondElement().getTime()); - clusterPositionPlot[SSP][MATCHED].fill(pair.getSecondElement().getXIndex(), pair.getSecondElement().getYIndex()); - } if(pair.getFirstElement() != null && pair.getSecondElement() != null) { - double energyDiff = pair.getSecondElement().getEnergy() - pair.getFirstElement().getEnergy(); - int hitDiff = pair.getSecondElement().getHitCount() - pair.getFirstElement().getCalorimeterHits().size(); - energyhitDiffPlot[MATCHED].fill(energyDiff, hitDiff); - } - } else { - if(pair.getFirstElement() != null) { - clusterHitPlot[RECON][FAILED].fill(pair.getFirstElement().getCalorimeterHits().size()); - clusterEnergyPlot[RECON][FAILED].fill(pair.getFirstElement().getEnergy()); - clusterTimePlot[RECON][FAILED].fill(pair.getFirstElement().getCalorimeterHits().get(0).getTime()); - Point position = TriggerDiagnosticUtil.getClusterPosition(pair.getFirstElement()); - clusterPositionPlot[RECON][FAILED].fill(position.x, position.y); - } if(pair.getSecondElement() != null) { - clusterHitPlot[SSP][FAILED].fill(pair.getSecondElement().getHitCount()); - clusterEnergyPlot[SSP][FAILED].fill(pair.getSecondElement().getEnergy()); - clusterTimePlot[SSP][FAILED].fill(pair.getSecondElement().getTime()); - clusterPositionPlot[SSP][FAILED].fill(pair.getSecondElement().getXIndex(), pair.getSecondElement().getYIndex()); - } if(pair.getFirstElement() != null && pair.getSecondElement() != null) { - double energyDiff = pair.getSecondElement().getEnergy() - pair.getFirstElement().getEnergy(); - int hitDiff = pair.getSecondElement().getHitCount() - pair.getFirstElement().getCalorimeterHits().size(); - energyhitDiffPlot[FAILED].fill(energyDiff, hitDiff); - } - } - } - } - - /** + public void setPrintResultsEveryNEvents(int n) { + statPrintInterval = n; + } + + public void setPrintOnClusterFailure(boolean state) { + printClusterFail = state; + } + + public void setPrintOnSinglesEfficiencyFailure(boolean state) { + printSinglesTriggerEfficiencyFail = state; + } + + public void setPrintOnSinglesSSPFailure(boolean state) { + printSinglesTriggerInternalFail = state; + } + + public void setPrintOnPairEfficiencyFailure(boolean state) { + printPairTriggerEfficiencyFail = state; + } + + public void setPrintOnPairSSPFailure(boolean state) { + printPairTriggerInternalFail = state; + } + + public void setVerbose(boolean state) { + verbose = state; + } + + public void setHitCollectionName(String hitCollectionName) { + this.hitCollectionName = hitCollectionName; + } + + public void setClusterCollectionName(String clusterCollectionName) { + this.clusterCollectionName = clusterCollectionName; + } + + public void setBankCollectionName(String bankCollectionName) { + this.bankCollectionName = bankCollectionName; + } + + public void setNoiseThresholdCount(int noiseHits) { + noiseThreshold = noiseHits; + } + + public void setHitAcceptanceWindow(int window) { + hitAcceptance = window; + } + + public void setEnergyAcceptanceWindow(double window) { + energyAcceptance = window; + } + + public void setEnforceStrictTimeCompliance(boolean state) { + enforceTimeCompliance = state; + } + + public void setReadDAQConfig(boolean state) { + readDAQConfig = state; + } + + public void setLocalWindowThresholdMilliseconds(int localWindowThreshold) { + this.localWindowThreshold = localWindowThreshold; + } + + /** + * Attempts to match all reconstructed clusters that are safely + * within the integration window with clusters reported by the SSP. + * Method also tracks the ratio of valid reconstructed clusters to + * matches found.<br/> + * <br/> + * Note that unmatched SSP clusters are ignored. Since these may + * or may not correspond to reconstructed clusters that occur in + * the forbidden time region, it is impossible to say whether or + * not these legitimately failed to match or not. + */ + private void clusterVerification() { + // ========================================================== + // ==== Initialize Cluster Verification ===================== + // ========================================================== + + // Print the cluster verification header. + OutputLogger.printNewLine(2); + OutputLogger.println("======================================================================"); + OutputLogger.println("=== Cluster Verification ============================================="); + OutputLogger.println("======================================================================"); + + + + // ========================================================== + // ==== Perform Cluster Matching ============================ + // ========================================================== + + // Track the number of cluster pairs that were matched and that + // failed by failure type. + DetailedClusterEvent event; + + if(enforceTimeCompliance) { + event = matchClustersTimeCompliant(reconClusters, sspClusters, energyAcceptance, hitAcceptance); + } else { + event = matchClusters(reconClusters, sspClusters, energyAcceptance, hitAcceptance); + } + + // Add the event results to the global results. + localStats.getClusterStats().addEvent(event); + globalStats.getClusterStats().addEvent(event); + localStats.getClusterStats().sawSSPClusters(sspClusters.size()); + globalStats.getClusterStats().sawSSPClusters(sspClusters.size()); + localStats.getClusterStats().sawReconClusters(reconClusters.size()); + globalStats.getClusterStats().sawReconClusters(reconClusters.size()); + + + + // ========================================================== + // ==== Output Event Summary ================================ + // ========================================================== + + // Print the valid reconstructed clusters and populate their + // distribution graphs. + OutputLogger.println(); + OutputLogger.println("Verified Reconstructed Clusters:"); + if(!reconClusters.isEmpty()) { + for(Cluster reconCluster : reconClusters) { + OutputLogger.printf("\t%s%n", TriggerDiagnosticUtil.clusterToString(reconCluster)); + } + } else { OutputLogger.println("\tNone"); } + + // Print the SSP clusters and populate their distribution graphs. + OutputLogger.println("SSP Clusters:"); + if(!sspClusters.isEmpty()) { + for(SSPCluster sspCluster : sspClusters) { + OutputLogger.printf("\t%s%n", TriggerDiagnosticUtil.clusterToString(sspCluster)); + } + } else { OutputLogger.println("\tNone"); } + + // Print the matched clusters. + OutputLogger.println("Matched Clusters:"); + if(event.getMatches() != 0) { + // Iterate over the matched pairs. + for(ClusterMatchedPair pair : event.getClusterPairs()) { + // If the pair is a match, print it out. + if(pair.isMatch()) { + OutputLogger.printf("\t%s --> %s%n", + TriggerDiagnosticUtil.clusterToString(pair.getReconstructedCluster()), + TriggerDiagnosticUtil.clusterToString(pair.getSSPCluster())); + } + } + } + else { OutputLogger.println("\tNone"); } + + // Print event statistics. + OutputLogger.println(); + OutputLogger.println("Event Statistics:"); + OutputLogger.printf("\tRecon Clusters :: %d%n", reconClusters.size()); + OutputLogger.printf("\tClusters Matched :: %d%n", event.getMatches()); + OutputLogger.printf("\tFailed (Position) :: %d%n", event.getPositionFailures()); + OutputLogger.printf("\tFailed (Time) :: %d%n", event.getTimeFailures()); + OutputLogger.printf("\tFailed (Energy) :: %d%n", event.getEnergyFailures()); + OutputLogger.printf("\tFailed (Hit Count) :: %d%n", event.getHitCountFailures()); + OutputLogger.printf("\tCluster Efficiency :: %3.0f%%%n", 100.0 * event.getMatches() / reconClusters.size()); + + // Note whether there was a cluster match failure. + if(event.isFailState() || event.getMatches() - reconClusters.size() != 0) { + clusterFail = true; + } + + + + // TEMP :: Populate the cluster diagnostic plots. + + // Populate the ALL cluster plots. + for(Cluster cluster : reconClusters) { + clusterHitPlot[RECON][ALL].fill(cluster.getCalorimeterHits().size()); + clusterEnergyPlot[RECON][ALL].fill(cluster.getEnergy()); + clusterTimePlot[RECON][ALL].fill(cluster.getCalorimeterHits().get(0).getTime()); + Point position = TriggerDiagnosticUtil.getClusterPosition(cluster); + clusterPositionPlot[RECON][ALL].fill(position.x, position.y); + } + for(SSPCluster cluster : sspClusters) { + clusterHitPlot[SSP][ALL].fill(cluster.getHitCount()); + clusterEnergyPlot[SSP][ALL].fill(cluster.getEnergy()); + clusterTimePlot[SSP][ALL].fill(cluster.getTime()); + clusterPositionPlot[SSP][ALL].fill(cluster.getXIndex(), cluster.getYIndex()); + } + + // Populate the matched and failed plots. + for(ClusterMatchedPair pair : event.getClusterPairs()) { + if(pair.getFirstElement() != null && pair.getSecondElement() != null) { + double energyDiff = pair.getSecondElement().getEnergy() - pair.getFirstElement().getEnergy(); + int hitDiff = pair.getSecondElement().getHitCount() - pair.getFirstElement().getCalorimeterHits().size(); + energyhitDiffPlot[ALL].fill(energyDiff, hitDiff); + } + + if(pair.isMatch()) { + if(pair.getFirstElement() != null) { + clusterHitPlot[RECON][MATCHED].fill(pair.getFirstElement().getCalorimeterHits().size()); + clusterEnergyPlot[RECON][MATCHED].fill(pair.getFirstElement().getEnergy()); + clusterTimePlot[RECON][MATCHED].fill(pair.getFirstElement().getCalorimeterHits().get(0).getTime()); + Point position = TriggerDiagnosticUtil.getClusterPosition(pair.getFirstElement()); + clusterPositionPlot[RECON][MATCHED].fill(position.x, position.y); + } if(pair.getSecondElement() != null) { + clusterHitPlot[SSP][MATCHED].fill(pair.getSecondElement().getHitCount()); + clusterEnergyPlot[SSP][MATCHED].fill(pair.getSecondElement().getEnergy()); + clusterTimePlot[SSP][MATCHED].fill(pair.getSecondElement().getTime()); + clusterPositionPlot[SSP][MATCHED].fill(pair.getSecondElement().getXIndex(), pair.getSecondElement().getYIndex()); + } if(pair.getFirstElement() != null && pair.getSecondElement() != null) { + double energyDiff = pair.getSecondElement().getEnergy() - pair.getFirstElement().getEnergy(); + int hitDiff = pair.getSecondElement().getHitCount() - pair.getFirstElement().getCalorimeterHits().size(); + energyhitDiffPlot[MATCHED].fill(energyDiff, hitDiff); + } + } else { + if(pair.getFirstElement() != null) { + clusterHitPlot[RECON][FAILED].fill(pair.getFirstElement().getCalorimeterHits().size()); + clusterEnergyPlot[RECON][FAILED].fill(pair.getFirstElement().getEnergy()); + clusterTimePlot[RECON][FAILED].fill(pair.getFirstElement().getCalorimeterHits().get(0).getTime()); + Point position = TriggerDiagnosticUtil.getClusterPosition(pair.getFirstElement()); + clusterPositionPlot[RECON][FAILED].fill(position.x, position.y); + } if(pair.getSecondElement() != null) { + clusterHitPlot[SSP][FAILED].fill(pair.getSecondElement().getHitCount()); + clusterEnergyPlot[SSP][FAILED].fill(pair.getSecondElement().getEnergy()); + clusterTimePlot[SSP][FAILED].fill(pair.getSecondElement().getTime()); + clusterPositionPlot[SSP][FAILED].fill(pair.getSecondElement().getXIndex(), pair.getSecondElement().getYIndex()); + } if(pair.getFirstElement() != null && pair.getSecondElement() != null) { + double energyDiff = pair.getSecondElement().getEnergy() - pair.getFirstElement().getEnergy(); + int hitDiff = pair.getSecondElement().getHitCount() - pair.getFirstElement().getCalorimeterHits().size(); + energyhitDiffPlot[FAILED].fill(energyDiff, hitDiff); + } + } + } + } + + /** * Performs cluster matching between a collection of reconstructed - * clusters and a collection of SSP clusters with an algorithm that - * ignores the times reported for each cluster. - * @param reconClusters - A collection of reconstructed clusters. - * @param sspClusters - A collection of SSP clusters. - * @param energyWindow - The window of allowed deviation between - * the reconstructed cluster and SSP cluster energies. - * @param hitWindow - The window of allowed deviation between - * the reconstructed cluster and SSP cluster hit counts. - * @return Returns the cluster matching results stored inside a - * <code>clusterMatchEvent</code> object. - */ - private static final DetailedClusterEvent matchClusters(Collection<Cluster> reconClusters, - Collection<SSPCluster> sspClusters, double energyWindow, int hitWindow) { - // Track the number of cluster pairs that were matched and that - // failed by failure type. - DetailedClusterEvent event = new DetailedClusterEvent(); - - // Create maps to link cluster position to the list of clusters - // that were found at that location. - Map<Point, List<Cluster>> reconClusterMap = new HashMap<Point, List<Cluster>>(reconClusters.size()); - Map<Point, List<SSPCluster>> sspClusterMap = new HashMap<Point, List<SSPCluster>>(reconClusters.size()); - - // Populate the reconstructed cluster map. - for(Cluster reconCluster : reconClusters) { - // Get the cluster position. - Point position = new Point(TriggerDiagnosticUtil.getXIndex(reconCluster), - TriggerDiagnosticUtil.getYIndex(reconCluster)); - - // Get the list for this cluster position. - List<Cluster> reconList = reconClusterMap.get(position); - if(reconList == null) { - reconList = new ArrayList<Cluster>(); - reconClusterMap.put(position, reconList); - } - - // Add the cluster to the list. - reconList.add(reconCluster); - } - - // Populate the SSP cluster map. - for(SSPCluster sspCluster : sspClusters) { - // Get the cluster position. - Point position = new Point(sspCluster.getXIndex(), sspCluster.getYIndex()); - - // Get the list for this cluster position. - List<SSPCluster> sspList = sspClusterMap.get(position); - if(sspList == null) { - sspList = new ArrayList<SSPCluster>(); - sspClusterMap.put(position, sspList); - } - - // Add the cluster to the list. - sspList.add(sspCluster); - } - - // For each reconstructed cluster, attempt to match the clusters - // with SSP clusters at the same position. - positionLoop: - for(Entry<Point, List<Cluster>> clusterSet : reconClusterMap.entrySet()) { - // Get the reconstructed and SSP clusters at this position. - List<Cluster> reconList = clusterSet.getValue(); - List<SSPCluster> sspList = sspClusterMap.get(clusterSet.getKey()); - - // Print the crystal position header. - OutputLogger.println(); - OutputLogger.printf("Considering clusters at (%3d, %3d)%n", clusterSet.getKey().x, clusterSet.getKey().y); - - // If there are no SSP clusters, then matching fails by - // reason of position. The remainder of the loop may be - // skipped, since there is nothing to check. - if(sspList == null || sspList.isEmpty()) { - event.pairFailPosition(reconList.size()); - continue positionLoop; - } - - // Get all possible permutations of SSP clusters. - List<List<Pair<Cluster, SSPCluster>>> permutations = getPermutations(reconList, sspList); - - // Print the information for this crystal position. - OutputLogger.printf("\tRecon Clusters :: %d%n", reconList.size()); - OutputLogger.printf("\tSSP Clusters :: %d%n", sspList.size()); - OutputLogger.printf("\tPermutations :: %d%n", permutations.size()); - - // Track the plotted values for the current best permutation. - DetailedClusterEvent bestPerm = null; - - // Iterate over the permutations and find the permutation - // that produces the best possible result when compared to - // the reconstructed clusters. - int permIndex = 0; - for(List<Pair<Cluster, SSPCluster>> pairs : permutations) { - // Update the current permutation number. - permIndex++; - - // Track the plot values for this permutation. - DetailedClusterEvent perm = new DetailedClusterEvent(); - - // Try to match each pair. - pairLoop: - for(Pair<Cluster, SSPCluster> pair : pairs) { - // Print the current reconstructed/SSP cluster pair. - OutputLogger.printf("\tP%d :: %s --> %s", permIndex, - pair.getFirstElement() == null ? "None" : TriggerDiagnosticUtil.clusterToString(pair.getFirstElement()), - pair.getSecondElement() == null ? "None" : TriggerDiagnosticUtil.clusterToString(pair.getSecondElement())); - - // If either cluster in the pair is null, there - // are not enough clusters to perform this match. - if(pair.getFirstElement() == null || pair.getSecondElement() == null) { - // Log the result. - OutputLogger.printf(" [ %18s ]%n", "failure: unpaired"); - - // An unpaired SSP cluster does not necessarily - // represent a problem. Often, this just means - // that the SSP cluster's matching reconstructed - // cluster is outside the verification window. - if(pair.getSecondElement() == null) { - perm.pairFailPosition(pair.getFirstElement(), pair.getSecondElement()); - } - - // Skip the rest of the checks. - continue pairLoop; - } - - // Check if the reconstructed cluster has an energy - // within the allotted threshold of the SSP cluster. - if(pair.getSecondElement().getEnergy() >= pair.getFirstElement().getEnergy() - energyWindow && - pair.getSecondElement().getEnergy() <= pair.getFirstElement().getEnergy() + energyWindow) { - - // Check that the hit count of the reconstructed - // is within the allotted threshold of the SSP - // cluster. - if(pair.getSecondElement().getHitCount() >= pair.getFirstElement().getCalorimeterHits().size() - hitWindow && - pair.getSecondElement().getHitCount() <= pair.getFirstElement().getCalorimeterHits().size() + hitWindow) { - // Designate the pair as a match. - perm.pairMatch(pair.getFirstElement(), pair.getSecondElement()); - OutputLogger.printf(" [ %18s ]%n", "success: matched"); - } else { - perm.pairFailHitCount(pair.getFirstElement(), pair.getSecondElement()); - OutputLogger.printf(" [ %18s ]%n", "failure: hit count"); - } // End hit count check. - } else { - perm.pairFailEnergy(pair.getFirstElement(), pair.getSecondElement()); - OutputLogger.printf(" [ %18s ]%n", "failure: energy"); - } // End energy check. - } // End Pair Loop - - // Print the results of the permutation. - OutputLogger.printf("\t\tPermutation Matched :: %d%n", perm.getMatches()); - OutputLogger.printf("\t\tPermutation Energy :: %d%n", perm.getEnergyFailures()); - OutputLogger.printf("\t\tPermutation Hit Count :: %d%n", perm.getHitCountFailures()); - - // Check whether the results from this permutation - // exceed the quality of the last best results. A - // greater number of matches is always better. If the - // matches are the same, select the one with fewer - // failures due to energy. - bestPerm = getBestPermutation(bestPerm, perm); - } // End Permutation Loop - - // Print the final results for the position. - OutputLogger.printf("\tPosition Matched :: %d%n", bestPerm.getMatches()); - OutputLogger.printf("\tPosition Energy :: %d%n", bestPerm.getEnergyFailures()); - OutputLogger.printf("\tPosition Hit Count :: %d%n", bestPerm.getHitCountFailures()); - - // Add the results from the best-matched permutation - // to the event efficiency results. - event.addEvent(bestPerm); - } // End Crystal Position Loop - - // Return the cluster match summary. - return event; - } - - /** - * Performs cluster matching between a collection of reconstructed - * clusters and a collection of SSP clusters using the strictly - * time-compliant algorithm. - * @param reconClusters - A collection of reconstructed clusters. - * @param sspClusters - A collection of SSP clusters. - * @param energyWindow - The window of allowed deviation between - * the reconstructed cluster and SSP cluster energies. - * @param hitWindow - The window of allowed deviation between - * the reconstructed cluster and SSP cluster hit counts. - * @return Returns the cluster matching results stored inside a - * <code>clusterMatchEvent</code> object. - */ - private static final DetailedClusterEvent matchClustersTimeCompliant(Collection<Cluster> reconClusters, - Collection<SSPCluster> sspClusters, double energyWindow, int hitWindow) { - // Track the number of cluster pairs that were matched and that - // failed by failure type. - DetailedClusterEvent event = new DetailedClusterEvent(); - - // Store the clusters which have been successfully paired. - Set<SSPCluster> sspMatched = new HashSet<SSPCluster>(sspClusters.size()); - - // Find reconstructed/SSP cluster matched pairs. - reconLoop: - for(Cluster reconCluster : reconClusters) { - // Track whether a position-matched cluster was found. - boolean matchedPosition = false; - - // VERBOSE :: Output the cluster being matched. - OutputLogger.printf("Considering %s%n", TriggerDiagnosticUtil.clusterToString(reconCluster)); - - // Search through the SSP clusters for a matching cluster. - sspLoop: - for(SSPCluster sspCluster : sspClusters) { - // VERBOSE :: Output the SSP cluster being considered. - OutputLogger.printf("\t%s ", TriggerDiagnosticUtil.clusterToString(sspCluster)); - - // If this cluster has been paired, skip it. - if(sspMatched.contains(sspCluster)) { - OutputLogger.printf("[ %7s; %9s ]%n", "fail", "matched"); - continue sspLoop; - } - - // Matched clusters must have the same position. - if(TriggerDiagnosticUtil.getXIndex(reconCluster) != sspCluster.getXIndex() - || TriggerDiagnosticUtil.getYIndex(reconCluster) != sspCluster.getYIndex()) { - OutputLogger.printf("[ %7s; %9s ]%n", "fail", "position"); - continue sspLoop; - } - - // Note that a cluster was found at this position. - matchedPosition = true; - - // Matched clusters must have the same time-stamp. - if(reconCluster.getCalorimeterHits().get(0).getTime() != sspCluster.getTime()) { - OutputLogger.printf("[ %7s; %9s ]%n", "fail", "time"); - continue sspLoop; - } - - // Clusters that pass all of the above checks are the - // same cluster. - sspMatched.add(sspCluster); - - // Check that the clusters are sufficiently close in - // energy to one another. - if(sspCluster.getEnergy() >= reconCluster.getEnergy() - energyWindow - && sspCluster.getEnergy() <= reconCluster.getEnergy() + energyWindow) { - // If a cluster matches in energy, check that it - // is also sufficiently close in hit count. - if(sspCluster.getHitCount() >= reconCluster.getCalorimeterHits().size() - hitWindow && - sspCluster.getHitCount() <= reconCluster.getCalorimeterHits().size() + hitWindow) { - // The cluster is a match. - event.pairMatch(reconCluster, sspCluster); - OutputLogger.printf("[ %7s; %9s ]%n", "success", "matched"); - continue reconLoop; - } else { - event.pairFailHitCount(reconCluster, sspCluster); - OutputLogger.printf("[ %7s; %9s ]%n", "fail", "hit count"); - continue reconLoop; - } // End hit count check. - } else { - event.pairFailEnergy(reconCluster, sspCluster); - OutputLogger.printf("[ %7s; %9s ]%n", "fail", "energy"); - continue reconLoop; - } // End energy check. - }// End SSP loop. - - // If the reconstructed cluster has not been matched, check - // if a cluster was found at the same position. If not, then - // the cluster fails by reason of position. - if(!matchedPosition) { - event.pairFailPosition(reconCluster, null); - } - - // Otherwise, the cluster had a potential matched, but the - // time-stamps were off. The cluster fails by reason of time. - else { - event.pairFailTime(reconCluster, null); - } - } // End recon loop. - - // Return the populated match event. - return event; - } - - /** - * Checks triggers simulated on SSP clusters against the SSP bank's - * reported triggers to verify that the trigger is correctly applying - * cuts to the clusters it sees. Additionally compares triggers - * simulated on reconstructed clusters to measure trigger efficiency. - */ - private void singlesTriggerVerification() { - // Create lists of generic triggers. - List<List<? extends Trigger<?>>> sspTriggerList = new ArrayList<List<? extends Trigger<?>>>(2); - List<List<? extends Trigger<?>>> reconTriggerList = new ArrayList<List<? extends Trigger<?>>>(2); - - // Convert the simulated triggers to generic versions and add - // them to the generic list. - sspTriggerList.add(triggerData.getSimSSPTriggers().getSingles0Triggers()); - sspTriggerList.add(triggerData.getSimSSPTriggers().getSingles1Triggers()); - reconTriggerList.add(triggerData.getSimReconTriggers().getSingles0Triggers()); - reconTriggerList.add(triggerData.getSimReconTriggers().getSingles1Triggers()); - - // Run generic trigger verification. - triggerVerification(sspTriggerList, reconTriggerList, true); - } - - /** - * Checks triggers simulated on SSP clusters against the SSP bank's - * reported triggers to verify that the trigger is correctly applying - * cuts to the clusters it sees. Additionally compares triggers - * simulated on reconstructed clusters to measure trigger efficiency. - */ - private void pairTriggerVerification() { - // Create lists of generic triggers. - List<List<? extends Trigger<?>>> sspTriggerList = new ArrayList<List<? extends Trigger<?>>>(2); - List<List<? extends Trigger<?>>> reconTriggerList = new ArrayList<List<? extends Trigger<?>>>(2); - - // Convert the simulated triggers to generic versions and add - // them to the generic list. - sspTriggerList.add(triggerData.getSimSSPTriggers().getPair0Triggers()); - sspTriggerList.add(triggerData.getSimSSPTriggers().getPair1Triggers()); - reconTriggerList.add(triggerData.getSimReconTriggers().getPair0Triggers()); - reconTriggerList.add(triggerData.getSimReconTriggers().getPair1Triggers()); - - // Run generic trigger verification. - triggerVerification(sspTriggerList, reconTriggerList, false); - } - - /** - * Performs trigger verification for both trigger types. - * @param sspTriggerList - The list of SSP triggers. - * @param reconTriggerList - The list of reconstructed triggers. - * @param isSingles - Whether or not this is a singles trigger - * verification. - */ - private void triggerVerification(List<List<? extends Trigger<?>>> sspTriggerList, - List<List<? extends Trigger<?>>> reconTriggerList, boolean isSingles) { - - // ========================================================== - // ==== Initialize Trigger Verification ===================== - // ========================================================== - - // Print the cluster verification header. - OutputLogger.println(); - OutputLogger.println(); - OutputLogger.println("======================================================================"); - if(isSingles) { OutputLogger.println("=== Singles Trigger Verification ====================================="); } - else { OutputLogger.println("=== Pair Trigger Verification ========================================"); } - OutputLogger.println("======================================================================"); - - // Track the number of triggers seen and the number found. - TriggerEvent[] triggerEvent = { new TriggerEvent(), new TriggerEvent() }; - - // ========================================================== - // ==== Output Event Summary ================================ - // ========================================================== - - // Get the list of triggers reported by the SSP. - List<? extends SSPNumberedTrigger> sspTriggers; - if(isSingles) { sspTriggers = sspBank.getSinglesTriggers(); } - else { sspTriggers = sspBank.getPairTriggers(); } - - // Output the SSP cluster triggers. - OutputLogger.println(); - OutputLogger.println("SSP Cluster " + (isSingles ? "Singles" : "Pair") + " Triggers"); - for(int triggerNum = 0; triggerNum < 2; triggerNum++) { - for(Trigger<?> simTrigger : sspTriggerList.get(triggerNum)) { - OutputLogger.printf("\tTrigger %d :: %s :: %3.0f :: %s%n", - (triggerNum + 1), triggerPositionString(simTrigger), - getTriggerTime(simTrigger), simTrigger.toString()); - } - } - if(sspTriggerList.get(0).size() + sspTriggerList.get(1).size() == 0) { - OutputLogger.println("\tNone"); - } - - // Output the reconstructed cluster singles triggers. - OutputLogger.println("Reconstructed Cluster " + (isSingles ? "Singles" : "Pair") + " Triggers"); - for(int triggerNum = 0; triggerNum < 2; triggerNum++) { - for(Trigger<?> simTrigger : reconTriggerList.get(triggerNum)) { - OutputLogger.printf("\tTrigger %d :: %s :: %3.0f :: %s%n", - (triggerNum + 1), triggerPositionString(simTrigger), - getTriggerTime(simTrigger), simTrigger.toString()); - } - } - if(reconTriggerList.get(0).size() + reconTriggerList.get(1).size() == 0) { - OutputLogger.println("\tNone"); - } - - // Output the SSP reported triggers. - OutputLogger.println("SSP Reported " + (isSingles ? "Singles" : "Pair") + " Triggers"); - for(SSPTrigger sspTrigger : sspTriggers) { - OutputLogger.printf("\t%s%n", sspTrigger.toString()); - } - if(sspTriggers.size() == 0) { OutputLogger.println("\tNone"); } - - // Update the trigger event with the counts for each type of - // simulated trigger. Reported triggers are counted later when - // already iterating over them. - for(int triggerNum = 0; triggerNum < 2; triggerNum++) { - triggerEvent[triggerNum].sawSSPSimulatedTriggers(tiFlags, sspTriggerList.get(triggerNum).size()); - triggerEvent[triggerNum].sawReconSimulatedTriggers(tiFlags, reconTriggerList.get(triggerNum).size()); - } - - - - // ========================================================== - // ==== SSP Internal Logic Verification ===================== - // ========================================================== - - // Track which SSP triggers have been matched to avoid matching - // multiple reconstructed SSP cluster triggers to the same SSP - // trigger. - Set<SSPNumberedTrigger> sspTriggerSet = new HashSet<SSPNumberedTrigger>(); - Set<Trigger<?>> simTriggerSet = new HashSet<Trigger<?>>(); - - // Track the number of SSP reported triggers that are found in - // excess of the SSP simulated triggers. - int sspReportedExtras = sspTriggers.size() - (sspTriggerList.get(0).size() + sspTriggerList.get(1).size()); - if(sspReportedExtras > 0) { - if(isSingles) { singlesInternalFail = true; } - else { pairInternalFail = true; } - } else { sspReportedExtras = 0; } - - // Iterate over the triggers. - OutputLogger.println(); - OutputLogger.println("Matching SSP Reported Triggers to SSP Simulated Triggers:"); - for(SSPNumberedTrigger sspTrigger : sspTriggers) { - // Get the trigger information. - int triggerNum = sspTrigger.isFirstTrigger() ? 0 : 1; - OutputLogger.printf("\t%s%n", sspTrigger.toString()); - - // Note that a bank trigger was seen. - triggerEvent[triggerNum].sawReportedTrigger(); - - // Iterate over the SSP cluster simulated triggers and - // look for a trigger that matches. - matchLoop: - for(Trigger<?> simTrigger : sspTriggerList.get(triggerNum)) { - // VERBOSE :: Output the trigger being considered for - // matching. - OutputLogger.printf("\t\tTrigger %d :: %s :: %3.0f :: %s ", - (triggerNum + 1), triggerPositionString(simTrigger), - getTriggerTime(simTrigger), simTrigger.toString()); - - // If the current SSP trigger has already been matched, - // skip it. - if(simTriggerSet.contains(simTrigger)) { - OutputLogger.printf("[ %-15s ]%n", "failed; matched"); - continue matchLoop; - } - - // Check that the triggers have the same time. Triggers - // generated from SSP bank clusters should always align - // in time. - if(sspTrigger.getTime() != getTriggerTime(simTrigger)) { - OutputLogger.printf("[ %-15s ]%n", "failed; time"); - continue matchLoop; - } - - // Check whether the trigger cuts match. - boolean[] matchedCuts = triggerCutMatch(simTrigger, sspTrigger); - for(int i = 0; i < matchedCuts.length; i++) { - if(!matchedCuts[i]) { - int typeIndex = isSingles ? 0 : 1; - OutputLogger.printf("[ %-15s ]%n", String.format("failed; %s", cutNames[typeIndex][i])); - continue matchLoop; - } - } - - // If all the cuts match, along with the time and the - // trigger number, than these triggers are a match. - sspTriggerSet.add(sspTrigger); - simTriggerSet.add(simTrigger); - triggerEvent[triggerNum].matchedSSPTrigger(tiFlags); - OutputLogger.printf("[ %-15s ]%n", "success"); - break matchLoop; - } - } - - for(int triggerNum = 0; triggerNum < 2; triggerNum++) { - for(Trigger<?> simTrigger : sspTriggerList.get(triggerNum)) { - globalTriggerPlots.sawTrigger(simTrigger); - if(simTriggerSet.contains(simTrigger)) { - globalTriggerPlots.matchedTrigger(simTrigger); - } else { - globalTriggerPlots.failedTrigger(simTrigger); - } - } - } - - // Iterate over the unmatched simulated triggers again and the - // unmatched SSP reported trigger that most closely matches it. - OutputLogger.println(); - OutputLogger.println("Matching Failed SSP Reported Triggers to Remaining SSP Simulated Triggers:"); - for(int triggerNum = 0; triggerNum < 2; triggerNum++) { - simLoop: - for(Trigger<?> simTrigger : sspTriggerList.get(triggerNum)) { - OutputLogger.printf("\tTrigger %d :: %s :: %3.0f :: %s%n", - (triggerNum + 1), triggerPositionString(simTrigger), - getTriggerTime(simTrigger), simTrigger.toString()); - - // Check whether this trigger has already been matched - // or not. If it has been matched, skip it. - if(simTriggerSet.contains(simTrigger)) { - OutputLogger.println("\t\tSkipping; already matched successfully"); - continue simLoop; - } - - // Get the trigger time for the simulated trigger. - double simTime = getTriggerTime(simTrigger); - - // Track the match statistics for each reported trigger - // so that the closest match may be found. - int numMatched = -1; - boolean[] matchedCut = null; - SSPNumberedTrigger bestMatch = null; - - // Store the readout for the best match. - String bestMatchText = null; - - // Iterate over the reported triggers to find a match. - reportedLoop: - for(SSPNumberedTrigger sspTrigger : sspTriggers) { - OutputLogger.printf("\t\t%s ", sspTrigger.toString()); - - // If the two triggers have different times, this - // trigger should be skipped. - if(sspTrigger.getTime() != simTime) { - OutputLogger.printf("[ %-15s ]%n", "failed; time"); - continue reportedLoop; - } - - // If this reported trigger has been matched then - // it should be skipped. - if(sspTriggerSet.contains(sspTrigger)) { - OutputLogger.printf("[ %-15s ]%n", "failed; matched"); - continue reportedLoop; - } - - // Check each of the cuts. - boolean[] tempMatchedCut = triggerCutMatch(simTrigger, sspTrigger); - - // Check each cut and see if this is a closer match - // than the previous best match. - int tempNumMatched = 0; - for(boolean passed : tempMatchedCut) { if(passed) { tempNumMatched++; } } - OutputLogger.printf("[ %-15s ]%n", String.format("maybe; %d failed", tempNumMatched)); - - // If the number of matched cuts exceeds the old - // best result, this becomes the new best result. - if(tempNumMatched > numMatched) { - numMatched = tempNumMatched; - matchedCut = tempMatchedCut; - bestMatch = sspTrigger; - bestMatchText = String.format("%s%n", sspTrigger.toString()); - } - } - - // If there was no match found, it means that there were - // no triggers that were both unmatched and at the same - // time as this simulated trigger. - if(bestMatch == null) { - if(isSingles) { singlesInternalFail = true; } - else { pairInternalFail = true; } - triggerEvent[triggerNum].failedSSPTrigger(); - OutputLogger.printf("\t\tTrigger %d :: %s :: %3.0f :: %s", - (triggerNum + 1), triggerPositionString(simTrigger), - getTriggerTime(simTrigger), simTrigger.toString()); - OutputLogger.println(" --> No Valid Match Found"); - } else { - triggerEvent[triggerNum].matchedSSPTrigger(tiFlags, matchedCut); - OutputLogger.printf("\t\tTrigger %d :: %s :: %3.0f :: %s", - (triggerNum + 1), triggerPositionString(simTrigger), - getTriggerTime(simTrigger), simTrigger.toString()); - OutputLogger.println(" --> " + bestMatchText); - } - } - } - - - - // ========================================================== - // ==== Trigger Efficiency ================================== - // ========================================================== - - // Reset the SSP matched trigger set. - sspTriggerSet.clear(); - - // Iterate over the reconstructed cluster singles triggers. - OutputLogger.println(); - OutputLogger.println("Recon Cluster Trigger --> SSP Reported Trigger Match Status"); - for(int triggerNum = 0; triggerNum < 2; triggerNum++) { - for(Trigger<?> simTrigger : reconTriggerList.get(triggerNum)) { - OutputLogger.printf("\tTrigger %d :: %s :: %s%n", (triggerNum + 1), - triggerPositionString(simTrigger), simTrigger.toString()); - - // TEMP :: Populate the recon ALL pairs plots. - globalTriggerPlots.sawTrigger(simTrigger); - - // Iterate over the SSP reported triggers and compare - // them to the reconstructed cluster simulated trigger. - boolean matched = false; - matchLoop: - for(SSPNumberedTrigger sspTrigger : sspTriggers) { - OutputLogger.printf("\t\t\t%s", sspTrigger.toString()); - - // Only compare triggers if they are from the - // same trigger source. - if((triggerNum == 0 && sspTrigger.isSecondTrigger()) - || (triggerNum == 1 && sspTrigger.isFirstTrigger())) { - OutputLogger.print(" [ fail; source ]%n"); - continue matchLoop; - } - - // Only compare the singles trigger if it was - // not already matched to another trigger. - if(sspTriggerSet.contains(sspTrigger)) { - OutputLogger.print(" [ fail; matched ]%n"); - continue matchLoop; - } - - // Test each cut. - int typeIndex = isSingles ? 0 : 1; - boolean[] matchedCuts = triggerCutMatch(simTrigger, sspTrigger); - for(int cutIndex = 0; cutIndex < matchedCuts.length; cutIndex++) { - if(!matchedCuts[cutIndex]) { - OutputLogger.printf(" [ fail; %-9s ]%n", cutNames[typeIndex][cutIndex]); - continue matchLoop; - } - } - - // If all the trigger flags match, then the - // triggers are a match. - sspTriggerSet.add(sspTrigger); - triggerEvent[triggerNum].matchedReconTrigger(tiFlags); - OutputLogger.print(" [ success ]%n"); - globalTriggerPlots.matchedTrigger(simTrigger); - matched = true; - break matchLoop; - } - - if(!matched) { globalTriggerPlots.failedTrigger(simTrigger); } - } - } - - - - // ========================================================== - // ==== Output Event Results ================================ - // ========================================================== - - // Get the number of SSP and reconstructed cluster simulated - // triggers. - int sspSimTriggers = sspTriggerList.get(0).size() + sspTriggerList.get(1).size(); - int reconSimTriggers = reconTriggerList.get(0).size() + reconTriggerList.get(1).size(); - int[] sspTriggerCount = { sspTriggerList.get(0).size(), sspTriggerList.get(1).size() }; - - // Print event statistics. - OutputLogger.println(); - OutputLogger.println("Event Statistics:"); - OutputLogger.printf("\tSSP Cluster Sim Triggers :: %d%n", sspSimTriggers); - OutputLogger.printf("\tRecon Cluster Sim Triggers :: %d%n", reconSimTriggers); - OutputLogger.printf("\tSSP Reported Triggers :: %d%n", sspTriggers.size()); - - int matchedSSPTriggers = triggerEvent[0].getMatchedSSPSimulatedTriggers() + triggerEvent[1].getMatchedSSPSimulatedTriggers(); - OutputLogger.printf("\tInternal Efficiency :: %d / %d ", matchedSSPTriggers, sspSimTriggers); - if(sspSimTriggers == 0) { OutputLogger.printf("(N/A)%n"); } - else { OutputLogger.printf("(%3.0f%%)%n", (100.0 * matchedSSPTriggers / sspSimTriggers)); } - - int matchedReconTriggers = triggerEvent[0].getMatchedReconSimulatedTriggers() + triggerEvent[1].getMatchedReconSimulatedTriggers(); - OutputLogger.printf("\tTrigger Efficiency :: %d / %d", matchedReconTriggers, reconSimTriggers); - if(reconSimTriggers == 0) { OutputLogger.printf("(N/A)%n"); } - else { OutputLogger.printf("(%3.0f%%)%n", (100.0 * matchedReconTriggers / reconSimTriggers)); } - - // Print the individual cut performances. - if(isSingles) { - OutputLogger.println(); - for(int triggerNum = 0; triggerNum < 2; triggerNum++) { - OutputLogger.printf("Trigger %d Individual Cut Failure Rate:%n", (triggerNum + 1)); - if(sspSimTriggers == 0) { - OutputLogger.printf("\tCluster Energy Lower Bound :: %d / %d%n", triggerEvent[triggerNum].getSSPCutFailures(ENERGY_MIN), sspTriggerCount[triggerNum]); - OutputLogger.printf("\tCluster Energy Upper Bound :: %d / %d%n", triggerEvent[triggerNum].getSSPCutFailures(ENERGY_MAX), sspTriggerCount[triggerNum]); - OutputLogger.printf("\tCluster Hit Count :: %d / %d%n", triggerEvent[triggerNum].getSSPCutFailures(HIT_COUNT), sspTriggerCount[triggerNum]); - } else { - OutputLogger.printf("\tCluster Energy Lower Bound :: %d / %d (%3.0f%%)%n", - triggerEvent[triggerNum].getSSPCutFailures(ENERGY_MIN), sspTriggerCount[triggerNum], - (100.0 * triggerEvent[triggerNum].getSSPCutFailures(ENERGY_MIN) / sspTriggerCount[triggerNum])); - OutputLogger.printf("\tCluster Energy Upper Bound :: %d / %d (%3.0f%%)%n", - triggerEvent[triggerNum].getSSPCutFailures(ENERGY_MAX), sspTriggerCount[triggerNum], - (100.0 * triggerEvent[triggerNum].getSSPCutFailures(ENERGY_MAX) / sspTriggerCount[triggerNum])); - OutputLogger.printf("\tCluster Hit Count :: %d / %d (%3.0f%%)%n", - triggerEvent[triggerNum].getSSPCutFailures(HIT_COUNT), sspTriggerCount[triggerNum], - (100.0 * triggerEvent[triggerNum].getSSPCutFailures(HIT_COUNT) / sspTriggerCount[triggerNum])); - } - } - - // Update the global trigger tracking variables. - localStats.getTriggerStats().getSingles0Stats().addEvent(triggerEvent[0]); - localStats.getTriggerStats().getSingles1Stats().addEvent(triggerEvent[1]); - globalStats.getTriggerStats().getSingles0Stats().addEvent(triggerEvent[0]); - globalStats.getTriggerStats().getSingles1Stats().addEvent(triggerEvent[1]); - } else { - for(int triggerNum = 0; triggerNum < 2; triggerNum++) { - OutputLogger.println(); - OutputLogger.printf("Trigger %d Individual Cut Failure Rate:%n", (triggerNum + 1)); - if(sspTriggerCount[triggerNum] == 0) { - OutputLogger.printf("\tPair Energy Sum :: %d / %d%n", triggerEvent[triggerNum].getSSPCutFailures(ENERGY_SUM), sspTriggerCount[triggerNum]); - OutputLogger.printf("\tPair Energy Difference :: %d / %d%n", triggerEvent[triggerNum].getSSPCutFailures(ENERGY_DIFF), sspTriggerCount[triggerNum]); - OutputLogger.printf("\tPair Energy Slope :: %d / %d%n", triggerEvent[triggerNum].getSSPCutFailures(ENERGY_SLOPE), sspTriggerCount[triggerNum]); - OutputLogger.printf("\tPair Coplanarity :: %d / %d%n", triggerEvent[triggerNum].getSSPCutFailures(COPLANARITY), sspTriggerCount[triggerNum]); - } else { - OutputLogger.printf("\tPair Energy Sum :: %d / %d (%3.0f%%)%n", - triggerEvent[triggerNum].getSSPCutFailures(ENERGY_SUM), sspTriggerCount[triggerNum], - (100.0 * triggerEvent[triggerNum].getSSPCutFailures(ENERGY_SUM) / sspTriggerCount[triggerNum])); - OutputLogger.printf("\tPair Energy Difference :: %d / %d (%3.0f%%)%n", - triggerEvent[triggerNum].getSSPCutFailures(ENERGY_DIFF), sspTriggerCount[triggerNum], - (100.0 * triggerEvent[triggerNum].getSSPCutFailures(ENERGY_DIFF) / sspTriggerCount[triggerNum])); - OutputLogger.printf("\tPair Energy Slope :: %d / %d (%3.0f%%)%n", - triggerEvent[triggerNum].getSSPCutFailures(ENERGY_SLOPE), sspTriggerCount[triggerNum], - (100.0 * triggerEvent[triggerNum].getSSPCutFailures(ENERGY_SLOPE) / sspTriggerCount[triggerNum])); - OutputLogger.printf("\tPair Coplanarity :: %d / %d (%3.0f%%)%n", - triggerEvent[triggerNum].getSSPCutFailures(COPLANARITY), sspTriggerCount[triggerNum], - (100.0 * triggerEvent[triggerNum].getSSPCutFailures(COPLANARITY) / sspTriggerCount[triggerNum])); - } - } - - // Update the global trigger tracking variables. - localStats.getTriggerStats().getPair0Stats().addEvent(triggerEvent[0]); - localStats.getTriggerStats().getPair1Stats().addEvent(triggerEvent[1]); - globalStats.getTriggerStats().getPair0Stats().addEvent(triggerEvent[0]); - globalStats.getTriggerStats().getPair1Stats().addEvent(triggerEvent[1]); - } - - // Note whether the was a trigger match failure. - if(triggerEvent[0].getFailedReconSimulatedTriggers() != 0 && triggerEvent[1].getFailedReconSimulatedTriggers() != 0) { - if(isSingles) { singlesEfficiencyFail = true; } - else { pairEfficiencyFail = true; } - } if(triggerEvent[0].getFailedSSPSimulatedTriggers() != 0 && triggerEvent[1].getFailedSSPSimulatedTriggers() != 0) { - if(isSingles) { singlesInternalFail = true; } - else { pairInternalFail = true; } - } - } - - /** - * Outputs all of the verification parameters currently in use by - * the software. A warning will be issued if the values for NSA and - * NSB, along with the FADC window, preclude clusters from being - * verified. - */ - private void logSettings() { - // Output general settings. - System.out.println("Cluster Verification Settings"); - System.out.printf("\tHit Threshold :: %1d hit(s)%n", hitAcceptance); - System.out.printf("\tEnergy Threshold :: %5.3f GeV%n", energyAcceptance); - System.out.println(); - - // Output window settings. - System.out.println("FADC Timing Window Settings"); - System.out.printf("\tNSB :: %3d ns%n", nsb); - System.out.printf("\tNSA :: %3d ns%n", nsa); - System.out.printf("\tFADC Window :: %3d ns%n", windowWidth); - - // Calculate the valid clustering window. - int start = nsb; - int end = windowWidth - nsa; - if(start < end) { - System.out.printf("\tValid Cluster Window :: [ %3d ns, %3d ns ]%n", start, end); - performClusterVerification = true; - } else { - System.out.println("\tNSB, NSA, and FADC window preclude a valid cluster verification window."); - System.out.println("\tCluster verification will not be performed!"); - performClusterVerification = false; - } - System.out.println(); - - // Output the singles trigger settings. - for(int i = 0; i < 2; i++) { - // Print the settings. - System.out.printf("Singles Trigger %d Settings%23s[%5b]%n", (i + 1), "", singlesTriggerEnabled[i]); - System.out.printf("\tCluster Energy Low :: %.3f GeV [%5b]%n", - singlesTrigger[i].getCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW), singlesCutsEnabled[i][0]); - System.out.printf("\tCluster Energy High :: %.3f GeV [%5b]%n", - singlesTrigger[i].getCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH), singlesCutsEnabled[i][1]); - System.out.printf("\tCluster Hit Count :: %.0f hit(s) [%5b]%n", - singlesTrigger[i].getCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW), singlesCutsEnabled[i][2]); - System.out.println(); - } - - // Output the pair trigger settings. - for(int i = 0; i < 2; i++) { - System.out.printf("Pairs Trigger %d Settings%25s[%5b]%n", (i + 1), "", pairTriggerEnabled[i]); - System.out.printf("\tCluster Energy Low :: %.3f GeV [%5b]%n", - pairsTrigger[i].getCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW), pairCutsEnabled[i][0]); - System.out.printf("\tCluster Energy High :: %.3f GeV [%5b]%n", - pairsTrigger[i].getCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH), pairCutsEnabled[i][1]); - System.out.printf("\tCluster Hit Count :: %.0f hit(s) [%5b]%n", - pairsTrigger[i].getCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW), pairCutsEnabled[i][2]); - System.out.printf("\tPair Energy Sum Low :: %.3f GeV [%5b]%n", - pairsTrigger[i].getCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW), pairCutsEnabled[i][3]); - System.out.printf("\tPair Energy Sum High :: %.3f GeV [%5b]%n", - pairsTrigger[i].getCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH), pairCutsEnabled[i][3]); - System.out.printf("\tPair Energy Difference :: %.3f GeV [%5b]%n", - pairsTrigger[i].getCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH), pairCutsEnabled[i][4]); - System.out.printf("\tPair Energy Slope :: %.3f GeV [%5b]%n", - pairsTrigger[i].getCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW), pairCutsEnabled[i][5]); - System.out.printf("\tPair Energy Slope F :: %.4f GeV / mm%n", - pairsTrigger[i].getCutValue(TriggerModule.PAIR_ENERGY_SLOPE_F)); - System.out.printf("\tPair Coplanarity :: %3.0f Degrees [%5b]%n", - pairsTrigger[i].getCutValue(TriggerModule.PAIR_COPLANARITY_HIGH), pairCutsEnabled[i][6]); - System.out.printf("\tPair Time Coincidence :: %2.0f ns [%5b]%n", - pairsTrigger[i].getCutValue(TriggerModule.PAIR_TIME_COINCIDENCE), true); - System.out.println(); - } - } - - /** - * Summarizes the global run statistics in a log to the terminal. - */ - private void logStatistics() { - // Print the cluster/trigger verification header. - System.out.println(); - System.out.println(); - System.out.println("======================================================================"); - System.out.println("=== Cluster/Trigger Verification Results ============================="); - System.out.println("======================================================================"); - - // Print the general event failure rate. - int headSpaces = getPrintSpaces(globalStats.getEventCount()); - System.out.println("General Event Statistics:"); - System.out.printf("\tEvent Start Time :: %.3f s%n", (startTime / Math.pow(10, 9))); - System.out.printf("\tEvent End Time :: %.3f%n", (endTime / Math.pow(10, 9))); - System.out.printf("\tEvent Run Time :: %.3f%n", ((endTime - startTime) / Math.pow(10, 9))); - System.out.printf("\tNoise Events :: %" + headSpaces + "d / %" + headSpaces + "d (%7.3f%%)%n", - globalStats.getNoiseEvents(), globalStats.getEventCount(), (100.0 * globalStats.getNoiseEvents() / globalStats.getEventCount())); - System.out.printf("\tCluster Events Failed :: %" + headSpaces + "d / %" + headSpaces + "d (%7.3f%%)%n", - globalStats.getFailedClusterEventCount(), globalStats.getEventCount(), (100.0 * globalStats.getFailedClusterEventCount() / globalStats.getEventCount())); - System.out.printf("\tSingles Events Failed :: %" + headSpaces + "d / %" + headSpaces + "d (%7.3f%%)%n", - globalStats.getFailedSinglesEventCount(), globalStats.getEventCount(), (100.0 * globalStats.getFailedSinglesEventCount() / globalStats.getEventCount())); - System.out.printf("\tPair Events Failed :: %" + headSpaces + "d / %" + headSpaces + "d (%7.3f%%)%n", - globalStats.getFailedPairEventCount(), globalStats.getEventCount(), (100.0 * globalStats.getFailedPairEventCount() / globalStats.getEventCount())); - - // Print out how many events reported a given TI type, both in - // total and hierarchically. - System.out.println(); - System.out.println("Event Triggering Type Verification:"); - System.out.printf("\t%15s\t%15s\t%15s%n", "Trigger", "Total", "Hierarchical"); - System.out.printf("\t%15s\t%15s\t%15s%n", "Pulser", globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.PULSER, false), - globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.PULSER, true)); - System.out.printf("\t%15s\t%15s\t%15s%n", "Cosmic", globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.COSMIC, false), - globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.COSMIC, true)); - System.out.printf("\t%15s\t%15s\t%15s%n", "Singles 1", globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.SINGLES0, false), - globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.SINGLES0, true)); - System.out.printf("\t%15s\t%15s\t%15s%n", "Singles 2", globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.SINGLES1, false), - globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.SINGLES1, true)); - System.out.printf("\t%15s\t%15s\t%15s%n", "Pair 1", globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.PAIR0, false), - globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.PAIR0, true)); - System.out.printf("\t%15s\t%15s\t%15s%n", "Pair 2", globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.PAIR1, false), - globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.PAIR1, true)); - - // Print the cluster verification data. - System.out.println(); - System.out.println("Cluster Verification:"); - System.out.printf("\tRecon Clusters :: %d%n", globalStats.getClusterStats().getReconClusterCount()); - System.out.printf("\tSSP Clusters :: %d%n", globalStats.getClusterStats().getSSPClusterCount()); - System.out.printf("\tClusters Matched :: %d%n", globalStats.getClusterStats().getMatches()); - System.out.printf("\tFailed (Position) :: %d%n", globalStats.getClusterStats().getPositionFailures()); - System.out.printf("\tFailed (Energy) :: %d%n", globalStats.getClusterStats().getEnergyFailures()); - System.out.printf("\tFailed (Hit Count) :: %d%n", globalStats.getClusterStats().getHitCountFailures()); - if(globalStats.getClusterStats().getReconClusterCount() == 0) { - System.out.printf("\tCluster Efficiency :: N/A%n"); - } else { - System.out.printf("\tCluster Efficiency :: %7.3f%%%n", - 100.0 * globalStats.getClusterStats().getMatches() / globalStats.getClusterStats().getReconClusterCount()); - } - - // Print the trigger verification data. - for(int triggerType = 0; triggerType < 2; triggerType++) { - // Get the trigger data. Type 0 represents singles triggers. - TriggerEvent[] triggerData = new TriggerEvent[2]; - if(triggerType == 0) { - triggerData[0] = globalStats.getTriggerStats().getSingles0Stats(); - triggerData[1] = globalStats.getTriggerStats().getSingles1Stats(); - } else { - triggerData[0] = globalStats.getTriggerStats().getPair0Stats(); - triggerData[1] = globalStats.getTriggerStats().getPair1Stats(); - } - - // Get the basic trigger data. - int sspSimTriggers = triggerData[0].getSSPSimulatedTriggers() + triggerData[1].getSSPSimulatedTriggers(); - int reconSimTriggers = triggerData[0].getReconSimulatedTriggers() + triggerData[1].getReconSimulatedTriggers(); - int sspReportedTriggers = triggerData[0].getReportedTriggers() + triggerData[1].getReportedTriggers(); - int sspMatchedTriggers = triggerData[0].getMatchedSSPSimulatedTriggers() + triggerData[1].getMatchedSSPSimulatedTriggers(); - int reconMatchedTriggers = triggerData[0].getMatchedReconSimulatedTriggers() + triggerData[1].getMatchedReconSimulatedTriggers(); - - // Print the basic trigger statistics. - int spaces = getPrintSpaces(sspSimTriggers, reconSimTriggers, sspReportedTriggers); - System.out.println(); - if(triggerType == 0) { System.out.println("Singles Trigger Verification:"); } - else { System.out.println("Pair Trigger Verification:"); } - System.out.printf("\tSSP Cluster Sim Triggers :: %" + spaces + "d%n", sspSimTriggers); - System.out.printf("\tRecon Cluster Sim Triggers :: %" + spaces + "d%n", reconSimTriggers); - System.out.printf("\tSSP Reported Triggers :: %" + spaces + "d%n", sspReportedTriggers); - - System.out.printf("\tInternal Efficiency :: %" + spaces + "d / %" + spaces + "d ", sspMatchedTriggers, sspSimTriggers); - if(sspSimTriggers == 0) { System.out.printf("(N/A)%n"); } - else { System.out.printf("(%7.3f%%)%n", (100.0 * sspMatchedTriggers / sspSimTriggers)); } - - System.out.printf("\tTrigger Efficiency :: %" + spaces + "d / %" + spaces + "d ", reconMatchedTriggers, reconSimTriggers); - if(reconSimTriggers == 0) { System.out.printf("(N/A)%n"); } - else { System.out.printf("(%7.3f%%)%n" , (100.0 * reconMatchedTriggers / reconSimTriggers)); } - - // Print the individual cut performances. - if(triggerType == 0) { - for(int triggerNum = 0; triggerNum < 2; triggerNum++) { - // Get the appropriate trigger statistics module. - TriggerEvent triggerStats; - if(triggerNum == 0) { triggerStats = globalStats.getTriggerStats().getSingles0Stats(); } - else { triggerStats = globalStats.getTriggerStats().getSingles1Stats(); } - - // Get the number of SSP triggers for this trigger number. - int sspTriggerCount = triggerStats.getSSPSimulatedTriggers(); - //int sspTriggerCount = triggerRunStats[0].getTotalSSPTriggers(triggerNum); - - System.out.println(); - System.out.printf("\tTrigger %d Individual Cut Failure Rate:%n", (triggerNum + 1)); - System.out.printf("\t\tUmatched Triggers :: %" + spaces + "d%n", triggerStats.getUnmatchedSSPSimulatedTriggers()); - //System.out.printf("\t\tUmatched Triggers :: %" + spaces + "d%n", triggerRunStats[0].getUnmatchedTriggers(triggerNum)); - if(sspTriggerCount == 0) { - System.out.printf("\t\tCluster Energy Lower Bound :: %" + spaces + "d / %" + spaces + "d%n", - triggerStats.getSSPCutFailures(ENERGY_MIN), sspTriggerCount); - System.out.printf("\t\tCluster Energy Upper Bound :: %" + spaces + "d / %" + spaces + "d%n", - triggerStats.getSSPCutFailures(ENERGY_MAX), sspTriggerCount); - System.out.printf("\t\tCluster Hit Count :: %" + spaces + "d / %" + spaces + "d%n", - triggerStats.getSSPCutFailures(HIT_COUNT), sspTriggerCount); - } else { - System.out.printf("\t\tCluster Energy Lower Bound :: %" + spaces + "d / %" + spaces + "d (%7.3f%%)%n", - triggerStats.getSSPCutFailures(ENERGY_MIN), sspTriggerCount, - (100.0 * triggerStats.getSSPCutFailures(ENERGY_MIN) / sspTriggerCount)); - System.out.printf("\t\tCluster Energy Upper Bound :: %" + spaces + "d / %" + spaces + "d (%7.3f%%)%n", - triggerStats.getSSPCutFailures(ENERGY_MAX), sspTriggerCount, - (100.0 * triggerStats.getSSPCutFailures(ENERGY_MAX) / sspTriggerCount)); - System.out.printf("\t\tCluster Hit Count :: %" + spaces + "d / %" + spaces + "d (%7.3f%%)%n", - triggerStats.getSSPCutFailures(HIT_COUNT), sspTriggerCount, - (100.0 * triggerStats.getSSPCutFailures(HIT_COUNT) / sspTriggerCount)); - } - } - } else { - for(int triggerNum = 0; triggerNum < 2; triggerNum++) { - // Get the appropriate trigger statistics module. - TriggerEvent triggerStats; - if(triggerNum == 0) { triggerStats = globalStats.getTriggerStats().getPair0Stats(); } - else { triggerStats = globalStats.getTriggerStats().getPair1Stats(); } - - // Get the number of SSP triggers for this trigger number. - int sspTriggerCount = triggerStats.getSSPSimulatedTriggers(); - - System.out.println(); - System.out.printf("\tTrigger %d Individual Cut Failure Rate:%n", (triggerNum + 1)); - System.out.printf("\t\tUmatched Triggers :: %" + spaces + "d%n", triggerStats.getUnmatchedSSPSimulatedTriggers()); - if(sspTriggerCount == 0) { - System.out.printf("\t\tPair Energy Sum :: %" + spaces + "d / %" + spaces + "d%n", - triggerStats.getSSPCutFailures(ENERGY_SUM), sspTriggerCount); - System.out.printf("\t\tPair Energy Difference :: %" + spaces + "d / %" + spaces + "d%n", - triggerStats.getSSPCutFailures(ENERGY_DIFF), sspTriggerCount); - System.out.printf("\t\tPair Energy Slope :: %" + spaces + "d / %" + spaces + "d%n", - triggerStats.getSSPCutFailures(ENERGY_SLOPE), sspTriggerCount); - System.out.printf("\t\tPair Coplanarity :: %" + spaces + "d / %" + spaces + "d%n", - triggerStats.getSSPCutFailures(COPLANARITY), sspTriggerCount); - } else { - System.out.printf("\t\tPair Energy Sum :: %" + spaces + "d / %" + spaces + "d (%7.3f%%)%n", - triggerStats.getSSPCutFailures(ENERGY_SUM), sspTriggerCount, - (100.0 * triggerStats.getSSPCutFailures(ENERGY_SUM) / sspTriggerCount)); - System.out.printf("\t\tPair Energy Difference :: %" + spaces + "d / %" + spaces + "d (%7.3f%%)%n", - triggerStats.getSSPCutFailures(ENERGY_DIFF), sspTriggerCount, - (100.0 * triggerStats.getSSPCutFailures(ENERGY_DIFF) / sspTriggerCount)); - System.out.printf("\t\tPair Energy Slope :: %" + spaces + "d / %" + spaces + "d (%7.3f%%)%n", - triggerStats.getSSPCutFailures(ENERGY_SLOPE), sspTriggerCount, - (100.0 * triggerStats.getSSPCutFailures(ENERGY_SLOPE) / sspTriggerCount)); - System.out.printf("\t\tPair Coplanarity :: %" + spaces + "d / %" + spaces + "d (%7.3f%%)%n", - triggerStats.getSSPCutFailures(COPLANARITY), sspTriggerCount, - (100.0 * triggerStats.getSSPCutFailures(COPLANARITY) / sspTriggerCount)); - } - } - } - } - - // Print out the trigger efficiency table. - System.out.println(); - globalStats.getTriggerStats().printEfficiencyTable(); - } - - /** - * Checks whether all of the hits in a cluster are within the safe - * region of the FADC output window. - * @param reconCluster - The cluster to check. - * @return Returns <code>true</code> if the cluster is safe and - * returns <code>false</code> otherwise. - */ - private final boolean isVerifiable(Cluster reconCluster) { - return TriggerDiagnosticUtil.isVerifiable(reconCluster, nsa, nsb, windowWidth); - } - - /** - * Generates a <code>List</code> collection that contains a set - * of <code>ArrayList</code> collections representing a unique - * permutation of the entries in the argument. - * @param values - A collection of the entries to be permuted. - * @return Returns a list of lists representing the permutations. - */ - private static final List<List<Pair<Cluster, SSPCluster>>> getPermutations(List<Cluster> reconClusters, List<SSPCluster> sspClusters) { - // Store the SSP cluster permutations. - List<List<SSPCluster>> permList = new ArrayList<List<SSPCluster>>(); - - // Make sure that the two lists are the same size. - int reconSize = reconClusters.size(); - int sspSize = sspClusters.size(); - while(sspClusters.size() < reconClusters.size()) { - sspClusters.add(null); - } - while(reconClusters.size() < sspClusters.size()) { - reconClusters.add(null); - } - - // Get the SSP cluster permutations. - permute(new ArrayList<SSPCluster>(0), sspClusters, permList); - - // Create pairs from the permutations. - List<List<Pair<Cluster, SSPCluster>>> pairList = new ArrayList<List<Pair<Cluster, SSPCluster>>>(); - for(List<SSPCluster> permutation : permList) { - List<Pair<Cluster, SSPCluster>> pairs = new ArrayList<Pair<Cluster, SSPCluster>>(reconClusters.size()); - - for(int clusterIndex = 0; (clusterIndex < reconClusters.size() && clusterIndex < permutation.size()); clusterIndex++) { - pairs.add(new Pair<Cluster, SSPCluster>(reconClusters.get(clusterIndex), permutation.get(clusterIndex))); - } - - pairList.add(pairs); - } - - // Remove the extra values. - for(int i = sspClusters.size() - 1; i >= sspSize; i--) { sspClusters.remove(i); } - for(int i = reconClusters.size() - 1; i >= reconSize; i--) { reconClusters.remove(i); } - - // Return the pairs. - return pairList; - } - - /** - * Recursive method for permuting all entries in the argument - * collection <code>remainingValues</code> into the argument - * <code>permutedValues</code> values. Completed permutations are - * placed in the argument <code>permList</code>. - * @param permutedValues - List to store entries that have already - * been permuted. - * @param remainingValues - List to store entries that need to be - * permuted. - * @param permList - List to store completed permutations. - */ - private static final void permute(List<SSPCluster> permutedValues, List<SSPCluster> remainingValues, List<List<SSPCluster>> permList) { - // If the list of entries that still need to be sorted is empty, - // then there is nothing to sort. Just return and empty list. - if(remainingValues.isEmpty()) { return; } - - // If there is only one value left in the list of entries that - // still need to be sorted, then just add it to the permutation - // list and return it. - else if(remainingValues.size() <= 1) { - // Add the last entry. - permutedValues.add(remainingValues.get(0)); - - // Add the permutation to the list of completed permutations. - permList.add(permutedValues); - } - - // Otherwise, continue to get all possible permutations. - else { - // Iterate over the entries that have not been permuted. - for(int i = 0; i < remainingValues.size(); i++) { - // Make new lists to contain the permutations. - List<SSPCluster> newPermList = new ArrayList<SSPCluster>(permutedValues.size() + 1); - List<SSPCluster> newRemainList = new ArrayList<SSPCluster>(remainingValues.size()); - - // Copy the current permuted entries to the new list - // and one value from the list of entries that have - // not been permuted yet. - newPermList.addAll(permutedValues); - newPermList.add(remainingValues.get(i)); - - // The new list of entries that have not been permuted - // should be identical, except it should now be missing - // the entry that was moved. - for(int index = 0; index < remainingValues.size(); index++) { - if(index != i) { newRemainList.add(remainingValues.get(index)); } - } - - // Repeat the process with the new lists. - permute(newPermList, newRemainList, permList); - } - } - } - - /** - * Compares two cluster matching events and finds the one that has - * the better results. Note that this will only return results that - * make sense if both of the events represent different permutations - * of the same set of clusters. Comparing events with different sets - * of clusters will produce meaningless results. - * @param firstEvent - The first cluster matching event, - * @param secondEvent - The second cluster matching event. - * @return Returns the cluster matching event that is better. - */ - private static final DetailedClusterEvent getBestPermutation(DetailedClusterEvent firstEvent, DetailedClusterEvent secondEvent) { - // If both permutations are null, return that. - if(firstEvent == null && secondEvent == null) { - return null; - } - - // If one permutation is null, it is not the best. - if(firstEvent == null) { return secondEvent; } - else if(secondEvent == null) { return firstEvent; } - - // A permutation is better if it has more matches. - if(firstEvent.getMatches() > secondEvent.getMatches()) { return firstEvent; } - else if(secondEvent.getMatches() > firstEvent.getMatches()) { return secondEvent; } - - // Otherwise, the permutation with the least energy failures is - // the better permutation. - if(firstEvent.getEnergyFailures() < secondEvent.getEnergyFailures()) { return firstEvent; } - else if(secondEvent.getEnergyFailures() < firstEvent.getEnergyFailures()) { return secondEvent; } - - // If both these values are the same, then the events are identical. - return firstEvent; - } - - /** - * Determines the number of spaces needed to render the longest of - * a series of integers as a string. - * @param vals - The series of integers. - * @return Returns the number of spaces needed to render the longest - * integer as a base-10 string. - */ - private static final int getPrintSpaces(int... vals) { - // Track the largest value. - int largest = 0; - - // Iterate over the arguments and find the largest. - for(int val : vals) { - // Get the length of the string. - int length = TriggerDiagnosticUtil.getDigits(val); - - // If it is larger, track it. - if(length > largest) { largest = length; } - } - - // Return the longer one. - return largest; - } - - /** - * Gets the position of the source of a <code>Trigger</code> object - * as text. This method only supports trigger sources of the types - * <code>SSPCluster</code>, <code>Cluster</code>, and arrays of size - * two of either type. - * @param trigger - The trigger from which to obtain the source. - * @return Returns the source of the trigger as a <code>String</code> - * object. - * @throws IllegalArgumentException Occurs if the source of the - * trigger is not any of the supported types. - */ - private static final String triggerPositionString(Trigger<?> trigger) throws IllegalArgumentException { - // Get the trigger source. - Object source = trigger.getTriggerSource(); - - // Handle valid trigger sources. - if(source instanceof SSPCluster) { - return TriggerDiagnosticUtil.clusterPositionString((SSPCluster) source); - } else if(source instanceof Cluster) { - return TriggerDiagnosticUtil.clusterPositionString((Cluster) source); - } else if(source instanceof SSPCluster[]) { - SSPCluster[] sourcePair = (SSPCluster[]) source; - if(sourcePair.length == 2) { - return String.format("%s, %s", TriggerDiagnosticUtil.clusterPositionString(sourcePair[0]), - TriggerDiagnosticUtil.clusterPositionString(sourcePair[1])); - } - } else if(source instanceof Cluster[]) { - Cluster[] sourcePair = (Cluster[]) source; - if(sourcePair.length == 2) { - return String.format("%s, %s", TriggerDiagnosticUtil.clusterPositionString(sourcePair[0]), - TriggerDiagnosticUtil.clusterPositionString(sourcePair[1])); - } - } - - // Otherwise, the source type is unrecognized. Throw an error. - throw new IllegalArgumentException(String.format("Trigger source type \"%s\" is not supported.", - trigger.getTriggerSource().getClass().getSimpleName())); - } - - /** - * Gets the time of a simulated trigger object. Method supports - * triggers with source objects of type <code>SSPCluster</code>, - * <code>Cluster</code>, and arrays of size two composed of either - * object type. - * @param trigger - The trigger. - * @return Returns the time at which the trigger occurred. - * @throws IllegalArgumentException Occurs if the trigger source - * is not a supported type. - */ - private static final double getTriggerTime(Trigger<?> trigger) throws IllegalArgumentException { - // Get the trigger source. - Object source = trigger.getTriggerSource(); - - // Get the trigger time for supported trigger types. - if(source instanceof SSPCluster) { - return ((SSPCluster) source).getTime(); - } else if(source instanceof Cluster) { - return TriggerDiagnosticUtil.getClusterTime((Cluster) source); - } else if(source instanceof SSPCluster[]) { - // Get the pair. - SSPCluster[] sourcePair = (SSPCluster[]) source; - - // Get the time of the bottom cluster. - if(sourcePair.length == 2) { - if(sourcePair[0].getYIndex() < 0) { return sourcePair[0].getTime(); } - else if(sourcePair[1].getYIndex() < 0) { return sourcePair[1].getTime(); } - else { throw new IllegalArgumentException("Cluster pairs must be formed of a top/bottom pair."); } - } - else { throw new IllegalArgumentException("Cluster pairs must be of size 2."); } - } else if(source instanceof Cluster[]) { - // Get the pair. - Cluster[] sourcePair = (Cluster[]) source; - int[] iy = { - TriggerDiagnosticUtil.getYIndex(sourcePair[0]), - TriggerDiagnosticUtil.getYIndex(sourcePair[1]) - }; - - // Get the time of the bottom cluster. - if(sourcePair.length == 2) { - if(iy[0] < 0) { return TriggerDiagnosticUtil.getClusterTime(sourcePair[0]); } - else if(iy[1] < 0) { return TriggerDiagnosticUtil.getClusterTime(sourcePair[1]); } - else { throw new IllegalArgumentException("Cluster pairs must be formed of a top/bottom pair."); } - } - else { throw new IllegalArgumentException("Cluster pairs must be of size 2."); } - } - - // If the source type is unrecognized, throw an exception. - throw new IllegalArgumentException(String.format("Trigger source type \"%\" is not supported.", - source.getClass().getSimpleName())); - } - - /** - * Checks if a simulated trigger and an SSP trigger match. Note - * that only certain types can be compared. These are: - * <ul><li><code>SinglesTrigger<?> --> SSPSinglesTrigger</code></li> - * <li><code>PairTrigger<?> --> SSPPairTrigger</code></li></ul> - * @param simTrigger - The simulated trigger. - * @param sspTrigger - The SSP bank trigger. - * @return Returns an array of <code>boolean</code> primitives that - * indicate which cuts passed and which failed. - */ - private static final boolean[] triggerCutMatch(Trigger<?> simTrigger, SSPTrigger sspTrigger) { - // Check that the cuts match for supported trigger types. - if(simTrigger instanceof SinglesTrigger && sspTrigger instanceof SSPSinglesTrigger) { - // Create an array to store the cut checks. - boolean[] cutMatch = new boolean[3]; - - // Cast the triggers. - SinglesTrigger<?> simSingles = (SinglesTrigger<?>) simTrigger; - SSPSinglesTrigger sspSingles = (SSPSinglesTrigger) sspTrigger; - - // Perform the check. - cutMatch[ENERGY_MIN] = (simSingles.getStateClusterEnergyLow() == sspSingles.passCutEnergyMin()); - cutMatch[ENERGY_MAX] = (simSingles.getStateClusterEnergyHigh() == sspSingles.passCutEnergyMax()); - cutMatch[HIT_COUNT] = (simSingles.getStateHitCount() == sspSingles.passCutHitCount()); - - // Return the match array. - return cutMatch; - } else if(simTrigger instanceof PairTrigger && sspTrigger instanceof SSPPairTrigger) { - // Create an array to store the cut checks. - boolean[] cutMatch = new boolean[4]; - - // Cast the triggers. - PairTrigger<?> simPair = (PairTrigger<?>) simTrigger; - SSPPairTrigger sspPair = (SSPPairTrigger) sspTrigger; - - // Perform the check. - cutMatch[ENERGY_SUM] = (simPair.getStateEnergySum() == sspPair.passCutEnergySum()); - cutMatch[ENERGY_DIFF] = (simPair.getStateEnergyDifference() == sspPair.passCutEnergyDifference()); - cutMatch[ENERGY_SLOPE] = (simPair.getStateEnergySlope() == sspPair.passCutEnergySlope()); - cutMatch[COPLANARITY] = (simPair.getStateCoplanarity() == sspPair.passCutCoplanarity()); - - // Return the match array. - return cutMatch; - } - - // If this point is reached, the triggers are not of a supported - // type for cut comparison. Produce an exception. - throw new IllegalArgumentException(String.format("Triggers of type \"%s\" can not be cut-matched with triggers of type \"%s\".", - simTrigger.getClass().getSimpleName(), sspTrigger.getClass().getSimpleName())); - } + * clusters and a collection of SSP clusters with an algorithm that + * ignores the times reported for each cluster. + * @param reconClusters - A collection of reconstructed clusters. + * @param sspClusters - A collection of SSP clusters. + * @param energyWindow - The window of allowed deviation between + * the reconstructed cluster and SSP cluster energies. + * @param hitWindow - The window of allowed deviation between + * the reconstructed cluster and SSP cluster hit counts. + * @return Returns the cluster matching results stored inside a + * <code>clusterMatchEvent</code> object. + */ + private static final DetailedClusterEvent matchClusters(Collection<Cluster> reconClusters, + Collection<SSPCluster> sspClusters, double energyWindow, int hitWindow) { + // Track the number of cluster pairs that were matched and that + // failed by failure type. + DetailedClusterEvent event = new DetailedClusterEvent(); + + // Create maps to link cluster position to the list of clusters + // that were found at that location. + Map<Point, List<Cluster>> reconClusterMap = new HashMap<Point, List<Cluster>>(reconClusters.size()); + Map<Point, List<SSPCluster>> sspClusterMap = new HashMap<Point, List<SSPCluster>>(reconClusters.size()); + + // Populate the reconstructed cluster map. + for(Cluster reconCluster : reconClusters) { + // Get the cluster position. + Point position = new Point(TriggerDiagnosticUtil.getXIndex(reconCluster), + TriggerDiagnosticUtil.getYIndex(reconCluster)); + + // Get the list for this cluster position. + List<Cluster> reconList = reconClusterMap.get(position); + if(reconList == null) { + reconList = new ArrayList<Cluster>(); + reconClusterMap.put(position, reconList); + } + + // Add the cluster to the list. + reconList.add(reconCluster); + } + + // Populate the SSP cluster map. + for(SSPCluster sspCluster : sspClusters) { + // Get the cluster position. + Point position = new Point(sspCluster.getXIndex(), sspCluster.getYIndex()); + + // Get the list for this cluster position. + List<SSPCluster> sspList = sspClusterMap.get(position); + if(sspList == null) { + sspList = new ArrayList<SSPCluster>(); + sspClusterMap.put(position, sspList); + } + + // Add the cluster to the list. + sspList.add(sspCluster); + } + + // For each reconstructed cluster, attempt to match the clusters + // with SSP clusters at the same position. + positionLoop: + for(Entry<Point, List<Cluster>> clusterSet : reconClusterMap.entrySet()) { + // Get the reconstructed and SSP clusters at this position. + List<Cluster> reconList = clusterSet.getValue(); + List<SSPCluster> sspList = sspClusterMap.get(clusterSet.getKey()); + + // Print the crystal position header. + OutputLogger.println(); + OutputLogger.printf("Considering clusters at (%3d, %3d)%n", clusterSet.getKey().x, clusterSet.getKey().y); + + // If there are no SSP clusters, then matching fails by + // reason of position. The remainder of the loop may be + // skipped, since there is nothing to check. + if(sspList == null || sspList.isEmpty()) { + event.pairFailPosition(reconList.size()); + continue positionLoop; + } + + // Get all possible permutations of SSP clusters. + List<List<Pair<Cluster, SSPCluster>>> permutations = getPermutations(reconList, sspList); + + // Print the information for this crystal position. + OutputLogger.printf("\tRecon Clusters :: %d%n", reconList.size()); + OutputLogger.printf("\tSSP Clusters :: %d%n", sspList.size()); + OutputLogger.printf("\tPermutations :: %d%n", permutations.size()); + + // Track the plotted values for the current best permutation. + DetailedClusterEvent bestPerm = null; + + // Iterate over the permutations and find the permutation + // that produces the best possible result when compared to + // the reconstructed clusters. + int permIndex = 0; + for(List<Pair<Cluster, SSPCluster>> pairs : permutations) { + // Update the current permutation number. + permIndex++; + + // Track the plot values for this permutation. + DetailedClusterEvent perm = new DetailedClusterEvent(); + + // Try to match each pair. + pairLoop: + for(Pair<Cluster, SSPCluster> pair : pairs) { + // Print the current reconstructed/SSP cluster pair. + OutputLogger.printf("\tP%d :: %s --> %s", permIndex, + pair.getFirstElement() == null ? "None" : TriggerDiagnosticUtil.clusterToString(pair.getFirstElement()), + pair.getSecondElement() == null ? "None" : TriggerDiagnosticUtil.clusterToString(pair.getSecondElement())); + + // If either cluster in the pair is null, there + // are not enough clusters to perform this match. + if(pair.getFirstElement() == null || pair.getSecondElement() == null) { + // Log the result. + OutputLogger.printf(" [ %18s ]%n", "failure: unpaired"); + + // An unpaired SSP cluster does not necessarily + // represent a problem. Often, this just means + // that the SSP cluster's matching reconstructed + // cluster is outside the verification window. + if(pair.getSecondElement() == null) { + perm.pairFailPosition(pair.getFirstElement(), pair.getSecondElement()); + } + + // Skip the rest of the checks. + continue pairLoop; + } + + // Check if the reconstructed cluster has an energy + // within the allotted threshold of the SSP cluster. + if(pair.getSecondElement().getEnergy() >= pair.getFirstElement().getEnergy() - energyWindow && + pair.getSecondElement().getEnergy() <= pair.getFirstElement().getEnergy() + energyWindow) { + + // Check that the hit count of the reconstructed + // is within the allotted threshold of the SSP + // cluster. + if(pair.getSecondElement().getHitCount() >= pair.getFirstElement().getCalorimeterHits().size() - hitWindow && + pair.getSecondElement().getHitCount() <= pair.getFirstElement().getCalorimeterHits().size() + hitWindow) { + // Designate the pair as a match. + perm.pairMatch(pair.getFirstElement(), pair.getSecondElement()); + OutputLogger.printf(" [ %18s ]%n", "success: matched"); + } else { + perm.pairFailHitCount(pair.getFirstElement(), pair.getSecondElement()); + OutputLogger.printf(" [ %18s ]%n", "failure: hit count"); + } // End hit count check. + } else { + perm.pairFailEnergy(pair.getFirstElement(), pair.getSecondElement()); + OutputLogger.printf(" [ %18s ]%n", "failure: energy"); + } // End energy check. + } // End Pair Loop + + // Print the results of the permutation. + OutputLogger.printf("\t\tPermutation Matched :: %d%n", perm.getMatches()); + OutputLogger.printf("\t\tPermutation Energy :: %d%n", perm.getEnergyFailures()); + OutputLogger.printf("\t\tPermutation Hit Count :: %d%n", perm.getHitCountFailures()); + + // Check whether the results from this permutation + // exceed the quality of the last best results. A + // greater number of matches is always better. If the + // matches are the same, select the one with fewer + // failures due to energy. + bestPerm = getBestPermutation(bestPerm, perm); + } // End Permutation Loop + + // Print the final results for the position. + OutputLogger.printf("\tPosition Matched :: %d%n", bestPerm.getMatches()); + OutputLogger.printf("\tPosition Energy :: %d%n", bestPerm.getEnergyFailures()); + OutputLogger.printf("\tPosition Hit Count :: %d%n", bestPerm.getHitCountFailures()); + + // Add the results from the best-matched permutation + // to the event efficiency results. + event.addEvent(bestPerm); + } // End Crystal Position Loop + + // Return the cluster match summary. + return event; + } + + /** + * Performs cluster matching between a collection of reconstructed + * clusters and a collection of SSP clusters using the strictly + * time-compliant algorithm. + * @param reconClusters - A collection of reconstructed clusters. + * @param sspClusters - A collection of SSP clusters. + * @param energyWindow - The window of allowed deviation between + * the reconstructed cluster and SSP cluster energies. + * @param hitWindow - The window of allowed deviation between + * the reconstructed cluster and SSP cluster hit counts. + * @return Returns the cluster matching results stored inside a + * <code>clusterMatchEvent</code> object. + */ + private static final DetailedClusterEvent matchClustersTimeCompliant(Collection<Cluster> reconClusters, + Collection<SSPCluster> sspClusters, double energyWindow, int hitWindow) { + // Track the number of cluster pairs that were matched and that + // failed by failure type. + DetailedClusterEvent event = new DetailedClusterEvent(); + + // Store the clusters which have been successfully paired. + Set<SSPCluster> sspMatched = new HashSet<SSPCluster>(sspClusters.size()); + + // Find reconstructed/SSP cluster matched pairs. + reconLoop: + for(Cluster reconCluster : reconClusters) { + // Track whether a position-matched cluster was found. + boolean matchedPosition = false; + + // VERBOSE :: Output the cluster being matched. + OutputLogger.printf("Considering %s%n", TriggerDiagnosticUtil.clusterToString(reconCluster)); + + // Search through the SSP clusters for a matching cluster. + sspLoop: + for(SSPCluster sspCluster : sspClusters) { + // VERBOSE :: Output the SSP cluster being considered. + OutputLogger.printf("\t%s ", TriggerDiagnosticUtil.clusterToString(sspCluster)); + + // If this cluster has been paired, skip it. + if(sspMatched.contains(sspCluster)) { + OutputLogger.printf("[ %7s; %9s ]%n", "fail", "matched"); + continue sspLoop; + } + + // Matched clusters must have the same position. + if(TriggerDiagnosticUtil.getXIndex(reconCluster) != sspCluster.getXIndex() + || TriggerDiagnosticUtil.getYIndex(reconCluster) != sspCluster.getYIndex()) { + OutputLogger.printf("[ %7s; %9s ]%n", "fail", "position"); + continue sspLoop; + } + + // Note that a cluster was found at this position. + matchedPosition = true; + + // Matched clusters must have the same time-stamp. + if(reconCluster.getCalorimeterHits().get(0).getTime() != sspCluster.getTime()) { + OutputLogger.printf("[ %7s; %9s ]%n", "fail", "time"); + continue sspLoop; + } + + // Clusters that pass all of the above checks are the + // same cluster. + sspMatched.add(sspCluster); + + // Check that the clusters are sufficiently close in + // energy to one another. + if(sspCluster.getEnergy() >= reconCluster.getEnergy() - energyWindow + && sspCluster.getEnergy() <= reconCluster.getEnergy() + energyWindow) { + // If a cluster matches in energy, check that it + // is also sufficiently close in hit count. + if(sspCluster.getHitCount() >= reconCluster.getCalorimeterHits().size() - hitWindow && + sspCluster.getHitCount() <= reconCluster.getCalorimeterHits().size() + hitWindow) { + // The cluster is a match. + event.pairMatch(reconCluster, sspCluster); + OutputLogger.printf("[ %7s; %9s ]%n", "success", "matched"); + continue reconLoop; + } else { + event.pairFailHitCount(reconCluster, sspCluster); + OutputLogger.printf("[ %7s; %9s ]%n", "fail", "hit count"); + continue reconLoop; + } // End hit count check. + } else { + event.pairFailEnergy(reconCluster, sspCluster); + OutputLogger.printf("[ %7s; %9s ]%n", "fail", "energy"); + continue reconLoop; + } // End energy check. + }// End SSP loop. + + // If the reconstructed cluster has not been matched, check + // if a cluster was found at the same position. If not, then + // the cluster fails by reason of position. + if(!matchedPosition) { + event.pairFailPosition(reconCluster, null); + } + + // Otherwise, the cluster had a potential matched, but the + // time-stamps were off. The cluster fails by reason of time. + else { + event.pairFailTime(reconCluster, null); + } + } // End recon loop. + + // Return the populated match event. + return event; + } + + /** + * Checks triggers simulated on SSP clusters against the SSP bank's + * reported triggers to verify that the trigger is correctly applying + * cuts to the clusters it sees. Additionally compares triggers + * simulated on reconstructed clusters to measure trigger efficiency. + */ + private void singlesTriggerVerification() { + // Create lists of generic triggers. + List<List<? extends Trigger<?>>> sspTriggerList = new ArrayList<List<? extends Trigger<?>>>(2); + List<List<? extends Trigger<?>>> reconTriggerList = new ArrayList<List<? extends Trigger<?>>>(2); + + // Convert the simulated triggers to generic versions and add + // them to the generic list. + sspTriggerList.add(triggerData.getSimSSPTriggers().getSingles0Triggers()); + sspTriggerList.add(triggerData.getSimSSPTriggers().getSingles1Triggers()); + reconTriggerList.add(triggerData.getSimReconTriggers().getSingles0Triggers()); + reconTriggerList.add(triggerData.getSimReconTriggers().getSingles1Triggers()); + + // Run generic trigger verification. + triggerVerification(sspTriggerList, reconTriggerList, true); + } + + /** + * Checks triggers simulated on SSP clusters against the SSP bank's + * reported triggers to verify that the trigger is correctly applying + * cuts to the clusters it sees. Additionally compares triggers + * simulated on reconstructed clusters to measure trigger efficiency. + */ + private void pairTriggerVerification() { + // Create lists of generic triggers. + List<List<? extends Trigger<?>>> sspTriggerList = new ArrayList<List<? extends Trigger<?>>>(2); + List<List<? extends Trigger<?>>> reconTriggerList = new ArrayList<List<? extends Trigger<?>>>(2); + + // Convert the simulated triggers to generic versions and add + // them to the generic list. + sspTriggerList.add(triggerData.getSimSSPTriggers().getPair0Triggers()); + sspTriggerList.add(triggerData.getSimSSPTriggers().getPair1Triggers()); + reconTriggerList.add(triggerData.getSimReconTriggers().getPair0Triggers()); + reconTriggerList.add(triggerData.getSimReconTriggers().getPair1Triggers()); + + // Run generic trigger verification. + triggerVerification(sspTriggerList, reconTriggerList, false); + } + + /** + * Performs trigger verification for both trigger types. + * @param sspTriggerList - The list of SSP triggers. + * @param reconTriggerList - The list of reconstructed triggers. + * @param isSingles - Whether or not this is a singles trigger + * verification. + */ + private void triggerVerification(List<List<? extends Trigger<?>>> sspTriggerList, + List<List<? extends Trigger<?>>> reconTriggerList, boolean isSingles) { + + // ========================================================== + // ==== Initialize Trigger Verification ===================== + // ========================================================== + + // Print the cluster verification header. + OutputLogger.println(); + OutputLogger.println(); + OutputLogger.println("======================================================================"); + if(isSingles) { OutputLogger.println("=== Singles Trigger Verification ====================================="); } + else { OutputLogger.println("=== Pair Trigger Verification ========================================"); } + OutputLogger.println("======================================================================"); + + // Track the number of triggers seen and the number found. + TriggerEvent[] triggerEvent = { new TriggerEvent(), new TriggerEvent() }; + + // ========================================================== + // ==== Output Event Summary ================================ + // ========================================================== + + // Get the list of triggers reported by the SSP. + List<? extends SSPNumberedTrigger> sspTriggers; + if(isSingles) { sspTriggers = sspBank.getSinglesTriggers(); } + else { sspTriggers = sspBank.getPairTriggers(); } + + // Output the SSP cluster triggers. + OutputLogger.println(); + OutputLogger.println("SSP Cluster " + (isSingles ? "Singles" : "Pair") + " Triggers"); + for(int triggerNum = 0; triggerNum < 2; triggerNum++) { + for(Trigger<?> simTrigger : sspTriggerList.get(triggerNum)) { + OutputLogger.printf("\tTrigger %d :: %s :: %3.0f :: %s%n", + (triggerNum + 1), triggerPositionString(simTrigger), + getTriggerTime(simTrigger), simTrigger.toString()); + } + } + if(sspTriggerList.get(0).size() + sspTriggerList.get(1).size() == 0) { + OutputLogger.println("\tNone"); + } + + // Output the reconstructed cluster singles triggers. + OutputLogger.println("Reconstructed Cluster " + (isSingles ? "Singles" : "Pair") + " Triggers"); + for(int triggerNum = 0; triggerNum < 2; triggerNum++) { + for(Trigger<?> simTrigger : reconTriggerList.get(triggerNum)) { + OutputLogger.printf("\tTrigger %d :: %s :: %3.0f :: %s%n", + (triggerNum + 1), triggerPositionString(simTrigger), + getTriggerTime(simTrigger), simTrigger.toString()); + } + } + if(reconTriggerList.get(0).size() + reconTriggerList.get(1).size() == 0) { + OutputLogger.println("\tNone"); + } + + // Output the SSP reported triggers. + OutputLogger.println("SSP Reported " + (isSingles ? "Singles" : "Pair") + " Triggers"); + for(SSPTrigger sspTrigger : sspTriggers) { + OutputLogger.printf("\t%s%n", sspTrigger.toString()); + } + if(sspTriggers.size() == 0) { OutputLogger.println("\tNone"); } + + // Update the trigger event with the counts for each type of + // simulated trigger. Reported triggers are counted later when + // already iterating over them. + for(int triggerNum = 0; triggerNum < 2; triggerNum++) { + triggerEvent[triggerNum].sawSSPSimulatedTriggers(tiFlags, sspTriggerList.get(triggerNum).size()); + triggerEvent[triggerNum].sawReconSimulatedTriggers(tiFlags, reconTriggerList.get(triggerNum).size()); + } + + + + // ========================================================== + // ==== SSP Internal Logic Verification ===================== + // ========================================================== + + // Track which SSP triggers have been matched to avoid matching + // multiple reconstructed SSP cluster triggers to the same SSP + // trigger. + Set<SSPNumberedTrigger> sspTriggerSet = new HashSet<SSPNumberedTrigger>(); + Set<Trigger<?>> simTriggerSet = new HashSet<Trigger<?>>(); + + // Track the number of SSP reported triggers that are found in + // excess of the SSP simulated triggers. + int sspReportedExtras = sspTriggers.size() - (sspTriggerList.get(0).size() + sspTriggerList.get(1).size()); + if(sspReportedExtras > 0) { + if(isSingles) { singlesInternalFail = true; } + else { pairInternalFail = true; } + } else { sspReportedExtras = 0; } + + // Iterate over the triggers. + OutputLogger.println(); + OutputLogger.println("Matching SSP Reported Triggers to SSP Simulated Triggers:"); + for(SSPNumberedTrigger sspTrigger : sspTriggers) { + // Get the trigger information. + int triggerNum = sspTrigger.isFirstTrigger() ? 0 : 1; + OutputLogger.printf("\t%s%n", sspTrigger.toString()); + + // Note that a bank trigger was seen. + triggerEvent[triggerNum].sawReportedTrigger(); + + // Iterate over the SSP cluster simulated triggers and + // look for a trigger that matches. + matchLoop: + for(Trigger<?> simTrigger : sspTriggerList.get(triggerNum)) { + // VERBOSE :: Output the trigger being considered for + // matching. + OutputLogger.printf("\t\tTrigger %d :: %s :: %3.0f :: %s ", + (triggerNum + 1), triggerPositionString(simTrigger), + getTriggerTime(simTrigger), simTrigger.toString()); + + // If the current SSP trigger has already been matched, + // skip it. + if(simTriggerSet.contains(simTrigger)) { + OutputLogger.printf("[ %-15s ]%n", "failed; matched"); + continue matchLoop; + } + + // Check that the triggers have the same time. Triggers + // generated from SSP bank clusters should always align + // in time. + if(sspTrigger.getTime() != getTriggerTime(simTrigger)) { + OutputLogger.printf("[ %-15s ]%n", "failed; time"); + continue matchLoop; + } + + // Check whether the trigger cuts match. + boolean[] matchedCuts = triggerCutMatch(simTrigger, sspTrigger); + for(int i = 0; i < matchedCuts.length; i++) { + if(!matchedCuts[i]) { + int typeIndex = isSingles ? 0 : 1; + OutputLogger.printf("[ %-15s ]%n", String.format("failed; %s", cutNames[typeIndex][i])); + continue matchLoop; + } + } + + // If all the cuts match, along with the time and the + // trigger number, than these triggers are a match. + sspTriggerSet.add(sspTrigger); + simTriggerSet.add(simTrigger); + triggerEvent[triggerNum].matchedSSPTrigger(tiFlags); + OutputLogger.printf("[ %-15s ]%n", "success"); + break matchLoop; + } + } + + for(int triggerNum = 0; triggerNum < 2; triggerNum++) { + for(Trigger<?> simTrigger : sspTriggerList.get(triggerNum)) { + globalTriggerPlots.sawTrigger(simTrigger); + if(simTriggerSet.contains(simTrigger)) { + globalTriggerPlots.matchedTrigger(simTrigger); + } else { + globalTriggerPlots.failedTrigger(simTrigger); + } + } + } + + // Iterate over the unmatched simulated triggers again and the + // unmatched SSP reported trigger that most closely matches it. + OutputLogger.println(); + OutputLogger.println("Matching Failed SSP Reported Triggers to Remaining SSP Simulated Triggers:"); + for(int triggerNum = 0; triggerNum < 2; triggerNum++) { + simLoop: + for(Trigger<?> simTrigger : sspTriggerList.get(triggerNum)) { + OutputLogger.printf("\tTrigger %d :: %s :: %3.0f :: %s%n", + (triggerNum + 1), triggerPositionString(simTrigger), + getTriggerTime(simTrigger), simTrigger.toString()); + + // Check whether this trigger has already been matched + // or not. If it has been matched, skip it. + if(simTriggerSet.contains(simTrigger)) { + OutputLogger.println("\t\tSkipping; already matched successfully"); + continue simLoop; + } + + // Get the trigger time for the simulated trigger. + double simTime = getTriggerTime(simTrigger); + + // Track the match statistics for each reported trigger + // so that the closest match may be found. + int numMatched = -1; + boolean[] matchedCut = null; + SSPNumberedTrigger bestMatch = null; + + // Store the readout for the best match. + String bestMatchText = null; + + // Iterate over the reported triggers to find a match. + reportedLoop: + for(SSPNumberedTrigger sspTrigger : sspTriggers) { + OutputLogger.printf("\t\t%s ", sspTrigger.toString()); + + // If the two triggers have different times, this + // trigger should be skipped. + if(sspTrigger.getTime() != simTime) { + OutputLogger.printf("[ %-15s ]%n", "failed; time"); + continue reportedLoop; + } + + // If this reported trigger has been matched then + // it should be skipped. + if(sspTriggerSet.contains(sspTrigger)) { + OutputLogger.printf("[ %-15s ]%n", "failed; matched"); + continue reportedLoop; + } + + // Check each of the cuts. + boolean[] tempMatchedCut = triggerCutMatch(simTrigger, sspTrigger); + + // Check each cut and see if this is a closer match + // than the previous best match. + int tempNumMatched = 0; + for(boolean passed : tempMatchedCut) { if(passed) { tempNumMatched++; } } + OutputLogger.printf("[ %-15s ]%n", String.format("maybe; %d failed", tempNumMatched)); + + // If the number of matched cuts exceeds the old + // best result, this becomes the new best result. + if(tempNumMatched > numMatched) { + numMatched = tempNumMatched; + matchedCut = tempMatchedCut; + bestMatch = sspTrigger; + bestMatchText = String.format("%s%n", sspTrigger.toString()); + } + } + + // If there was no match found, it means that there were + // no triggers that were both unmatched and at the same + // time as this simulated trigger. + if(bestMatch == null) { + if(isSingles) { singlesInternalFail = true; } + else { pairInternalFail = true; } + triggerEvent[triggerNum].failedSSPTrigger(); + OutputLogger.printf("\t\tTrigger %d :: %s :: %3.0f :: %s", + (triggerNum + 1), triggerPositionString(simTrigger), + getTriggerTime(simTrigger), simTrigger.toString()); + OutputLogger.println(" --> No Valid Match Found"); + } else { + triggerEvent[triggerNum].matchedSSPTrigger(tiFlags, matchedCut); + OutputLogger.printf("\t\tTrigger %d :: %s :: %3.0f :: %s", + (triggerNum + 1), triggerPositionString(simTrigger), + getTriggerTime(simTrigger), simTrigger.toString()); + OutputLogger.println(" --> " + bestMatchText); + } + } + } + + + + // ========================================================== + // ==== Trigger Efficiency ================================== + // ========================================================== + + // Reset the SSP matched trigger set. + sspTriggerSet.clear(); + + // Iterate over the reconstructed cluster singles triggers. + OutputLogger.println(); + OutputLogger.println("Recon Cluster Trigger --> SSP Reported Trigger Match Status"); + for(int triggerNum = 0; triggerNum < 2; triggerNum++) { + for(Trigger<?> simTrigger : reconTriggerList.get(triggerNum)) { + OutputLogger.printf("\tTrigger %d :: %s :: %s%n", (triggerNum + 1), + triggerPositionString(simTrigger), simTrigger.toString()); + + // TEMP :: Populate the recon ALL pairs plots. + globalTriggerPlots.sawTrigger(simTrigger); + + // Iterate over the SSP reported triggers and compare + // them to the reconstructed cluster simulated trigger. + boolean matched = false; + matchLoop: + for(SSPNumberedTrigger sspTrigger : sspTriggers) { + OutputLogger.printf("\t\t\t%s", sspTrigger.toString()); + + // Only compare triggers if they are from the + // same trigger source. + if((triggerNum == 0 && sspTrigger.isSecondTrigger()) + || (triggerNum == 1 && sspTrigger.isFirstTrigger())) { + OutputLogger.print(" [ fail; source ]%n"); + continue matchLoop; + } + + // Only compare the singles trigger if it was + // not already matched to another trigger. + if(sspTriggerSet.contains(sspTrigger)) { + OutputLogger.print(" [ fail; matched ]%n"); + continue matchLoop; + } + + // Test each cut. + int typeIndex = isSingles ? 0 : 1; + boolean[] matchedCuts = triggerCutMatch(simTrigger, sspTrigger); + for(int cutIndex = 0; cutIndex < matchedCuts.length; cutIndex++) { + if(!matchedCuts[cutIndex]) { + OutputLogger.printf(" [ fail; %-9s ]%n", cutNames[typeIndex][cutIndex]); + continue matchLoop; + } + } + + // If all the trigger flags match, then the + // triggers are a match. + sspTriggerSet.add(sspTrigger); + triggerEvent[triggerNum].matchedReconTrigger(tiFlags); + OutputLogger.print(" [ success ]%n"); + globalTriggerPlots.matchedTrigger(simTrigger); + matched = true; + break matchLoop; + } + + if(!matched) { globalTriggerPlots.failedTrigger(simTrigger); } + } + } + + + + // ========================================================== + // ==== Output Event Results ================================ + // ========================================================== + + // Get the number of SSP and reconstructed cluster simulated + // triggers. + int sspSimTriggers = sspTriggerList.get(0).size() + sspTriggerList.get(1).size(); + int reconSimTriggers = reconTriggerList.get(0).size() + reconTriggerList.get(1).size(); + int[] sspTriggerCount = { sspTriggerList.get(0).size(), sspTriggerList.get(1).size() }; + + // Print event statistics. + OutputLogger.println(); + OutputLogger.println("Event Statistics:"); + OutputLogger.printf("\tSSP Cluster Sim Triggers :: %d%n", sspSimTriggers); + OutputLogger.printf("\tRecon Cluster Sim Triggers :: %d%n", reconSimTriggers); + OutputLogger.printf("\tSSP Reported Triggers :: %d%n", sspTriggers.size()); + + int matchedSSPTriggers = triggerEvent[0].getMatchedSSPSimulatedTriggers() + triggerEvent[1].getMatchedSSPSimulatedTriggers(); + OutputLogger.printf("\tInternal Efficiency :: %d / %d ", matchedSSPTriggers, sspSimTriggers); + if(sspSimTriggers == 0) { OutputLogger.printf("(N/A)%n"); } + else { OutputLogger.printf("(%3.0f%%)%n", (100.0 * matchedSSPTriggers / sspSimTriggers)); } + + int matchedReconTriggers = triggerEvent[0].getMatchedReconSimulatedTriggers() + triggerEvent[1].getMatchedReconSimulatedTriggers(); + OutputLogger.printf("\tTrigger Efficiency :: %d / %d", matchedReconTriggers, reconSimTriggers); + if(reconSimTriggers == 0) { OutputLogger.printf("(N/A)%n"); } + else { OutputLogger.printf("(%3.0f%%)%n", (100.0 * matchedReconTriggers / reconSimTriggers)); } + + // Print the individual cut performances. + if(isSingles) { + OutputLogger.println(); + for(int triggerNum = 0; triggerNum < 2; triggerNum++) { + OutputLogger.printf("Trigger %d Individual Cut Failure Rate:%n", (triggerNum + 1)); + if(sspSimTriggers == 0) { + OutputLogger.printf("\tCluster Energy Lower Bound :: %d / %d%n", triggerEvent[triggerNum].getSSPCutFailures(ENERGY_MIN), sspTriggerCount[triggerNum]); + OutputLogger.printf("\tCluster Energy Upper Bound :: %d / %d%n", triggerEvent[triggerNum].getSSPCutFailures(ENERGY_MAX), sspTriggerCount[triggerNum]); + OutputLogger.printf("\tCluster Hit Count :: %d / %d%n", triggerEvent[triggerNum].getSSPCutFailures(HIT_COUNT), sspTriggerCount[triggerNum]); + } else { + OutputLogger.printf("\tCluster Energy Lower Bound :: %d / %d (%3.0f%%)%n", + triggerEvent[triggerNum].getSSPCutFailures(ENERGY_MIN), sspTriggerCount[triggerNum], + (100.0 * triggerEvent[triggerNum].getSSPCutFailures(ENERGY_MIN) / sspTriggerCount[triggerNum])); + OutputLogger.printf("\tCluster Energy Upper Bound :: %d / %d (%3.0f%%)%n", + triggerEvent[triggerNum].getSSPCutFailures(ENERGY_MAX), sspTriggerCount[triggerNum], + (100.0 * triggerEvent[triggerNum].getSSPCutFailures(ENERGY_MAX) / sspTriggerCount[triggerNum])); + OutputLogger.printf("\tCluster Hit Count :: %d / %d (%3.0f%%)%n", + triggerEvent[triggerNum].getSSPCutFailures(HIT_COUNT), sspTriggerCount[triggerNum], + (100.0 * triggerEvent[triggerNum].getSSPCutFailures(HIT_COUNT) / sspTriggerCount[triggerNum])); + } + } + + // Update the global trigger tracking variables. + localStats.getTriggerStats().getSingles0Stats().addEvent(triggerEvent[0]); + localStats.getTriggerStats().getSingles1Stats().addEvent(triggerEvent[1]); + globalStats.getTriggerStats().getSingles0Stats().addEvent(triggerEvent[0]); + globalStats.getTriggerStats().getSingles1Stats().addEvent(triggerEvent[1]); + } else { + for(int triggerNum = 0; triggerNum < 2; triggerNum++) { + OutputLogger.println(); + OutputLogger.printf("Trigger %d Individual Cut Failure Rate:%n", (triggerNum + 1)); + if(sspTriggerCount[triggerNum] == 0) { + OutputLogger.printf("\tPair Energy Sum :: %d / %d%n", triggerEvent[triggerNum].getSSPCutFailures(ENERGY_SUM), sspTriggerCount[triggerNum]); + OutputLogger.printf("\tPair Energy Difference :: %d / %d%n", triggerEvent[triggerNum].getSSPCutFailures(ENERGY_DIFF), sspTriggerCount[triggerNum]); + OutputLogger.printf("\tPair Energy Slope :: %d / %d%n", triggerEvent[triggerNum].getSSPCutFailures(ENERGY_SLOPE), sspTriggerCount[triggerNum]); + OutputLogger.printf("\tPair Coplanarity :: %d / %d%n", triggerEvent[triggerNum].getSSPCutFailures(COPLANARITY), sspTriggerCount[triggerNum]); + } else { + OutputLogger.printf("\tPair Energy Sum :: %d / %d (%3.0f%%)%n", + triggerEvent[triggerNum].getSSPCutFailures(ENERGY_SUM), sspTriggerCount[triggerNum], + (100.0 * triggerEvent[triggerNum].getSSPCutFailures(ENERGY_SUM) / sspTriggerCount[triggerNum])); + OutputLogger.printf("\tPair Energy Difference :: %d / %d (%3.0f%%)%n", + triggerEvent[triggerNum].getSSPCutFailures(ENERGY_DIFF), sspTriggerCount[triggerNum], + (100.0 * triggerEvent[triggerNum].getSSPCutFailures(ENERGY_DIFF) / sspTriggerCount[triggerNum])); + OutputLogger.printf("\tPair Energy Slope :: %d / %d (%3.0f%%)%n", + triggerEvent[triggerNum].getSSPCutFailures(ENERGY_SLOPE), sspTriggerCount[triggerNum], + (100.0 * triggerEvent[triggerNum].getSSPCutFailures(ENERGY_SLOPE) / sspTriggerCount[triggerNum])); + OutputLogger.printf("\tPair Coplanarity :: %d / %d (%3.0f%%)%n", + triggerEvent[triggerNum].getSSPCutFailures(COPLANARITY), sspTriggerCount[triggerNum], + (100.0 * triggerEvent[triggerNum].getSSPCutFailures(COPLANARITY) / sspTriggerCount[triggerNum])); + } + } + + // Update the global trigger tracking variables. + localStats.getTriggerStats().getPair0Stats().addEvent(triggerEvent[0]); + localStats.getTriggerStats().getPair1Stats().addEvent(triggerEvent[1]); + globalStats.getTriggerStats().getPair0Stats().addEvent(triggerEvent[0]); + globalStats.getTriggerStats().getPair1Stats().addEvent(triggerEvent[1]); + } + + // Note whether the was a trigger match failure. + if(triggerEvent[0].getFailedReconSimulatedTriggers() != 0 && triggerEvent[1].getFailedReconSimulatedTriggers() != 0) { + if(isSingles) { singlesEfficiencyFail = true; } + else { pairEfficiencyFail = true; } + } if(triggerEvent[0].getFailedSSPSimulatedTriggers() != 0 && triggerEvent[1].getFailedSSPSimulatedTriggers() != 0) { + if(isSingles) { singlesInternalFail = true; } + else { pairInternalFail = true; } + } + } + + /** + * Outputs all of the verification parameters currently in use by + * the software. A warning will be issued if the values for NSA and + * NSB, along with the FADC window, preclude clusters from being + * verified. + */ + private void logSettings() { + // Output general settings. + System.out.println("Cluster Verification Settings"); + System.out.printf("\tHit Threshold :: %1d hit(s)%n", hitAcceptance); + System.out.printf("\tEnergy Threshold :: %5.3f GeV%n", energyAcceptance); + System.out.println(); + + // Output window settings. + System.out.println("FADC Timing Window Settings"); + System.out.printf("\tNSB :: %3d ns%n", nsb); + System.out.printf("\tNSA :: %3d ns%n", nsa); + System.out.printf("\tFADC Window :: %3d ns%n", windowWidth); + + // Calculate the valid clustering window. + int start = nsb; + int end = windowWidth - nsa; + if(start < end) { + System.out.printf("\tValid Cluster Window :: [ %3d ns, %3d ns ]%n", start, end); + performClusterVerification = true; + } else { + System.out.println("\tNSB, NSA, and FADC window preclude a valid cluster verification window."); + System.out.println("\tCluster verification will not be performed!"); + performClusterVerification = false; + } + System.out.println(); + + // Output the singles trigger settings. + for(int i = 0; i < 2; i++) { + // Print the settings. + System.out.printf("Singles Trigger %d Settings%23s[%5b]%n", (i + 1), "", singlesTriggerEnabled[i]); + System.out.printf("\tCluster Energy Low :: %.3f GeV [%5b]%n", + singlesTrigger[i].getCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW), singlesCutsEnabled[i][0]); + System.out.printf("\tCluster Energy High :: %.3f GeV [%5b]%n", + singlesTrigger[i].getCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH), singlesCutsEnabled[i][1]); + System.out.printf("\tCluster Hit Count :: %.0f hit(s) [%5b]%n", + singlesTrigger[i].getCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW), singlesCutsEnabled[i][2]); + System.out.println(); + } + + // Output the pair trigger settings. + for(int i = 0; i < 2; i++) { + System.out.printf("Pairs Trigger %d Settings%25s[%5b]%n", (i + 1), "", pairTriggerEnabled[i]); + System.out.printf("\tCluster Energy Low :: %.3f GeV [%5b]%n", + pairsTrigger[i].getCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW), pairCutsEnabled[i][0]); + System.out.printf("\tCluster Energy High :: %.3f GeV [%5b]%n", + pairsTrigger[i].getCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH), pairCutsEnabled[i][1]); + System.out.printf("\tCluster Hit Count :: %.0f hit(s) [%5b]%n", + pairsTrigger[i].getCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW), pairCutsEnabled[i][2]); + System.out.printf("\tPair Energy Sum Low :: %.3f GeV [%5b]%n", + pairsTrigger[i].getCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW), pairCutsEnabled[i][3]); + System.out.printf("\tPair Energy Sum High :: %.3f GeV [%5b]%n", + pairsTrigger[i].getCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH), pairCutsEnabled[i][3]); + System.out.printf("\tPair Energy Difference :: %.3f GeV [%5b]%n", + pairsTrigger[i].getCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH), pairCutsEnabled[i][4]); + System.out.printf("\tPair Energy Slope :: %.3f GeV [%5b]%n", + pairsTrigger[i].getCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW), pairCutsEnabled[i][5]); + System.out.printf("\tPair Energy Slope F :: %.4f GeV / mm%n", + pairsTrigger[i].getCutValue(TriggerModule.PAIR_ENERGY_SLOPE_F)); + System.out.printf("\tPair Coplanarity :: %3.0f Degrees [%5b]%n", + pairsTrigger[i].getCutValue(TriggerModule.PAIR_COPLANARITY_HIGH), pairCutsEnabled[i][6]); + System.out.printf("\tPair Time Coincidence :: %2.0f ns [%5b]%n", + pairsTrigger[i].getCutValue(TriggerModule.PAIR_TIME_COINCIDENCE), true); + System.out.println(); + } + } + + /** + * Summarizes the global run statistics in a log to the terminal. + */ + private void logStatistics() { + // Print the cluster/trigger verification header. + System.out.println(); + System.out.println(); + System.out.println("======================================================================"); + System.out.println("=== Cluster/Trigger Verification Results ============================="); + System.out.println("======================================================================"); + + // Print the general event failure rate. + int headSpaces = getPrintSpaces(globalStats.getEventCount()); + System.out.println("General Event Statistics:"); + System.out.printf("\tEvent Start Time :: %.3f s%n", (startTime / Math.pow(10, 9))); + System.out.printf("\tEvent End Time :: %.3f%n", (endTime / Math.pow(10, 9))); + System.out.printf("\tEvent Run Time :: %.3f%n", ((endTime - startTime) / Math.pow(10, 9))); + System.out.printf("\tNoise Events :: %" + headSpaces + "d / %" + headSpaces + "d (%7.3f%%)%n", + globalStats.getNoiseEvents(), globalStats.getEventCount(), (100.0 * globalStats.getNoiseEvents() / globalStats.getEventCount())); + System.out.printf("\tCluster Events Failed :: %" + headSpaces + "d / %" + headSpaces + "d (%7.3f%%)%n", + globalStats.getFailedClusterEventCount(), globalStats.getEventCount(), (100.0 * globalStats.getFailedClusterEventCount() / globalStats.getEventCount())); + System.out.printf("\tSingles Events Failed :: %" + headSpaces + "d / %" + headSpaces + "d (%7.3f%%)%n", + globalStats.getFailedSinglesEventCount(), globalStats.getEventCount(), (100.0 * globalStats.getFailedSinglesEventCount() / globalStats.getEventCount())); + System.out.printf("\tPair Events Failed :: %" + headSpaces + "d / %" + headSpaces + "d (%7.3f%%)%n", + globalStats.getFailedPairEventCount(), globalStats.getEventCount(), (100.0 * globalStats.getFailedPairEventCount() / globalStats.getEventCount())); + + // Print out how many events reported a given TI type, both in + // total and hierarchically. + System.out.println(); + System.out.println("Event Triggering Type Verification:"); + System.out.printf("\t%15s\t%15s\t%15s%n", "Trigger", "Total", "Hierarchical"); + System.out.printf("\t%15s\t%15s\t%15s%n", "Pulser", globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.PULSER, false), + globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.PULSER, true)); + System.out.printf("\t%15s\t%15s\t%15s%n", "Cosmic", globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.COSMIC, false), + globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.COSMIC, true)); + System.out.printf("\t%15s\t%15s\t%15s%n", "Singles 1", globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.SINGLES0, false), + globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.SINGLES0, true)); + System.out.printf("\t%15s\t%15s\t%15s%n", "Singles 2", globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.SINGLES1, false), + globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.SINGLES1, true)); + System.out.printf("\t%15s\t%15s\t%15s%n", "Pair 1", globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.PAIR0, false), + globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.PAIR0, true)); + System.out.printf("\t%15s\t%15s\t%15s%n", "Pair 2", globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.PAIR1, false), + globalStats.getTriggerStats().getTITriggers(TriggerDiagStats.PAIR1, true)); + + // Print the cluster verification data. + System.out.println(); + System.out.println("Cluster Verification:"); + System.out.printf("\tRecon Clusters :: %d%n", globalStats.getClusterStats().getReconClusterCount()); + System.out.printf("\tSSP Clusters :: %d%n", globalStats.getClusterStats().getSSPClusterCount()); + System.out.printf("\tClusters Matched :: %d%n", globalStats.getClusterStats().getMatches()); + System.out.printf("\tFailed (Position) :: %d%n", globalStats.getClusterStats().getPositionFailures()); + System.out.printf("\tFailed (Energy) :: %d%n", globalStats.getClusterStats().getEnergyFailures()); + System.out.printf("\tFailed (Hit Count) :: %d%n", globalStats.getClusterStats().getHitCountFailures()); + if(globalStats.getClusterStats().getReconClusterCount() == 0) { + System.out.printf("\tCluster Efficiency :: N/A%n"); + } else { + System.out.printf("\tCluster Efficiency :: %7.3f%%%n", + 100.0 * globalStats.getClusterStats().getMatches() / globalStats.getClusterStats().getReconClusterCount()); + } + + // Print the trigger verification data. + for(int triggerType = 0; triggerType < 2; triggerType++) { + // Get the trigger data. Type 0 represents singles triggers. + TriggerEvent[] triggerData = new TriggerEvent[2]; + if(triggerType == 0) { + triggerData[0] = globalStats.getTriggerStats().getSingles0Stats(); + triggerData[1] = globalStats.getTriggerStats().getSingles1Stats(); + } else { + triggerData[0] = globalStats.getTriggerStats().getPair0Stats(); + triggerData[1] = globalStats.getTriggerStats().getPair1Stats(); + } + + // Get the basic trigger data. + int sspSimTriggers = triggerData[0].getSSPSimulatedTriggers() + triggerData[1].getSSPSimulatedTriggers(); + int reconSimTriggers = triggerData[0].getReconSimulatedTriggers() + triggerData[1].getReconSimulatedTriggers(); + int sspReportedTriggers = triggerData[0].getReportedTriggers() + triggerData[1].getReportedTriggers(); + int sspMatchedTriggers = triggerData[0].getMatchedSSPSimulatedTriggers() + triggerData[1].getMatchedSSPSimulatedTriggers(); + int reconMatchedTriggers = triggerData[0].getMatchedReconSimulatedTriggers() + triggerData[1].getMatchedReconSimulatedTriggers(); + + // Print the basic trigger statistics. + int spaces = getPrintSpaces(sspSimTriggers, reconSimTriggers, sspReportedTriggers); + System.out.println(); + if(triggerType == 0) { System.out.println("Singles Trigger Verification:"); } + else { System.out.println("Pair Trigger Verification:"); } + System.out.printf("\tSSP Cluster Sim Triggers :: %" + spaces + "d%n", sspSimTriggers); + System.out.printf("\tRecon Cluster Sim Triggers :: %" + spaces + "d%n", reconSimTriggers); + System.out.printf("\tSSP Reported Triggers :: %" + spaces + "d%n", sspReportedTriggers); + + System.out.printf("\tInternal Efficiency :: %" + spaces + "d / %" + spaces + "d ", sspMatchedTriggers, sspSimTriggers); + if(sspSimTriggers == 0) { System.out.printf("(N/A)%n"); } + else { System.out.printf("(%7.3f%%)%n", (100.0 * sspMatchedTriggers / sspSimTriggers)); } + + System.out.printf("\tTrigger Efficiency :: %" + spaces + "d / %" + spaces + "d ", reconMatchedTriggers, reconSimTriggers); + if(reconSimTriggers == 0) { System.out.printf("(N/A)%n"); } + else { System.out.printf("(%7.3f%%)%n" , (100.0 * reconMatchedTriggers / reconSimTriggers)); } + + // Print the individual cut performances. + if(triggerType == 0) { + for(int triggerNum = 0; triggerNum < 2; triggerNum++) { + // Get the appropriate trigger statistics module. + TriggerEvent triggerStats; + if(triggerNum == 0) { triggerStats = globalStats.getTriggerStats().getSingles0Stats(); } + else { triggerStats = globalStats.getTriggerStats().getSingles1Stats(); } + + // Get the number of SSP triggers for this trigger number. + int sspTriggerCount = triggerStats.getSSPSimulatedTriggers(); + //int sspTriggerCount = triggerRunStats[0].getTotalSSPTriggers(triggerNum); + + System.out.println(); + System.out.printf("\tTrigger %d Individual Cut Failure Rate:%n", (triggerNum + 1)); + System.out.printf("\t\tUmatched Triggers :: %" + spaces + "d%n", triggerStats.getUnmatchedSSPSimulatedTriggers()); + //System.out.printf("\t\tUmatched Triggers :: %" + spaces + "d%n", triggerRunStats[0].getUnmatchedTriggers(triggerNum)); + if(sspTriggerCount == 0) { + System.out.printf("\t\tCluster Energy Lower Bound :: %" + spaces + "d / %" + spaces + "d%n", + triggerStats.getSSPCutFailures(ENERGY_MIN), sspTriggerCount); + System.out.printf("\t\tCluster Energy Upper Bound :: %" + spaces + "d / %" + spaces + "d%n", + triggerStats.getSSPCutFailures(ENERGY_MAX), sspTriggerCount); + System.out.printf("\t\tCluster Hit Count :: %" + spaces + "d / %" + spaces + "d%n", + triggerStats.getSSPCutFailures(HIT_COUNT), sspTriggerCount); + } else { + System.out.printf("\t\tCluster Energy Lower Bound :: %" + spaces + "d / %" + spaces + "d (%7.3f%%)%n", + triggerStats.getSSPCutFailures(ENERGY_MIN), sspTriggerCount, + (100.0 * triggerStats.getSSPCutFailures(ENERGY_MIN) / sspTriggerCount)); + System.out.printf("\t\tCluster Energy Upper Bound :: %" + spaces + "d / %" + spaces + "d (%7.3f%%)%n", + triggerStats.getSSPCutFailures(ENERGY_MAX), sspTriggerCount, + (100.0 * triggerStats.getSSPCutFailures(ENERGY_MAX) / sspTriggerCount)); + System.out.printf("\t\tCluster Hit Count :: %" + spaces + "d / %" + spaces + "d (%7.3f%%)%n", + triggerStats.getSSPCutFailures(HIT_COUNT), sspTriggerCount, + (100.0 * triggerStats.getSSPCutFailures(HIT_COUNT) / sspTriggerCount)); + } + } + } else { + for(int triggerNum = 0; triggerNum < 2; triggerNum++) { + // Get the appropriate trigger statistics module. + TriggerEvent triggerStats; + if(triggerNum == 0) { triggerStats = globalStats.getTriggerStats().getPair0Stats(); } + else { triggerStats = globalStats.getTriggerStats().getPair1Stats(); } + + // Get the number of SSP triggers for this trigger number. + int sspTriggerCount = triggerStats.getSSPSimulatedTriggers(); + + System.out.println(); + System.out.printf("\tTrigger %d Individual Cut Failure Rate:%n", (triggerNum + 1)); + System.out.printf("\t\tUmatched Triggers :: %" + spaces + "d%n", triggerStats.getUnmatchedSSPSimulatedTriggers()); + if(sspTriggerCount == 0) { + System.out.printf("\t\tPair Energy Sum :: %" + spaces + "d / %" + spaces + "d%n", + triggerStats.getSSPCutFailures(ENERGY_SUM), sspTriggerCount); + System.out.printf("\t\tPair Energy Difference :: %" + spaces + "d / %" + spaces + "d%n", + triggerStats.getSSPCutFailures(ENERGY_DIFF), sspTriggerCount); + System.out.printf("\t\tPair Energy Slope :: %" + spaces + "d / %" + spaces + "d%n", + triggerStats.getSSPCutFailures(ENERGY_SLOPE), sspTriggerCount); + System.out.printf("\t\tPair Coplanarity :: %" + spaces + "d / %" + spaces + "d%n", + triggerStats.getSSPCutFailures(COPLANARITY), sspTriggerCount); + } else { + System.out.printf("\t\tPair Energy Sum :: %" + spaces + "d / %" + spaces + "d (%7.3f%%)%n", + triggerStats.getSSPCutFailures(ENERGY_SUM), sspTriggerCount, + (100.0 * triggerStats.getSSPCutFailures(ENERGY_SUM) / sspTriggerCount)); + System.out.printf("\t\tPair Energy Difference :: %" + spaces + "d / %" + spaces + "d (%7.3f%%)%n", + triggerStats.getSSPCutFailures(ENERGY_DIFF), sspTriggerCount, + (100.0 * triggerStats.getSSPCutFailures(ENERGY_DIFF) / sspTriggerCount)); + System.out.printf("\t\tPair Energy Slope :: %" + spaces + "d / %" + spaces + "d (%7.3f%%)%n", + triggerStats.getSSPCutFailures(ENERGY_SLOPE), sspTriggerCount, + (100.0 * triggerStats.getSSPCutFailures(ENERGY_SLOPE) / sspTriggerCount)); + System.out.printf("\t\tPair Coplanarity :: %" + spaces + "d / %" + spaces + "d (%7.3f%%)%n", + triggerStats.getSSPCutFailures(COPLANARITY), sspTriggerCount, + (100.0 * triggerStats.getSSPCutFailures(COPLANARITY) / sspTriggerCount)); + } + } + } + } + + // Print out the trigger efficiency table. + System.out.println(); + globalStats.getTriggerStats().printEfficiencyTable(); + } + + /** + * Checks whether all of the hits in a cluster are within the safe + * region of the FADC output window. + * @param reconCluster - The cluster to check. + * @return Returns <code>true</code> if the cluster is safe and + * returns <code>false</code> otherwise. + */ + private final boolean isVerifiable(Cluster reconCluster) { + return TriggerDiagnosticUtil.isVerifiable(reconCluster, nsa, nsb, windowWidth); + } + + /** + * Generates a <code>List</code> collection that contains a set + * of <code>ArrayList</code> collections representing a unique + * permutation of the entries in the argument. + * @param values - A collection of the entries to be permuted. + * @return Returns a list of lists representing the permutations. + */ + private static final List<List<Pair<Cluster, SSPCluster>>> getPermutations(List<Cluster> reconClusters, List<SSPCluster> sspClusters) { + // Store the SSP cluster permutations. + List<List<SSPCluster>> permList = new ArrayList<List<SSPCluster>>(); + + // Make sure that the two lists are the same size. + int reconSize = reconClusters.size(); + int sspSize = sspClusters.size(); + while(sspClusters.size() < reconClusters.size()) { + sspClusters.add(null); + } + while(reconClusters.size() < sspClusters.size()) { + reconClusters.add(null); + } + + // Get the SSP cluster permutations. + permute(new ArrayList<SSPCluster>(0), sspClusters, permList); + + // Create pairs from the permutations. + List<List<Pair<Cluster, SSPCluster>>> pairList = new ArrayList<List<Pair<Cluster, SSPCluster>>>(); + for(List<SSPCluster> permutation : permList) { + List<Pair<Cluster, SSPCluster>> pairs = new ArrayList<Pair<Cluster, SSPCluster>>(reconClusters.size()); + + for(int clusterIndex = 0; (clusterIndex < reconClusters.size() && clusterIndex < permutation.size()); clusterIndex++) { + pairs.add(new Pair<Cluster, SSPCluster>(reconClusters.get(clusterIndex), permutation.get(clusterIndex))); + } + + pairList.add(pairs); + } + + // Remove the extra values. + for(int i = sspClusters.size() - 1; i >= sspSize; i--) { sspClusters.remove(i); } + for(int i = reconClusters.size() - 1; i >= reconSize; i--) { reconClusters.remove(i); } + + // Return the pairs. + return pairList; + } + + /** + * Recursive method for permuting all entries in the argument + * collection <code>remainingValues</code> into the argument + * <code>permutedValues</code> values. Completed permutations are + * placed in the argument <code>permList</code>. + * @param permutedValues - List to store entries that have already + * been permuted. + * @param remainingValues - List to store entries that need to be + * permuted. + * @param permList - List to store completed permutations. + */ + private static final void permute(List<SSPCluster> permutedValues, List<SSPCluster> remainingValues, List<List<SSPCluster>> permList) { + // If the list of entries that still need to be sorted is empty, + // then there is nothing to sort. Just return and empty list. + if(remainingValues.isEmpty()) { return; } + + // If there is only one value left in the list of entries that + // still need to be sorted, then just add it to the permutation + // list and return it. + else if(remainingValues.size() <= 1) { + // Add the last entry. + permutedValues.add(remainingValues.get(0)); + + // Add the permutation to the list of completed permutations. + permList.add(permutedValues); + } + + // Otherwise, continue to get all possible permutations. + else { + // Iterate over the entries that have not been permuted. + for(int i = 0; i < remainingValues.size(); i++) { + // Make new lists to contain the permutations. + List<SSPCluster> newPermList = new ArrayList<SSPCluster>(permutedValues.size() + 1); + List<SSPCluster> newRemainList = new ArrayList<SSPCluster>(remainingValues.size()); + + // Copy the current permuted entries to the new list + // and one value from the list of entries that have + // not been permuted yet. + newPermList.addAll(permutedValues); + newPermList.add(remainingValues.get(i)); + + // The new list of entries that have not been permuted + // should be identical, except it should now be missing + // the entry that was moved. + for(int index = 0; index < remainingValues.size(); index++) { + if(index != i) { newRemainList.add(remainingValues.get(index)); } + } + + // Repeat the process with the new lists. + permute(newPermList, newRemainList, permList); + } + } + } + + /** + * Compares two cluster matching events and finds the one that has + * the better results. Note that this will only return results that + * make sense if both of the events represent different permutations + * of the same set of clusters. Comparing events with different sets + * of clusters will produce meaningless results. + * @param firstEvent - The first cluster matching event, + * @param secondEvent - The second cluster matching event. + * @return Returns the cluster matching event that is better. + */ + private static final DetailedClusterEvent getBestPermutation(DetailedClusterEvent firstEvent, DetailedClusterEvent secondEvent) { + // If both permutations are null, return that. + if(firstEvent == null && secondEvent == null) { + return null; + } + + // If one permutation is null, it is not the best. + if(firstEvent == null) { return secondEvent; } + else if(secondEvent == null) { return firstEvent; } + + // A permutation is better if it has more matches. + if(firstEvent.getMatches() > secondEvent.getMatches()) { return firstEvent; } + else if(secondEvent.getMatches() > firstEvent.getMatches()) { return secondEvent; } + + // Otherwise, the permutation with the least energy failures is + // the better permutation. + if(firstEvent.getEnergyFailures() < secondEvent.getEnergyFailures()) { return firstEvent; } + else if(secondEvent.getEnergyFailures() < firstEvent.getEnergyFailures()) { return secondEvent; } + + // If both these values are the same, then the events are identical. + return firstEvent; + } + + /** + * Determines the number of spaces needed to render the longest of + * a series of integers as a string. + * @param vals - The series of integers. + * @return Returns the number of spaces needed to render the longest + * integer as a base-10 string. + */ + private static final int getPrintSpaces(int... vals) { + // Track the largest value. + int largest = 0; + + // Iterate over the arguments and find the largest. + for(int val : vals) { + // Get the length of the string. + int length = TriggerDiagnosticUtil.getDigits(val); + + // If it is larger, track it. + if(length > largest) { largest = length; } + } + + // Return the longer one. + return largest; + } + + /** + * Gets the position of the source of a <code>Trigger</code> object + * as text. This method only supports trigger sources of the types + * <code>SSPCluster</code>, <code>Cluster</code>, and arrays of size + * two of either type. + * @param trigger - The trigger from which to obtain the source. + * @return Returns the source of the trigger as a <code>String</code> + * object. + * @throws IllegalArgumentException Occurs if the source of the + * trigger is not any of the supported types. + */ + private static final String triggerPositionString(Trigger<?> trigger) throws IllegalArgumentException { + // Get the trigger source. + Object source = trigger.getTriggerSource(); + + // Handle valid trigger sources. + if(source instanceof SSPCluster) { + return TriggerDiagnosticUtil.clusterPositionString((SSPCluster) source); + } else if(source instanceof Cluster) { + return TriggerDiagnosticUtil.clusterPositionString((Cluster) source); + } else if(source instanceof SSPCluster[]) { + SSPCluster[] sourcePair = (SSPCluster[]) source; + if(sourcePair.length == 2) { + return String.format("%s, %s", TriggerDiagnosticUtil.clusterPositionString(sourcePair[0]), + TriggerDiagnosticUtil.clusterPositionString(sourcePair[1])); + } + } else if(source instanceof Cluster[]) { + Cluster[] sourcePair = (Cluster[]) source; + if(sourcePair.length == 2) { + return String.format("%s, %s", TriggerDiagnosticUtil.clusterPositionString(sourcePair[0]), + TriggerDiagnosticUtil.clusterPositionString(sourcePair[1])); + } + } + + // Otherwise, the source type is unrecognized. Throw an error. + throw new IllegalArgumentException(String.format("Trigger source type \"%s\" is not supported.", + trigger.getTriggerSource().getClass().getSimpleName())); + } + + /** + * Gets the time of a simulated trigger object. Method supports + * triggers with source objects of type <code>SSPCluster</code>, + * <code>Cluster</code>, and arrays of size two composed of either + * object type. + * @param trigger - The trigger. + * @return Returns the time at which the trigger occurred. + * @throws IllegalArgumentException Occurs if the trigger source + * is not a supported type. + */ + private static final double getTriggerTime(Trigger<?> trigger) throws IllegalArgumentException { + // Get the trigger source. + Object source = trigger.getTriggerSource(); + + // Get the trigger time for supported trigger types. + if(source instanceof SSPCluster) { + return ((SSPCluster) source).getTime(); + } else if(source instanceof Cluster) { + return TriggerDiagnosticUtil.getClusterTime((Cluster) source); + } else if(source instanceof SSPCluster[]) { + // Get the pair. + SSPCluster[] sourcePair = (SSPCluster[]) source; + + // Get the time of the bottom cluster. + if(sourcePair.length == 2) { + if(sourcePair[0].getYIndex() < 0) { return sourcePair[0].getTime(); } + else if(sourcePair[1].getYIndex() < 0) { return sourcePair[1].getTime(); } + else { throw new IllegalArgumentException("Cluster pairs must be formed of a top/bottom pair."); } + } + else { throw new IllegalArgumentException("Cluster pairs must be of size 2."); } + } else if(source instanceof Cluster[]) { + // Get the pair. + Cluster[] sourcePair = (Cluster[]) source; + int[] iy = { + TriggerDiagnosticUtil.getYIndex(sourcePair[0]), + TriggerDiagnosticUtil.getYIndex(sourcePair[1]) + }; + + // Get the time of the bottom cluster. + if(sourcePair.length == 2) { + if(iy[0] < 0) { return TriggerDiagnosticUtil.getClusterTime(sourcePair[0]); } + else if(iy[1] < 0) { return TriggerDiagnosticUtil.getClusterTime(sourcePair[1]); } + else { throw new IllegalArgumentException("Cluster pairs must be formed of a top/bottom pair."); } + } + else { throw new IllegalArgumentException("Cluster pairs must be of size 2."); } + } + + // If the source type is unrecognized, throw an exception. + throw new IllegalArgumentException(String.format("Trigger source type \"%\" is not supported.", + source.getClass().getSimpleName())); + } + + /** + * Checks if a simulated trigger and an SSP trigger match. Note + * that only certain types can be compared. These are: + * <ul><li><code>SinglesTrigger<?> --> SSPSinglesTrigger</code></li> + * <li><code>PairTrigger<?> --> SSPPairTrigger</code></li></ul> + * @param simTrigger - The simulated trigger. + * @param sspTrigger - The SSP bank trigger. + * @return Returns an array of <code>boolean</code> primitives that + * indicate which cuts passed and which failed. + */ + private static final boolean[] triggerCutMatch(Trigger<?> simTrigger, SSPTrigger sspTrigger) { + // Check that the cuts match for supported trigger types. + if(simTrigger instanceof SinglesTrigger && sspTrigger instanceof SSPSinglesTrigger) { + // Create an array to store the cut checks. + boolean[] cutMatch = new boolean[3]; + + // Cast the triggers. + SinglesTrigger<?> simSingles = (SinglesTrigger<?>) simTrigger; + SSPSinglesTrigger sspSingles = (SSPSinglesTrigger) sspTrigger; + + // Perform the check. + cutMatch[ENERGY_MIN] = (simSingles.getStateClusterEnergyLow() == sspSingles.passCutEnergyMin()); + cutMatch[ENERGY_MAX] = (simSingles.getStateClusterEnergyHigh() == sspSingles.passCutEnergyMax()); + cutMatch[HIT_COUNT] = (simSingles.getStateHitCount() == sspSingles.passCutHitCount()); + + // Return the match array. + return cutMatch; + } else if(simTrigger instanceof PairTrigger && sspTrigger instanceof SSPPairTrigger) { + // Create an array to store the cut checks. + boolean[] cutMatch = new boolean[4]; + + // Cast the triggers. + PairTrigger<?> simPair = (PairTrigger<?>) simTrigger; + SSPPairTrigger sspPair = (SSPPairTrigger) sspTrigger; + + // Perform the check. + cutMatch[ENERGY_SUM] = (simPair.getStateEnergySum() == sspPair.passCutEnergySum()); + cutMatch[ENERGY_DIFF] = (simPair.getStateEnergyDifference() == sspPair.passCutEnergyDifference()); + cutMatch[ENERGY_SLOPE] = (simPair.getStateEnergySlope() == sspPair.passCutEnergySlope()); + cutMatch[COPLANARITY] = (simPair.getStateCoplanarity() == sspPair.passCutCoplanarity()); + + // Return the match array. + return cutMatch; + } + + // If this point is reached, the triggers are not of a supported + // type for cut comparison. Produce an exception. + throw new IllegalArgumentException(String.format("Triggers of type \"%s\" can not be cut-matched with triggers of type \"%s\".", + simTrigger.getClass().getSimpleName(), sspTrigger.getClass().getSimpleName())); + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/TriggerTurnOnDriver.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/TriggerTurnOnDriver.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/TriggerTurnOnDriver.java Wed Mar 9 11:43:24 2016 @@ -70,9 +70,9 @@ public TriggerTurnOnDriver() { } - public void setShowPlots(boolean showPlots) { - this.showPlots = showPlots; - } + public void setShowPlots(boolean showPlots) { + this.showPlots = showPlots; + } @Override protected void detectorChanged(Detector detector) { Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/ClusterEvent.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/ClusterEvent.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/ClusterEvent.java Wed Mar 9 11:43:24 2016 @@ -9,104 +9,104 @@ * @author Kyle McCarty <[log in to unmask]> */ public class ClusterEvent extends ClusterStatModule { - /** - * Fuses another <code>ClusterEvent</code> with this object. The - * other event's cluster pairs and states will be added to those - * already in this event. - * @param event - The event to fuse. - */ - public void addEvent(ClusterEvent event) { - // If the event is null, do nothing. - if(event == null) { return; } - - // Add the values stored in the argument event to the counters - // in this event. - sspClusters += event.sspClusters; - reconClusters += event.reconClusters; - matches += event.matches; - failEnergy += event.failEnergy; - failPosition += event.failPosition; - failHitCount += event.failHitCount; - } - - /** - * Indicates whether at least one cluster pair in the event created - * a fail state. - * @return Returns <code>true</code> if not all clusters matched and - * <code>false</code> otherwise. - */ - public boolean isFailState() { - return (failEnergy > 0) || (failHitCount > 0) || (failTime > 0) || (failPosition > 0); - } - - /** - * Notes that a reconstructed cluster and SSP cluster pair failed - * due to energy. - */ - public void pairFailEnergy() { - failEnergy++; - } - - /** - * Notes that a reconstructed cluster and SSP cluster pair failed - * due to hit count. - */ - public void pairFailHitCount() { - failHitCount++; - } - - /** - * Notes that a reconstructed cluster and SSP cluster pair failed - * due to position. - */ - public void pairFailPosition() { - failPosition++; - } - - /** - * Notes that one or more reconstructed cluster and SSP cluster pair - * failed due to position. - * @param count - The number of events that failed in this manner. - */ - public void pairFailPosition(int count) { - // negative values are non-physical. - if(count < 0) { - throw new IllegalArgumentException("Cluster failure counts must be non-negative."); - } - - // Increment the count. - failPosition += count; - } - - /** - * Notes that a reconstructed cluster and SSP cluster pair failed - * due to time. - */ - public void pairFailTime() { - failTime++; - } - - /** - * Notes that a reconstructed cluster and SSP cluster pair was - * successfully matched. - */ - public void pairMatch() { - matches++; - } - - /** - * Increments the number of reconstructed FADC clusters seen. - * @param count - The number of clusters seen. - */ - public void sawReconClusters(int count) { - reconClusters += count; - } - - /** - * Increments the number of SSP bank clusters seen. - * @param count - The number of clusters seen. - */ - public void sawSSPClusters(int count) { - sspClusters += count; - } + /** + * Fuses another <code>ClusterEvent</code> with this object. The + * other event's cluster pairs and states will be added to those + * already in this event. + * @param event - The event to fuse. + */ + public void addEvent(ClusterEvent event) { + // If the event is null, do nothing. + if(event == null) { return; } + + // Add the values stored in the argument event to the counters + // in this event. + sspClusters += event.sspClusters; + reconClusters += event.reconClusters; + matches += event.matches; + failEnergy += event.failEnergy; + failPosition += event.failPosition; + failHitCount += event.failHitCount; + } + + /** + * Indicates whether at least one cluster pair in the event created + * a fail state. + * @return Returns <code>true</code> if not all clusters matched and + * <code>false</code> otherwise. + */ + public boolean isFailState() { + return (failEnergy > 0) || (failHitCount > 0) || (failTime > 0) || (failPosition > 0); + } + + /** + * Notes that a reconstructed cluster and SSP cluster pair failed + * due to energy. + */ + public void pairFailEnergy() { + failEnergy++; + } + + /** + * Notes that a reconstructed cluster and SSP cluster pair failed + * due to hit count. + */ + public void pairFailHitCount() { + failHitCount++; + } + + /** + * Notes that a reconstructed cluster and SSP cluster pair failed + * due to position. + */ + public void pairFailPosition() { + failPosition++; + } + + /** + * Notes that one or more reconstructed cluster and SSP cluster pair + * failed due to position. + * @param count - The number of events that failed in this manner. + */ + public void pairFailPosition(int count) { + // negative values are non-physical. + if(count < 0) { + throw new IllegalArgumentException("Cluster failure counts must be non-negative."); + } + + // Increment the count. + failPosition += count; + } + + /** + * Notes that a reconstructed cluster and SSP cluster pair failed + * due to time. + */ + public void pairFailTime() { + failTime++; + } + + /** + * Notes that a reconstructed cluster and SSP cluster pair was + * successfully matched. + */ + public void pairMatch() { + matches++; + } + + /** + * Increments the number of reconstructed FADC clusters seen. + * @param count - The number of clusters seen. + */ + public void sawReconClusters(int count) { + reconClusters += count; + } + + /** + * Increments the number of SSP bank clusters seen. + * @param count - The number of clusters seen. + */ + public void sawSSPClusters(int count) { + sspClusters += count; + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/ClusterMatchedPair.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/ClusterMatchedPair.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/ClusterMatchedPair.java Wed Mar 9 11:43:24 2016 @@ -14,114 +14,114 @@ * @author Kyle McCarty <[log in to unmask]> */ public class ClusterMatchedPair extends Pair<Cluster, SSPCluster> { - // CLass variables. - private final byte state; - - /** - * Instantiates a new <code>ClusterMatchedPair</code> object from - * the two indicated clusters and marks their match state. - * @param reconCluster - The reconstructed cluster. - * @param sspCluster - The SSP cluster. - * @param state - The pair match state. - */ - public ClusterMatchedPair(Cluster reconCluster, SSPCluster sspCluster, byte state) { - // Set the cluster pairs. - super(reconCluster, sspCluster); - - // If the state is defined, set it. Otherwise, it is unknown. - if(state == TriggerDiagnosticUtil.CLUSTER_STATE_MATCHED - || state == TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_POSITION - || state == TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_ENERGY - || state == TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_HIT_COUNT) { - this.state = state; - } else { - this.state = TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_UNKNOWN; - } - } - - /** - * Gets the reconstructed cluster of the pair. - * @return Returns the reconstructed cluster a <code>Cluster</cod> - * object. - */ - public Cluster getReconstructedCluster() { - return getFirstElement(); - } - - /** - * Gets the SSP cluster of the pair. - * @return Returns the SSP cluster as an <code>SSPCluster</code> - * object. - */ - public SSPCluster getSSPCluster() { - return getSecondElement(); - } - - /** - * Gets the raw state identifier. - * @return Returns the state identifier as a <code>byte</code> - * primitive. Valid identifiers are defined in the class - * <code>TriggerDiagnosticUtil</code>. - */ - public byte getState() { - return state; - } - - /** - * Indicates whether the recon/SSP pair failed to not being close - * enough in energy. - * @return Returns <code>true</code> if the pair match state is an - * energy fail state and <code>false</code> otherwise. - */ - public boolean isEnergyFailState() { - return (state == TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_ENERGY); - } - - /** - * Indicates whether the recon/SSP pair failed to match due to not - * being close enough in hit count. - * @return Returns <code>true</code> if the pair match state is a - * hit count fail state and <code>false</code> otherwise. - */ - public boolean isHitCountFailState() { - return (state == TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_HIT_COUNT); - } - - /** - * Indicates whether the recon/SSP pair matched. - * @return Returns <code>true</code> if the pair match state is a - * match state and <code>false</code> otherwise. - */ - public boolean isMatch() { - return (state == TriggerDiagnosticUtil.CLUSTER_STATE_MATCHED); - } - - /** - * Indicates whether the recon/SSP pair failed to match due to the - * cluster positions not aligning. - * @return Returns <code>true</code> if the pair match state is a - * position fail state and <code>false</code> otherwise. - */ - public boolean isPositionFailState() { - return (state == TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_POSITION); - } - - /** - * Indicates whether the recon/SSP pair failed to match due to the - * cluster time-stamps not aligning. - * @return Returns <code>true</code> if the pair match state is a - * time fail state and <code>false</code> otherwise. - */ - public boolean isTimeFailState() { - return (state == TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_TIME); - } - - /** - * Indicates whether the recon/SSP pair has no known match state. - * @return Returns <code>true</code> if the pair match state is - * unknown and <code>false</code> otherwise. - */ - public boolean isUnknownState() { - return (state == TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_UNKNOWN); - } + // CLass variables. + private final byte state; + + /** + * Instantiates a new <code>ClusterMatchedPair</code> object from + * the two indicated clusters and marks their match state. + * @param reconCluster - The reconstructed cluster. + * @param sspCluster - The SSP cluster. + * @param state - The pair match state. + */ + public ClusterMatchedPair(Cluster reconCluster, SSPCluster sspCluster, byte state) { + // Set the cluster pairs. + super(reconCluster, sspCluster); + + // If the state is defined, set it. Otherwise, it is unknown. + if(state == TriggerDiagnosticUtil.CLUSTER_STATE_MATCHED + || state == TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_POSITION + || state == TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_ENERGY + || state == TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_HIT_COUNT) { + this.state = state; + } else { + this.state = TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_UNKNOWN; + } + } + + /** + * Gets the reconstructed cluster of the pair. + * @return Returns the reconstructed cluster a <code>Cluster</cod> + * object. + */ + public Cluster getReconstructedCluster() { + return getFirstElement(); + } + + /** + * Gets the SSP cluster of the pair. + * @return Returns the SSP cluster as an <code>SSPCluster</code> + * object. + */ + public SSPCluster getSSPCluster() { + return getSecondElement(); + } + + /** + * Gets the raw state identifier. + * @return Returns the state identifier as a <code>byte</code> + * primitive. Valid identifiers are defined in the class + * <code>TriggerDiagnosticUtil</code>. + */ + public byte getState() { + return state; + } + + /** + * Indicates whether the recon/SSP pair failed to not being close + * enough in energy. + * @return Returns <code>true</code> if the pair match state is an + * energy fail state and <code>false</code> otherwise. + */ + public boolean isEnergyFailState() { + return (state == TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_ENERGY); + } + + /** + * Indicates whether the recon/SSP pair failed to match due to not + * being close enough in hit count. + * @return Returns <code>true</code> if the pair match state is a + * hit count fail state and <code>false</code> otherwise. + */ + public boolean isHitCountFailState() { + return (state == TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_HIT_COUNT); + } + + /** + * Indicates whether the recon/SSP pair matched. + * @return Returns <code>true</code> if the pair match state is a + * match state and <code>false</code> otherwise. + */ + public boolean isMatch() { + return (state == TriggerDiagnosticUtil.CLUSTER_STATE_MATCHED); + } + + /** + * Indicates whether the recon/SSP pair failed to match due to the + * cluster positions not aligning. + * @return Returns <code>true</code> if the pair match state is a + * position fail state and <code>false</code> otherwise. + */ + public boolean isPositionFailState() { + return (state == TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_POSITION); + } + + /** + * Indicates whether the recon/SSP pair failed to match due to the + * cluster time-stamps not aligning. + * @return Returns <code>true</code> if the pair match state is a + * time fail state and <code>false</code> otherwise. + */ + public boolean isTimeFailState() { + return (state == TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_TIME); + } + + /** + * Indicates whether the recon/SSP pair has no known match state. + * @return Returns <code>true</code> if the pair match state is + * unknown and <code>false</code> otherwise. + */ + public boolean isUnknownState() { + return (state == TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_UNKNOWN); + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/ClusterStatModule.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/ClusterStatModule.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/ClusterStatModule.java Wed Mar 9 11:43:24 2016 @@ -7,100 +7,100 @@ * @author Kyle McCarty <[log in to unmask]> */ public class ClusterStatModule { - // Track cluster statistics. - protected int sspClusters = 0; - protected int reconClusters = 0; - protected int matches = 0; - protected int failEnergy = 0; - protected int failPosition = 0; - protected int failHitCount = 0; - protected int failTime = 0; - - /** - * Instantiates a <code>ClusterStatModule</code> with no statistics - * stored. - */ - ClusterStatModule() { } - - /** - * Clears all statistical information and resets the object of its - * default, empty state. - */ - void clear() { - sspClusters = 0; - reconClusters = 0; - matches = 0; - failEnergy = 0; - failPosition = 0; - failHitCount = 0; - failTime = 0; - } - - @Override - public ClusterStatModule clone() { - // Create a clone. - ClusterStatModule clone = new ClusterStatModule(); - - // Copy the statistical values to the clone. - clone.sspClusters = sspClusters; - clone.reconClusters = reconClusters; - clone.matches = matches; - clone.failEnergy = failEnergy; - clone.failPosition = failPosition; - clone.failHitCount = failHitCount; - clone.failTime = failTime; - - // Return the clone. - return clone; - } - - /** - * Gets the number of cluster pairs stored in this event that are - * marked with energy fail states. - * @return Returns the number of instances of this state as an - * <code>int</code> primitive. - */ - public int getEnergyFailures() { - return failEnergy; - } - - /** - * Gets the number of cluster pairs stored in this event that are - * marked with hit count fail states. - * @return Returns the number of instances of this state as an - * <code>int</code> primitive. - */ - public int getHitCountFailures() { - return failHitCount; - } - - /** - * Gets the number of cluster pairs stored in this event that are - * marked with position fail states. - * @return Returns the number of instances of this state as an - * <code>int</code> primitive. - */ - public int getMatches() { - return matches; - } - - /** - * Gets the number of cluster pairs stored in this event that are - * marked with position fail states. - * @return Returns the number of instances of this state as an - * <code>int</code> primitive. - */ - public int getPositionFailures() { - return failPosition; - } - - /** - * Gets the total number of verifiable reconstructed clusters seen. + // Track cluster statistics. + protected int sspClusters = 0; + protected int reconClusters = 0; + protected int matches = 0; + protected int failEnergy = 0; + protected int failPosition = 0; + protected int failHitCount = 0; + protected int failTime = 0; + + /** + * Instantiates a <code>ClusterStatModule</code> with no statistics + * stored. + */ + ClusterStatModule() { } + + /** + * Clears all statistical information and resets the object of its + * default, empty state. + */ + void clear() { + sspClusters = 0; + reconClusters = 0; + matches = 0; + failEnergy = 0; + failPosition = 0; + failHitCount = 0; + failTime = 0; + } + + @Override + public ClusterStatModule clone() { + // Create a clone. + ClusterStatModule clone = new ClusterStatModule(); + + // Copy the statistical values to the clone. + clone.sspClusters = sspClusters; + clone.reconClusters = reconClusters; + clone.matches = matches; + clone.failEnergy = failEnergy; + clone.failPosition = failPosition; + clone.failHitCount = failHitCount; + clone.failTime = failTime; + + // Return the clone. + return clone; + } + + /** + * Gets the number of cluster pairs stored in this event that are + * marked with energy fail states. + * @return Returns the number of instances of this state as an + * <code>int</code> primitive. + */ + public int getEnergyFailures() { + return failEnergy; + } + + /** + * Gets the number of cluster pairs stored in this event that are + * marked with hit count fail states. + * @return Returns the number of instances of this state as an + * <code>int</code> primitive. + */ + public int getHitCountFailures() { + return failHitCount; + } + + /** + * Gets the number of cluster pairs stored in this event that are + * marked with position fail states. + * @return Returns the number of instances of this state as an + * <code>int</code> primitive. + */ + public int getMatches() { + return matches; + } + + /** + * Gets the number of cluster pairs stored in this event that are + * marked with position fail states. + * @return Returns the number of instances of this state as an + * <code>int</code> primitive. + */ + public int getPositionFailures() { + return failPosition; + } + + /** + * Gets the total number of verifiable reconstructed clusters seen. * @return Returns the cluster count as an <code>int</code> * primitive. - */ + */ public int getReconClusterCount() { - return reconClusters; + return reconClusters; } /** @@ -109,16 +109,16 @@ * primitive. */ public int getSSPClusterCount() { - return sspClusters; + return sspClusters; } - - /** - * Gets the number of cluster pairs stored in this event that are - * marked with time fail states. - * @return Returns the number of instances of this state as an - * <code>int</code> primitive. - */ - public int getTimeFailures() { - return failTime; - } + + /** + * Gets the number of cluster pairs stored in this event that are + * marked with time fail states. + * @return Returns the number of instances of this state as an + * <code>int</code> primitive. + */ + public int getTimeFailures() { + return failTime; + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/DetailedClusterEvent.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/DetailedClusterEvent.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/DetailedClusterEvent.java Wed Mar 9 11:43:24 2016 @@ -8,89 +8,89 @@ import org.lcsim.event.Cluster; public class DetailedClusterEvent extends ClusterEvent { - // Store all of the pairs. - private List<ClusterMatchedPair> pairList = new ArrayList<ClusterMatchedPair>(); - - /** - * Fuses another <code>ClusterEvent</code> with this object. The - * other event's cluster pairs and states will be added to those - * already in this event. - * @param event - The event to fuse. - */ - public void addEvent(ClusterEvent event) { - // Run the superclass method. - super.addEvent(event); - - // If the event is null, do nothing. - if(event == null) { return; } - - // Merge the list of cluster pairs, if applicable. - if(event instanceof DetailedClusterEvent) { - pairList.addAll(((DetailedClusterEvent) event).pairList); - } - } - - /** - * Adds a reconstructed/SSP cluster pair and marks it as having an - * energy fail state. - * @param reconCluster - The reconstructed cluster. - * @param sspCluster - The SSP cluster. - */ - public void pairFailEnergy(Cluster reconCluster, SSPCluster sspCluster) { - pairFailEnergy(); - pairList.add(new ClusterMatchedPair(reconCluster, sspCluster, TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_ENERGY)); - } - - /** - * Adds a reconstructed/SSP cluster pair and marks it as having a - * hit count fail state. - * @param reconCluster - The reconstructed cluster. - * @param sspCluster - The SSP cluster. - */ - public void pairFailHitCount(Cluster reconCluster, SSPCluster sspCluster) { - pairFailHitCount(); - pairList.add(new ClusterMatchedPair(reconCluster, sspCluster, TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_HIT_COUNT)); - } - - /** - * Adds a reconstructed/SSP cluster pair and marks it as having a - * position fail state. - * @param reconCluster - The reconstructed cluster. - * @param sspCluster - The SSP cluster. - */ - public void pairFailPosition(Cluster reconCluster, SSPCluster sspCluster) { - pairFailPosition(); - pairList.add(new ClusterMatchedPair(reconCluster, sspCluster, TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_POSITION)); - } - - /** - * Adds a reconstructed/SSP cluster pair and marks it as having a - * time fail state. - * @param reconCluster - The reconstructed cluster. - * @param sspCluster - The SSP cluster. - */ - public void pairFailTime(Cluster reconCluster, SSPCluster sspCluster) { - pairFailTime(); - pairList.add(new ClusterMatchedPair(reconCluster, sspCluster, TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_TIME)); - } - - /** - * Adds a reconstructed/SSP cluster pair and marks it as having a - * match state. - * @param reconCluster - The reconstructed cluster. - * @param sspCluster - The SSP cluster. - */ - public void pairMatch(Cluster reconCluster, SSPCluster sspCluster) { - pairMatch(); - pairList.add(new ClusterMatchedPair(reconCluster, sspCluster, TriggerDiagnosticUtil.CLUSTER_STATE_MATCHED)); - } - - /** - * Gets a list of all matched cluster pairs and their match states. - * @return Returns the matched cluster pairs as a <code>List</code> - * of <code>ClusterMatchedPair</code> objects. - */ - public List<ClusterMatchedPair> getClusterPairs() { - return pairList; - } + // Store all of the pairs. + private List<ClusterMatchedPair> pairList = new ArrayList<ClusterMatchedPair>(); + + /** + * Fuses another <code>ClusterEvent</code> with this object. The + * other event's cluster pairs and states will be added to those + * already in this event. + * @param event - The event to fuse. + */ + public void addEvent(ClusterEvent event) { + // Run the superclass method. + super.addEvent(event); + + // If the event is null, do nothing. + if(event == null) { return; } + + // Merge the list of cluster pairs, if applicable. + if(event instanceof DetailedClusterEvent) { + pairList.addAll(((DetailedClusterEvent) event).pairList); + } + } + + /** + * Adds a reconstructed/SSP cluster pair and marks it as having an + * energy fail state. + * @param reconCluster - The reconstructed cluster. + * @param sspCluster - The SSP cluster. + */ + public void pairFailEnergy(Cluster reconCluster, SSPCluster sspCluster) { + pairFailEnergy(); + pairList.add(new ClusterMatchedPair(reconCluster, sspCluster, TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_ENERGY)); + } + + /** + * Adds a reconstructed/SSP cluster pair and marks it as having a + * hit count fail state. + * @param reconCluster - The reconstructed cluster. + * @param sspCluster - The SSP cluster. + */ + public void pairFailHitCount(Cluster reconCluster, SSPCluster sspCluster) { + pairFailHitCount(); + pairList.add(new ClusterMatchedPair(reconCluster, sspCluster, TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_HIT_COUNT)); + } + + /** + * Adds a reconstructed/SSP cluster pair and marks it as having a + * position fail state. + * @param reconCluster - The reconstructed cluster. + * @param sspCluster - The SSP cluster. + */ + public void pairFailPosition(Cluster reconCluster, SSPCluster sspCluster) { + pairFailPosition(); + pairList.add(new ClusterMatchedPair(reconCluster, sspCluster, TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_POSITION)); + } + + /** + * Adds a reconstructed/SSP cluster pair and marks it as having a + * time fail state. + * @param reconCluster - The reconstructed cluster. + * @param sspCluster - The SSP cluster. + */ + public void pairFailTime(Cluster reconCluster, SSPCluster sspCluster) { + pairFailTime(); + pairList.add(new ClusterMatchedPair(reconCluster, sspCluster, TriggerDiagnosticUtil.CLUSTER_STATE_FAIL_TIME)); + } + + /** + * Adds a reconstructed/SSP cluster pair and marks it as having a + * match state. + * @param reconCluster - The reconstructed cluster. + * @param sspCluster - The SSP cluster. + */ + public void pairMatch(Cluster reconCluster, SSPCluster sspCluster) { + pairMatch(); + pairList.add(new ClusterMatchedPair(reconCluster, sspCluster, TriggerDiagnosticUtil.CLUSTER_STATE_MATCHED)); + } + + /** + * Gets a list of all matched cluster pairs and their match states. + * @return Returns the matched cluster pairs as a <code>List</code> + * of <code>ClusterMatchedPair</code> objects. + */ + public List<ClusterMatchedPair> getClusterPairs() { + return pairList; + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/DiagnosticSnapshot.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/DiagnosticSnapshot.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/DiagnosticSnapshot.java Wed Mar 9 11:43:24 2016 @@ -8,117 +8,117 @@ * @author Kyle McCarty <[log in to unmask]> */ public class DiagnosticSnapshot { - // Store the TI trigger information. - private int[] tiSeenAll = new int[6]; - private int[] tiSeenHierarchical = new int[6]; - - // Store the statistical modules. - private final GeneralStatModule generalStats; - private final ClusterStatModule clusterStats; - private final TriggerStatModule[] triggerStats = new TriggerStatModule[4]; - - /** - * Creates a snapshot of the trigger diagnostic results. - * @param stats - The run statistical object. - */ - DiagnosticSnapshot(RunDiagStats stats) { - // Store the statistical modules. - generalStats = stats.clone(); - clusterStats = stats.getClusterStats().clone(); - triggerStats[0] = stats.getTriggerStats().getSingles0Stats().clone(); - triggerStats[1] = stats.getTriggerStats().getSingles1Stats().clone(); - triggerStats[2] = stats.getTriggerStats().getPair0Stats().clone(); - triggerStats[3] = stats.getTriggerStats().getPair1Stats().clone(); - - // Copy the TI trigger data. - for(int triggerType = 0; triggerType < 6; triggerType++) { - tiSeenAll[triggerType] = stats.getTriggerStats().getTITriggers(triggerType, false); - tiSeenHierarchical[triggerType] = stats.getTriggerStats().getTITriggers(triggerType, true); - } - } - - /** - * Gets the general run statistics. - * @return Returns a <code>GeneralStatModule</code> object that - * contains the statistics. - */ - public GeneralStatModule getGeneralStats() { - return generalStats; - } - - /** - * Gets the cluster statistics. - * @return Returns a <code>ClusterStatModule</code> object that - * contains the statistics. - */ - public ClusterStatModule getClusterStats() { - return clusterStats; - } - - /** - * Gets the singles 0 trigger statistics. - * @return Returns a <code>TriggerStatModule</code> object that - * contains the statistics. - */ - public TriggerStatModule getSingles0Stats() { - return triggerStats[0]; - } - - /** - * Gets the singles 1 trigger statistics. - * @return Returns a <code>TriggerStatModule</code> object that - * contains the statistics. - */ - public TriggerStatModule getSingles1Stats() { - return triggerStats[1]; - } - - /** - * Gets the pair 0 trigger statistics. - * @return Returns a <code>TriggerStatModule</code> object that - * contains the statistics. - */ - public TriggerStatModule getPair0Stats() { - return triggerStats[2]; - } - - /** - * Gets the pair 1 trigger statistics. - * @return Returns a <code>TriggerStatModule</code> object that - * contains the statistics. - */ - public TriggerStatModule getPair1Stats() { - return triggerStats[3]; - } - - /** - * Gets the total number of events where the TI reported a trigger - * of the specified type. - * @param triggerID - The identifier for the type of trigger. - * @param unique - <code>true</code> returns only the number of - * events where this trigger type was the <i>only</i> type seen by - * the TI while <code>false</code> returns the number of events - * that saw this trigger type without regards for other trigger - * flags. - * @return Returns the count as an <code>int</code>. - */ - public int getTITriggers(int triggerID, boolean hierarchical) { - // Verify the trigger type. - validateTriggerType(triggerID); - - // Increment the counters. - if(hierarchical) { return tiSeenHierarchical[triggerID]; } - else { return tiSeenAll[triggerID]; } - } - - /** - * Produces an exception if the argument trigger type is not of a - * supported type. - * @param triggerType - The trigger type to verify. - */ - private static final void validateTriggerType(int triggerType) { - if(triggerType < 0 || triggerType > 5) { - throw new IndexOutOfBoundsException(String.format("Trigger type \"%d\" is not supported.", triggerType)); - } - } + // Store the TI trigger information. + private int[] tiSeenAll = new int[6]; + private int[] tiSeenHierarchical = new int[6]; + + // Store the statistical modules. + private final GeneralStatModule generalStats; + private final ClusterStatModule clusterStats; + private final TriggerStatModule[] triggerStats = new TriggerStatModule[4]; + + /** + * Creates a snapshot of the trigger diagnostic results. + * @param stats - The run statistical object. + */ + DiagnosticSnapshot(RunDiagStats stats) { + // Store the statistical modules. + generalStats = stats.clone(); + clusterStats = stats.getClusterStats().clone(); + triggerStats[0] = stats.getTriggerStats().getSingles0Stats().clone(); + triggerStats[1] = stats.getTriggerStats().getSingles1Stats().clone(); + triggerStats[2] = stats.getTriggerStats().getPair0Stats().clone(); + triggerStats[3] = stats.getTriggerStats().getPair1Stats().clone(); + + // Copy the TI trigger data. + for(int triggerType = 0; triggerType < 6; triggerType++) { + tiSeenAll[triggerType] = stats.getTriggerStats().getTITriggers(triggerType, false); + tiSeenHierarchical[triggerType] = stats.getTriggerStats().getTITriggers(triggerType, true); + } + } + + /** + * Gets the general run statistics. + * @return Returns a <code>GeneralStatModule</code> object that + * contains the statistics. + */ + public GeneralStatModule getGeneralStats() { + return generalStats; + } + + /** + * Gets the cluster statistics. + * @return Returns a <code>ClusterStatModule</code> object that + * contains the statistics. + */ + public ClusterStatModule getClusterStats() { + return clusterStats; + } + + /** + * Gets the singles 0 trigger statistics. + * @return Returns a <code>TriggerStatModule</code> object that + * contains the statistics. + */ + public TriggerStatModule getSingles0Stats() { + return triggerStats[0]; + } + + /** + * Gets the singles 1 trigger statistics. + * @return Returns a <code>TriggerStatModule</code> object that + * contains the statistics. + */ + public TriggerStatModule getSingles1Stats() { + return triggerStats[1]; + } + + /** + * Gets the pair 0 trigger statistics. + * @return Returns a <code>TriggerStatModule</code> object that + * contains the statistics. + */ + public TriggerStatModule getPair0Stats() { + return triggerStats[2]; + } + + /** + * Gets the pair 1 trigger statistics. + * @return Returns a <code>TriggerStatModule</code> object that + * contains the statistics. + */ + public TriggerStatModule getPair1Stats() { + return triggerStats[3]; + } + + /** + * Gets the total number of events where the TI reported a trigger + * of the specified type. + * @param triggerID - The identifier for the type of trigger. + * @param unique - <code>true</code> returns only the number of + * events where this trigger type was the <i>only</i> type seen by + * the TI while <code>false</code> returns the number of events + * that saw this trigger type without regards for other trigger + * flags. + * @return Returns the count as an <code>int</code>. + */ + public int getTITriggers(int triggerID, boolean hierarchical) { + // Verify the trigger type. + validateTriggerType(triggerID); + + // Increment the counters. + if(hierarchical) { return tiSeenHierarchical[triggerID]; } + else { return tiSeenAll[triggerID]; } + } + + /** + * Produces an exception if the argument trigger type is not of a + * supported type. + * @param triggerType - The trigger type to verify. + */ + private static final void validateTriggerType(int triggerType) { + if(triggerType < 0 || triggerType > 5) { + throw new IndexOutOfBoundsException(String.format("Trigger type \"%d\" is not supported.", triggerType)); + } + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/GeneralStatModule.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/GeneralStatModule.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/GeneralStatModule.java Wed Mar 9 11:43:24 2016 @@ -7,97 +7,97 @@ * @author Kyle McCarty <[log in to unmask]> */ public class GeneralStatModule { - // Store general run statistics. - protected long endTime = -1; - protected long startTime = -1; - protected int totalEvents = 0; - protected int noiseEvents = 0; - protected int failedPairEvents = 0; - protected int failedClusterEvents = 0; - protected int failedSinglesEvents = 0; - - /** - * Clears all of the statistical counters in the object. - */ - void clear() { - endTime = -1; - startTime = -1; - totalEvents = 0; - noiseEvents = 0; - failedPairEvents = 0; - failedClusterEvents = 0; - failedSinglesEvents = 0; - } - - @Override - public GeneralStatModule clone() { - // Create the a cloned object. - GeneralStatModule clone = new GeneralStatModule(); - - // Copy the tracked statistical data to the clone. - clone.endTime = endTime; - clone.startTime = startTime; - clone.totalEvents = totalEvents; - clone.noiseEvents = noiseEvents; - clone.failedPairEvents = failedPairEvents; - clone.failedClusterEvents = failedClusterEvents; - clone.failedSinglesEvents = failedSinglesEvents; - - // Return the clone. - return clone; - } - - /** - * Gets the length of time, in nanoseconds, over which the events - * represented by this object occurred. - * @return Returns the length of time as a <code>long</code>. - */ - public long getDuration() { - return endTime - startTime; - } - - /** - * Gets the number of events seen. - * @return Returns the number of events as an <code>int</code>. - */ - public int getEventCount() { - return totalEvents; - } - - /** - * Gets the number of events in which at least one cluster was - * not matched. - * @return Returns the number of events as an <code>int</code>. - */ - public int getFailedClusterEventCount() { - return failedClusterEvents; - } - - /** - * Gets the number of events in which at least one pair trigger - * was not matched. - * @return Returns the number of events as an <code>int</code>. - */ - public int getFailedPairEventCount() { - return failedPairEvents; - } + // Store general run statistics. + protected long endTime = -1; + protected long startTime = -1; + protected int totalEvents = 0; + protected int noiseEvents = 0; + protected int failedPairEvents = 0; + protected int failedClusterEvents = 0; + protected int failedSinglesEvents = 0; + + /** + * Clears all of the statistical counters in the object. + */ + void clear() { + endTime = -1; + startTime = -1; + totalEvents = 0; + noiseEvents = 0; + failedPairEvents = 0; + failedClusterEvents = 0; + failedSinglesEvents = 0; + } + + @Override + public GeneralStatModule clone() { + // Create the a cloned object. + GeneralStatModule clone = new GeneralStatModule(); + + // Copy the tracked statistical data to the clone. + clone.endTime = endTime; + clone.startTime = startTime; + clone.totalEvents = totalEvents; + clone.noiseEvents = noiseEvents; + clone.failedPairEvents = failedPairEvents; + clone.failedClusterEvents = failedClusterEvents; + clone.failedSinglesEvents = failedSinglesEvents; + + // Return the clone. + return clone; + } + + /** + * Gets the length of time, in nanoseconds, over which the events + * represented by this object occurred. + * @return Returns the length of time as a <code>long</code>. + */ + public long getDuration() { + return endTime - startTime; + } + + /** + * Gets the number of events seen. + * @return Returns the number of events as an <code>int</code>. + */ + public int getEventCount() { + return totalEvents; + } + + /** + * Gets the number of events in which at least one cluster was + * not matched. + * @return Returns the number of events as an <code>int</code>. + */ + public int getFailedClusterEventCount() { + return failedClusterEvents; + } + + /** + * Gets the number of events in which at least one pair trigger + * was not matched. + * @return Returns the number of events as an <code>int</code>. + */ + public int getFailedPairEventCount() { + return failedPairEvents; + } - /** - * Gets the number of events in which at least one singles trigger - * was not matched. - * @return Returns the number of events as an <code>int</code>. - */ - public int getFailedSinglesEventCount() { - return failedSinglesEvents; - } - - /** - * Gets the number of events which were ignored due to having too - * many hits in them. - * @return Returns the number of events as an <code>int</code>. - */ - public int getNoiseEvents() { - return noiseEvents; - } + /** + * Gets the number of events in which at least one singles trigger + * was not matched. + * @return Returns the number of events as an <code>int</code>. + */ + public int getFailedSinglesEventCount() { + return failedSinglesEvents; + } + + /** + * Gets the number of events which were ignored due to having too + * many hits in them. + * @return Returns the number of events as an <code>int</code>. + */ + public int getNoiseEvents() { + return noiseEvents; + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/RunDiagStats.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/RunDiagStats.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/RunDiagStats.java Wed Mar 9 11:43:24 2016 @@ -9,89 +9,89 @@ * @author Kyle McCarty <[log in to unmask]> */ public class RunDiagStats extends GeneralStatModule { - // Store the statistics for trigger matching. - private TriggerDiagStats triggerStats = new TriggerDiagStats(); - - // Store the statistics for cluster matching. - private ClusterEvent clusterStats = new ClusterEvent(); - - /** - * Clears all of the statistical counters in the object. - */ - public void clear() { - super.clear(); - clusterStats.clear(); - triggerStats.clear(); - } - - /** - * Notes that an event failed to match all clusters. - */ - public void failedClusterEvent() { - failedClusterEvents++; - } - - /** - * Notes that an event failed to match all pair triggers. - */ - public void failedPairEvent() { - failedPairEvents++; - } + // Store the statistics for trigger matching. + private TriggerDiagStats triggerStats = new TriggerDiagStats(); + + // Store the statistics for cluster matching. + private ClusterEvent clusterStats = new ClusterEvent(); + + /** + * Clears all of the statistical counters in the object. + */ + public void clear() { + super.clear(); + clusterStats.clear(); + triggerStats.clear(); + } + + /** + * Notes that an event failed to match all clusters. + */ + public void failedClusterEvent() { + failedClusterEvents++; + } + + /** + * Notes that an event failed to match all pair triggers. + */ + public void failedPairEvent() { + failedPairEvents++; + } - /** - * Notes that an event failed to match all singles triggers. - */ - public void failedSinglesEvent() { - failedSinglesEvents++; - } - - /** - * Gets the cluster data. - * @return Returns the <code>ClusterEvent</code> object that holds - * the cluster data. - */ - public ClusterEvent getClusterStats() { - return clusterStats; - } - - /** - * Gets a snapshot of the statistical data at the present time. The - * snapshot will remain static and unchanged even if the generating - * object itself is updated. - * @return Returns a snapshot as a <code>DiagnosticSnapshot</code> - * object. - */ - public DiagnosticSnapshot getSnapshot() { - return new DiagnosticSnapshot(this); - } - - /** - * Gets the trigger data. - * @return Returns the <code>TriggerDiagStats</code> object that holds - * the cluster data. - */ - public TriggerDiagStats getTriggerStats() { - return triggerStats; - } - - /** - * Notes that an event occurred. - */ - public void sawEvent(long eventTime) { - // Increment the event count. - totalEvents++; - - // If the start time is not defined, use this as the start time. - if(startTime == -1) { startTime = eventTime; } - - // The end time should always match the most recent event. - endTime = eventTime; - } + /** + * Notes that an event failed to match all singles triggers. + */ + public void failedSinglesEvent() { + failedSinglesEvents++; + } + + /** + * Gets the cluster data. + * @return Returns the <code>ClusterEvent</code> object that holds + * the cluster data. + */ + public ClusterEvent getClusterStats() { + return clusterStats; + } + + /** + * Gets a snapshot of the statistical data at the present time. The + * snapshot will remain static and unchanged even if the generating + * object itself is updated. + * @return Returns a snapshot as a <code>DiagnosticSnapshot</code> + * object. + */ + public DiagnosticSnapshot getSnapshot() { + return new DiagnosticSnapshot(this); + } + + /** + * Gets the trigger data. + * @return Returns the <code>TriggerDiagStats</code> object that holds + * the cluster data. + */ + public TriggerDiagStats getTriggerStats() { + return triggerStats; + } + + /** + * Notes that an event occurred. + */ + public void sawEvent(long eventTime) { + // Increment the event count. + totalEvents++; + + // If the start time is not defined, use this as the start time. + if(startTime == -1) { startTime = eventTime; } + + // The end time should always match the most recent event. + endTime = eventTime; + } - /** - * Notes that an event was labeled as noise. - */ - public void sawNoiseEvent() { - noiseEvents++; - } + /** + * Notes that an event was labeled as noise. + */ + public void sawNoiseEvent() { + noiseEvents++; + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/TriggerDiagStats.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/TriggerDiagStats.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/TriggerDiagStats.java Wed Mar 9 11:43:24 2016 @@ -4,304 +4,304 @@ import org.hps.analysis.trigger.util.TriggerDiagnosticUtil; public class TriggerDiagStats { - // Define TI trigger type identifiers. - public static final int SINGLES0 = TriggerStatModule.SINGLES_0; - public static final int SINGLES1 = TriggerStatModule.SINGLES_1; - public static final int PAIR0 = TriggerStatModule.PAIR_0; - public static final int PAIR1 = TriggerStatModule.PAIR_1; - public static final int PULSER = TriggerStatModule.PULSER; - public static final int COSMIC = TriggerStatModule.COSMIC; - - // Tracks the number of TI triggers seen across all events for only - // the TI trigger with the highest priority in the event. - private int[] tiSeenHierarchical = new int[6]; - - // Tracks the number of TI triggers across all events. - private int[] tiSeenAll = new int[6]; - - // Store the statistics modules for each of the regular triggers. - private TriggerEvent[] triggerStats = new TriggerEvent[4]; - - /** - * Instantiates a new <code>TriggerDiagStats</code> object. - */ - public TriggerDiagStats() { - // Instantiate a trigger statistics module for each of the - // triggers for which statistics are supported. - for(int triggerType = 0; triggerType < 4; triggerType++) { - triggerStats[triggerType] = new TriggerEvent(); - } - } - - /** - * Clears all of the statistical counters in the object. - */ - void clear() { - // Clear the tracked TI trigger data. - for(int tiType = 0; tiType < 6; tiType++) { - tiSeenAll[tiType] = 0; - tiSeenHierarchical[tiType] = 0; - } - - // Clear the trigger statistical modules. - for(int triggerType = 0; triggerType < 4; triggerType++) { - triggerStats[triggerType].clear(); - } - } - - /** - * Gets the trigger data for the pair 0 trigger. - * @return Returns the <code>TriggerEvent</code> object that holds - * the trigger data for the pair 0 trigger. - */ - public TriggerEvent getPair0Stats() { - return triggerStats[PAIR0]; - } - - /** - * Gets the trigger data for the pair 1 trigger. - * @return Returns the <code>TriggerEvent</code> object that holds - * the trigger data for the pair 1 trigger. - */ - public TriggerEvent getPair1Stats() { - return triggerStats[PAIR1]; - } - - /** - * Gets the trigger data for the singles 0 trigger. - * @return Returns the <code>TriggerEvent</code> object that holds - * the trigger data for the singles 0 trigger. - */ - public TriggerEvent getSingles0Stats() { - return triggerStats[SINGLES0]; - } - - /** - * Gets the trigger data for the singles 1 trigger. - * @return Returns the <code>TriggerEvent</code> object that holds - * the trigger data for the singles 1 trigger. - */ - public TriggerEvent getSingles1Stats() { - return triggerStats[SINGLES1]; - } - - /** - * Gets the total number of events where the TI reported a trigger - * of the specified type. - * @param triggerID - The identifier for the type of trigger. - * @param unique - <code>true</code> returns only the number of - * events where this trigger type was the <i>only</i> type seen by - * the TI while <code>false</code> returns the number of events - * that saw this trigger type without regards for other trigger - * flags. - * @return Returns the count as an <code>int</code>. - */ - public int getTITriggers(int triggerID, boolean hierarchical) { - // Verify the trigger type. - validateTriggerType(triggerID); - - // Increment the counters. - if(hierarchical) { return tiSeenHierarchical[triggerID]; } - else { return tiSeenAll[triggerID]; } - } - - /** - * Increments the counts tracking the number of TI flags seen. - * @param flags - An array of <code>boolean</code> values of size - * six. This represents one flag for each possible TI trigger type. - */ - public void sawTITriggers(boolean[] flags) { - // There must be six trigger flags and the array must not be - // null. - if(flags == null) { - throw new NullPointerException("TI trigger flags can not be null."); - } if(flags.length != 6) { - throw new IllegalArgumentException("TI trigger flags must be of size six."); - } - - // Check each TI flag in the order of the flag hierarchy. The - // first flag in the hierarchy that is true is recorded in the - // hierarchical count. All flags are recorded in the all count. - boolean foundHierarchical = false; - if(flags[PAIR1]) { - tiSeenAll[PAIR1]++; - if(!foundHierarchical) { - tiSeenHierarchical[PAIR1]++; - foundHierarchical = true; - } - } if(flags[PAIR0]) { - tiSeenAll[PAIR0]++; - if(!foundHierarchical) { - tiSeenHierarchical[PAIR0]++; - foundHierarchical = true; - } - } if(flags[SINGLES1]) { - tiSeenAll[SINGLES1]++; - if(!foundHierarchical) { - tiSeenHierarchical[SINGLES1]++; - foundHierarchical = true; - } - } if(flags[SINGLES0]) { - tiSeenAll[SINGLES0]++; - if(!foundHierarchical) { - tiSeenHierarchical[SINGLES0]++; - foundHierarchical = true; - } - } if(flags[PULSER]) { - tiSeenAll[PULSER]++; - if(!foundHierarchical) { - tiSeenHierarchical[PULSER]++; - foundHierarchical = true; - } - } if(flags[COSMIC]) { - tiSeenAll[COSMIC]++; - if(!foundHierarchical) { - tiSeenHierarchical[COSMIC]++; - foundHierarchical = true; - } - } - } - - /** - * Prints the trigger statistics to the terminal as a table. - */ - public void printEfficiencyTable() { - // Get the trigger statistics tables. - int[][] seenStats = new int[6][4]; - int[][] matchedStats = new int[6][4]; - TriggerEvent[] triggerEvents = { getSingles0Stats(), getSingles1Stats(), getPair0Stats(), getPair1Stats() }; - for(int i = 0; i < 4; i++) { - for(int j = 0; j < 6; j++) { - seenStats[j][i] = triggerEvents[i].getReconSimulatedTriggers(j); - matchedStats[j][i] = triggerEvents[i].getMatchedReconSimulatedTriggers(j); - } - } - - // Define constant spacing variables. - int columnSpacing = 3; - - // Define table headers. - String sourceName = "Source"; - String seenName = "Trigger Efficiency"; - - // Get the longest column header name. - int longestHeader = -1; - String[] headerNames = { - TriggerDiagnosticUtil.TRIGGER_NAME[0], - TriggerDiagnosticUtil.TRIGGER_NAME[1], - TriggerDiagnosticUtil.TRIGGER_NAME[2], - TriggerDiagnosticUtil.TRIGGER_NAME[3], - "TI Highest Type" - }; - for(String triggerName : headerNames) { - longestHeader = ComponentUtils.max(longestHeader, triggerName.length()); - } - longestHeader = ComponentUtils.max(longestHeader, sourceName.length()); - - // Determine the spacing needed to display the largest numerical - // cell value. - int numWidth = -1; - int longestCell = -1; - for(int eventTriggerID = 0; eventTriggerID < 6; eventTriggerID++) { - for(int seenTriggerID = 0; seenTriggerID < 4; seenTriggerID++) { - int valueSize = ComponentUtils.getDigits(seenStats[eventTriggerID][seenTriggerID]); - int cellSize = valueSize * 2 + 13; - if(cellSize > longestCell) { - longestCell = cellSize; - numWidth = valueSize; - } - } - } - - // The total column width can then be calculated from the - // longer of the header and cell values. - int columnWidth = ComponentUtils.max(longestCell, longestHeader); - int sourceWidth = ComponentUtils.max( - TriggerDiagnosticUtil.TRIGGER_NAME[0].length(), TriggerDiagnosticUtil.TRIGGER_NAME[1].length(), - TriggerDiagnosticUtil.TRIGGER_NAME[2].length(), TriggerDiagnosticUtil.TRIGGER_NAME[3].length(), - TriggerDiagnosticUtil.TRIGGER_NAME[4].length(), TriggerDiagnosticUtil.TRIGGER_NAME[5].length(), - sourceName.length() ); - - // Calculate the total width of the table value header columns. - int headerTotalWidth = (headerNames.length * columnWidth) - + ((headerNames.length - 1) * columnSpacing); - - // Write the table header. - String spacingText = ComponentUtils.getChars(' ', columnSpacing); - System.out.println(ComponentUtils.getChars(' ', sourceWidth) + spacingText - + getCenteredString(seenName, headerTotalWidth)); - - // Create the format strings for the cell values. - String headerFormat = "%-" + sourceWidth + "s" + spacingText; - String cellFormat = "%" + numWidth + "d / %" + numWidth + "d (%7.3f)"; - String nullText = getCenteredString(ComponentUtils.getChars('-', numWidth) + " / " - + ComponentUtils.getChars('-', numWidth) + " ( N/A )", columnWidth) + spacingText; - - // Print the column headers. - System.out.printf(headerFormat, sourceName); - for(String header : headerNames) { - System.out.print(getCenteredString(header, columnWidth) + spacingText); - } - System.out.println(); - - // Write out the value columns. - for(int eventTriggerID = 0; eventTriggerID < 6; eventTriggerID++) { - // Print out the row header. - System.out.printf(headerFormat, TriggerDiagnosticUtil.TRIGGER_NAME[eventTriggerID]); - - // Print the cell values. - for(int seenTriggerID = 0; seenTriggerID < 4; seenTriggerID++) { - if(seenTriggerID == eventTriggerID) { System.out.print(nullText); } - else { - String cellText = String.format(cellFormat, matchedStats[eventTriggerID][seenTriggerID], - seenStats[eventTriggerID][seenTriggerID], - (100.0 * matchedStats[eventTriggerID][seenTriggerID] / seenStats[eventTriggerID][seenTriggerID])); - System.out.print(getCenteredString(cellText, columnWidth) + spacingText); - } - } - - // Output the number of events that had only the trigger - // type ID for the current trigger type flagged by the TI. - System.out.print(getCenteredString("" + getTITriggers(eventTriggerID, true), columnWidth) + spacingText); - - // Start a new line. - System.out.println(); - } - } - - /** - * Produces a <code>String</code> of the indicated length with the - * text <code>value</code> centered in the middle. Extra length is - * filled through spaces before and after the text. - * @param value - The text to display. - * @param width - The number of spaces to include. - * @return Returns a <code>String</code> of the specified length, - * or the argument text if it is longer. - */ - private static final String getCenteredString(String value, int width) { - // The method can not perform as intended if the argument text - // exceeds the requested string length. Just return the text. - if(width <= value.length()) { - return value; - } - - // Otherwise, get the amount of buffering needed to center the - // text and add it around the text to produce the string. - else { - int buffer = (width - value.length()) / 2; - return ComponentUtils.getChars(' ', buffer) + value - + ComponentUtils.getChars(' ', width - buffer - value.length()); - } - } - - /** - * Produces an exception if the argument trigger type is not of a - * supported type. - * @param triggerType - The trigger type to verify. - */ - private static final void validateTriggerType(int triggerType) { - if(triggerType < 0 || triggerType > 5) { - throw new IndexOutOfBoundsException(String.format("Trigger type \"%d\" is not supported.", triggerType)); - } - } + // Define TI trigger type identifiers. + public static final int SINGLES0 = TriggerStatModule.SINGLES_0; + public static final int SINGLES1 = TriggerStatModule.SINGLES_1; + public static final int PAIR0 = TriggerStatModule.PAIR_0; + public static final int PAIR1 = TriggerStatModule.PAIR_1; + public static final int PULSER = TriggerStatModule.PULSER; + public static final int COSMIC = TriggerStatModule.COSMIC; + + // Tracks the number of TI triggers seen across all events for only + // the TI trigger with the highest priority in the event. + private int[] tiSeenHierarchical = new int[6]; + + // Tracks the number of TI triggers across all events. + private int[] tiSeenAll = new int[6]; + + // Store the statistics modules for each of the regular triggers. + private TriggerEvent[] triggerStats = new TriggerEvent[4]; + + /** + * Instantiates a new <code>TriggerDiagStats</code> object. + */ + public TriggerDiagStats() { + // Instantiate a trigger statistics module for each of the + // triggers for which statistics are supported. + for(int triggerType = 0; triggerType < 4; triggerType++) { + triggerStats[triggerType] = new TriggerEvent(); + } + } + + /** + * Clears all of the statistical counters in the object. + */ + void clear() { + // Clear the tracked TI trigger data. + for(int tiType = 0; tiType < 6; tiType++) { + tiSeenAll[tiType] = 0; + tiSeenHierarchical[tiType] = 0; + } + + // Clear the trigger statistical modules. + for(int triggerType = 0; triggerType < 4; triggerType++) { + triggerStats[triggerType].clear(); + } + } + + /** + * Gets the trigger data for the pair 0 trigger. + * @return Returns the <code>TriggerEvent</code> object that holds + * the trigger data for the pair 0 trigger. + */ + public TriggerEvent getPair0Stats() { + return triggerStats[PAIR0]; + } + + /** + * Gets the trigger data for the pair 1 trigger. + * @return Returns the <code>TriggerEvent</code> object that holds + * the trigger data for the pair 1 trigger. + */ + public TriggerEvent getPair1Stats() { + return triggerStats[PAIR1]; + } + + /** + * Gets the trigger data for the singles 0 trigger. + * @return Returns the <code>TriggerEvent</code> object that holds + * the trigger data for the singles 0 trigger. + */ + public TriggerEvent getSingles0Stats() { + return triggerStats[SINGLES0]; + } + + /** + * Gets the trigger data for the singles 1 trigger. + * @return Returns the <code>TriggerEvent</code> object that holds + * the trigger data for the singles 1 trigger. + */ + public TriggerEvent getSingles1Stats() { + return triggerStats[SINGLES1]; + } + + /** + * Gets the total number of events where the TI reported a trigger + * of the specified type. + * @param triggerID - The identifier for the type of trigger. + * @param unique - <code>true</code> returns only the number of + * events where this trigger type was the <i>only</i> type seen by + * the TI while <code>false</code> returns the number of events + * that saw this trigger type without regards for other trigger + * flags. + * @return Returns the count as an <code>int</code>. + */ + public int getTITriggers(int triggerID, boolean hierarchical) { + // Verify the trigger type. + validateTriggerType(triggerID); + + // Increment the counters. + if(hierarchical) { return tiSeenHierarchical[triggerID]; } + else { return tiSeenAll[triggerID]; } + } + + /** + * Increments the counts tracking the number of TI flags seen. + * @param flags - An array of <code>boolean</code> values of size + * six. This represents one flag for each possible TI trigger type. + */ + public void sawTITriggers(boolean[] flags) { + // There must be six trigger flags and the array must not be + // null. + if(flags == null) { + throw new NullPointerException("TI trigger flags can not be null."); + } if(flags.length != 6) { + throw new IllegalArgumentException("TI trigger flags must be of size six."); + } + + // Check each TI flag in the order of the flag hierarchy. The + // first flag in the hierarchy that is true is recorded in the + // hierarchical count. All flags are recorded in the all count. + boolean foundHierarchical = false; + if(flags[PAIR1]) { + tiSeenAll[PAIR1]++; + if(!foundHierarchical) { + tiSeenHierarchical[PAIR1]++; + foundHierarchical = true; + } + } if(flags[PAIR0]) { + tiSeenAll[PAIR0]++; + if(!foundHierarchical) { + tiSeenHierarchical[PAIR0]++; + foundHierarchical = true; + } + } if(flags[SINGLES1]) { + tiSeenAll[SINGLES1]++; + if(!foundHierarchical) { + tiSeenHierarchical[SINGLES1]++; + foundHierarchical = true; + } + } if(flags[SINGLES0]) { + tiSeenAll[SINGLES0]++; + if(!foundHierarchical) { + tiSeenHierarchical[SINGLES0]++; + foundHierarchical = true; + } + } if(flags[PULSER]) { + tiSeenAll[PULSER]++; + if(!foundHierarchical) { + tiSeenHierarchical[PULSER]++; + foundHierarchical = true; + } + } if(flags[COSMIC]) { + tiSeenAll[COSMIC]++; + if(!foundHierarchical) { + tiSeenHierarchical[COSMIC]++; + foundHierarchical = true; + } + } + } + + /** + * Prints the trigger statistics to the terminal as a table. + */ + public void printEfficiencyTable() { + // Get the trigger statistics tables. + int[][] seenStats = new int[6][4]; + int[][] matchedStats = new int[6][4]; + TriggerEvent[] triggerEvents = { getSingles0Stats(), getSingles1Stats(), getPair0Stats(), getPair1Stats() }; + for(int i = 0; i < 4; i++) { + for(int j = 0; j < 6; j++) { + seenStats[j][i] = triggerEvents[i].getReconSimulatedTriggers(j); + matchedStats[j][i] = triggerEvents[i].getMatchedReconSimulatedTriggers(j); + } + } + + // Define constant spacing variables. + int columnSpacing = 3; + + // Define table headers. + String sourceName = "Source"; + String seenName = "Trigger Efficiency"; + + // Get the longest column header name. + int longestHeader = -1; + String[] headerNames = { + TriggerDiagnosticUtil.TRIGGER_NAME[0], + TriggerDiagnosticUtil.TRIGGER_NAME[1], + TriggerDiagnosticUtil.TRIGGER_NAME[2], + TriggerDiagnosticUtil.TRIGGER_NAME[3], + "TI Highest Type" + }; + for(String triggerName : headerNames) { + longestHeader = ComponentUtils.max(longestHeader, triggerName.length()); + } + longestHeader = ComponentUtils.max(longestHeader, sourceName.length()); + + // Determine the spacing needed to display the largest numerical + // cell value. + int numWidth = -1; + int longestCell = -1; + for(int eventTriggerID = 0; eventTriggerID < 6; eventTriggerID++) { + for(int seenTriggerID = 0; seenTriggerID < 4; seenTriggerID++) { + int valueSize = ComponentUtils.getDigits(seenStats[eventTriggerID][seenTriggerID]); + int cellSize = valueSize * 2 + 13; + if(cellSize > longestCell) { + longestCell = cellSize; + numWidth = valueSize; + } + } + } + + // The total column width can then be calculated from the + // longer of the header and cell values. + int columnWidth = ComponentUtils.max(longestCell, longestHeader); + int sourceWidth = ComponentUtils.max( + TriggerDiagnosticUtil.TRIGGER_NAME[0].length(), TriggerDiagnosticUtil.TRIGGER_NAME[1].length(), + TriggerDiagnosticUtil.TRIGGER_NAME[2].length(), TriggerDiagnosticUtil.TRIGGER_NAME[3].length(), + TriggerDiagnosticUtil.TRIGGER_NAME[4].length(), TriggerDiagnosticUtil.TRIGGER_NAME[5].length(), + sourceName.length() ); + + // Calculate the total width of the table value header columns. + int headerTotalWidth = (headerNames.length * columnWidth) + + ((headerNames.length - 1) * columnSpacing); + + // Write the table header. + String spacingText = ComponentUtils.getChars(' ', columnSpacing); + System.out.println(ComponentUtils.getChars(' ', sourceWidth) + spacingText + + getCenteredString(seenName, headerTotalWidth)); + + // Create the format strings for the cell values. + String headerFormat = "%-" + sourceWidth + "s" + spacingText; + String cellFormat = "%" + numWidth + "d / %" + numWidth + "d (%7.3f)"; + String nullText = getCenteredString(ComponentUtils.getChars('-', numWidth) + " / " + + ComponentUtils.getChars('-', numWidth) + " ( N/A )", columnWidth) + spacingText; + + // Print the column headers. + System.out.printf(headerFormat, sourceName); + for(String header : headerNames) { + System.out.print(getCenteredString(header, columnWidth) + spacingText); + } + System.out.println(); + + // Write out the value columns. + for(int eventTriggerID = 0; eventTriggerID < 6; eventTriggerID++) { + // Print out the row header. + System.out.printf(headerFormat, TriggerDiagnosticUtil.TRIGGER_NAME[eventTriggerID]); + + // Print the cell values. + for(int seenTriggerID = 0; seenTriggerID < 4; seenTriggerID++) { + if(seenTriggerID == eventTriggerID) { System.out.print(nullText); } + else { + String cellText = String.format(cellFormat, matchedStats[eventTriggerID][seenTriggerID], + seenStats[eventTriggerID][seenTriggerID], + (100.0 * matchedStats[eventTriggerID][seenTriggerID] / seenStats[eventTriggerID][seenTriggerID])); + System.out.print(getCenteredString(cellText, columnWidth) + spacingText); + } + } + + // Output the number of events that had only the trigger + // type ID for the current trigger type flagged by the TI. + System.out.print(getCenteredString("" + getTITriggers(eventTriggerID, true), columnWidth) + spacingText); + + // Start a new line. + System.out.println(); + } + } + + /** + * Produces a <code>String</code> of the indicated length with the + * text <code>value</code> centered in the middle. Extra length is + * filled through spaces before and after the text. + * @param value - The text to display. + * @param width - The number of spaces to include. + * @return Returns a <code>String</code> of the specified length, + * or the argument text if it is longer. + */ + private static final String getCenteredString(String value, int width) { + // The method can not perform as intended if the argument text + // exceeds the requested string length. Just return the text. + if(width <= value.length()) { + return value; + } + + // Otherwise, get the amount of buffering needed to center the + // text and add it around the text to produce the string. + else { + int buffer = (width - value.length()) / 2; + return ComponentUtils.getChars(' ', buffer) + value + + ComponentUtils.getChars(' ', width - buffer - value.length()); + } + } + + /** + * Produces an exception if the argument trigger type is not of a + * supported type. + * @param triggerType - The trigger type to verify. + */ + private static final void validateTriggerType(int triggerType) { + if(triggerType < 0 || triggerType > 5) { + throw new IndexOutOfBoundsException(String.format("Trigger type \"%d\" is not supported.", triggerType)); + } + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/TriggerEvent.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/TriggerEvent.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/TriggerEvent.java Wed Mar 9 11:43:24 2016 @@ -9,263 +9,263 @@ * @author Kyle McCarty <[log in to unmask]> */ public class TriggerEvent extends TriggerStatModule { - /** - * Adds the statistics from one event object into this one. - * @param event - The event data to add. - */ - public void addEvent(TriggerStatModule event) { - // Merge the values that do not depend on trigger source type. - reportedTriggers += event.reportedTriggers; - - // Merge each value that depends on the trigger source type. - for(int sourceType = 0; sourceType < 2; sourceType++) { - simTriggers[sourceType] += event.simTriggers[sourceType]; - matchedTriggers[sourceType] += event.matchedTriggers[sourceType]; - unmatchedTriggers[sourceType] += event.unmatchedTriggers[sourceType]; - - // Merge the number of times each cut failed. - for(int cutID = 0; cutID < 4; cutID++) { - failedCuts[sourceType][cutID] += event.failedCuts[sourceType][cutID]; - } - - // Copy the values for the TI flag trigger counters. - for(int tiType = 0; tiType < 6; tiType++) { - tiTriggersSeen[sourceType][tiType] += event.tiTriggersSeen[sourceType][tiType]; - tiTriggersMatched[sourceType][tiType] += event.tiTriggersMatched[sourceType][tiType]; - } - } - } - - /** - * Indicates that a reconstructed trigger could not be matched, even - * partially, to an SSP bank trigger. - */ - public void failedReconTrigger() { - unmatchedTriggers[RECON]++; - } - - /** - * Indicates that an SSP simulated trigger could not be matched, even - * partially, to an SSP bank trigger. - */ - public void failedSSPTrigger() { - unmatchedTriggers[SSP]++; - } + /** + * Adds the statistics from one event object into this one. + * @param event - The event data to add. + */ + public void addEvent(TriggerStatModule event) { + // Merge the values that do not depend on trigger source type. + reportedTriggers += event.reportedTriggers; + + // Merge each value that depends on the trigger source type. + for(int sourceType = 0; sourceType < 2; sourceType++) { + simTriggers[sourceType] += event.simTriggers[sourceType]; + matchedTriggers[sourceType] += event.matchedTriggers[sourceType]; + unmatchedTriggers[sourceType] += event.unmatchedTriggers[sourceType]; + + // Merge the number of times each cut failed. + for(int cutID = 0; cutID < 4; cutID++) { + failedCuts[sourceType][cutID] += event.failedCuts[sourceType][cutID]; + } + + // Copy the values for the TI flag trigger counters. + for(int tiType = 0; tiType < 6; tiType++) { + tiTriggersSeen[sourceType][tiType] += event.tiTriggersSeen[sourceType][tiType]; + tiTriggersMatched[sourceType][tiType] += event.tiTriggersMatched[sourceType][tiType]; + } + } + } + + /** + * Indicates that a reconstructed trigger could not be matched, even + * partially, to an SSP bank trigger. + */ + public void failedReconTrigger() { + unmatchedTriggers[RECON]++; + } + + /** + * Indicates that an SSP simulated trigger could not be matched, even + * partially, to an SSP bank trigger. + */ + public void failedSSPTrigger() { + unmatchedTriggers[SSP]++; + } - /** - * Indicates that a trigger simulated from a reconstructed cluster - * was successfully matched to a trigger in the SSP bank. - * @param tiFlags - An array of size 6 indicating which TI bank - * flags are active and which are not. - * @param triggerTypeID - An identifier indicating the type of - * trigger that was matched. - */ - public void matchedReconTrigger(boolean[] tiFlags) { - matchedTriggers(tiFlags, RECON); - } - - /** - * Indicates that a trigger simulated from a reconstructed cluster - * was partially matched to a trigger in the SSP bank, and notes - * which cuts did and did not match. - * @param tiFlags - An array of size 6 indicating which TI bank - * flags are active and which are not. - * @param triggerTypeID - An identifier indicating the type of - * trigger that was matched. - * @param matchedCuts - An array of size 3 or 4 indicating which - * cuts did and did not align between the triggers. - */ - public void matchedReconTrigger(boolean[] tiFlags, boolean[] matchedCuts) { - matchedTriggers(tiFlags, matchedCuts, RECON); - } - - /** - * Indicates that a trigger simulated from an SSP bank cluster was - * successfully matched to a trigger in the SSP bank. - * @param tiFlags - An array of size 6 indicating which TI bank - * flags are active and which are not. - * @param triggerTypeID - An identifier indicating the type of - * trigger that was matched. - */ - public void matchedSSPTrigger(boolean[] tiFlags) { - matchedTriggers(tiFlags, SSP); - } - - /** - * Indicates that a trigger simulated from an SSP bank cluster was - * partially matched to a trigger in the SSP bank, and notes which - * cuts did and did not match. - * @param tiFlags - An array of size 6 indicating which TI bank - * flags are active and which are not. - * @param triggerTypeID - An identifier indicating the type of - * trigger that was matched. - * @param matchedCuts - An array of size 3 or 4 indicating which - * cuts did and did not align between the triggers. - */ - public void matchedSSPTrigger(boolean[] tiFlags, boolean[] matchedCuts) { - matchedTriggers(tiFlags, matchedCuts, SSP); - } - - /** - * Indicates that a trigger simulated from a reconstructed cluster - * was seen and increments the count for this type of trigger by one. - * @param tiFlags - Whether or not each of the TI bank flags is - * active or not. - */ - public void sawReconSimulatedTrigger(boolean[] tiFlags) { - sawReconSimulatedTriggers(tiFlags, 1); - } - - /** - * Indicates that a number triggers simulated from reconstructed - * clusters were seen and increments the count for this type of - * trigger by the indicated number. - * @param tiFlags - Whether or not each of the TI bank flags is - * active or not. - * @param count - The number of simulated triggers seen. - */ - public void sawReconSimulatedTriggers(boolean[] tiFlags, int count) { - // Increment the total count. - simTriggers[RECON] += count; - - // Increment the TI flag counters. - for(int tiType = 0; tiType < 6; tiType++) { - if(tiFlags[tiType]) { - tiTriggersSeen[RECON][tiType] += count; - } - } - } - - /** - * Indicates that a trigger from the SSP trigger bank was seen and - * increments the count for this type of trigger by one. - */ - public void sawReportedTrigger() { - sawReportedTriggers(1); - } - - /** - * Indicates that a number triggers from the SSP trigger bank were - * seen and increments the count for this type of trigger by the - * indicated number. - * @param count - The number of simulated triggers seen. - */ - public void sawReportedTriggers(int count) { - reportedTriggers += count; - } - - /** - * Indicates that a trigger simulated from an SSP bank cluster was - * seen and increments the count for this type of trigger by one. - * @param tiFlags - Whether or not each of the TI bank flags is - * active or not. - */ - public void sawSSPSimulatedTrigger(boolean[] tiFlags) { - sawSSPSimulatedTriggers(tiFlags, 1); - } - - /** - * Indicates that a number triggers simulated from SSP bank clusters - * were seen and increments the count for this type of trigger by - * the indicated number. - * @param tiFlags - Whether or not each of the TI bank flags is - * active or not. - * @param count - The number of simulated triggers seen. - */ - public void sawSSPSimulatedTriggers(boolean[] tiFlags, int count) { - // Increment the total count. - simTriggers[SSP] += count; - - // Increment the TI flag counters. - for(int tiType = 0; tiType < 6; tiType++) { - if(tiFlags[tiType]) { - tiTriggersSeen[SSP][tiType] += count; - } - } - } - - /** - * Indicates that a simulated trigger was successfully matched to - * an SSP bank trigger. - * @param tiFlags - An array of size 6 indicating which TI bank - * flags are active and which are not. - * @param sourceType - Uses <code>SSP</code> for triggers simulated - * from an SSP bank cluster and <code>RECON</code> for triggers that - * were simulated from a reconstructed cluster. - */ - private final void matchedTriggers(boolean[] tiFlags, int sourceType) { - // Increment the total triggers matched. - matchedTriggers[sourceType]++; - - // Increment the triggers matched for this type for each if - // the active TI bank flags. - for(int tiType = 0; tiType < 6; tiType++) { - if(tiFlags[tiType]) { - tiTriggersMatched[sourceType][tiType]++; - } - } - } - - /** - * Indicates that a simulated trigger was partially matched to a - * trigger in the SSP bank, and notes which cuts did and did not - * match. - * @param tiFlags - An array of size 6 indicating which TI bank - * flags are active and which are not. - * @param sourceType - Uses <code>SSP</code> for triggers simulated - * from an SSP bank cluster and <code>RECON</code> for triggers that - * were simulated from a reconstructed cluster. - */ - private void matchedTriggers(boolean[] tiFlags, boolean[] matchedCuts, int sourceType) { - // The matched cuts must be defined. - if(matchedCuts == null) { - throw new NullPointerException("The matched cuts array must be defined."); - } - - // The matched cuts array must be of either size 3 or 4. - if(matchedCuts.length != 3 && matchedCuts.length != 4) { - throw new IllegalArgumentException("All triggers must use either three or four cuts."); - } - - // Increment the counters for each cut that was no matched. Also - // track whether or not a cut actually failed. - boolean cutFailed = false; - for(int cutIndex = 0; cutIndex < matchedCuts.length; cutIndex++) { - if(!matchedCuts[cutIndex]) { - failedCuts[sourceType][cutIndex]++; - cutFailed = true; - } - } - - // If no cut failed, this is actually a match. Increment the - // appropriate counters. - if(!cutFailed) { - matchedTriggers(tiFlags, sourceType); - } - } - - @Deprecated - public String getPrintData() { - StringBuffer out = new StringBuffer(); + /** + * Indicates that a trigger simulated from a reconstructed cluster + * was successfully matched to a trigger in the SSP bank. + * @param tiFlags - An array of size 6 indicating which TI bank + * flags are active and which are not. + * @param triggerTypeID - An identifier indicating the type of + * trigger that was matched. + */ + public void matchedReconTrigger(boolean[] tiFlags) { + matchedTriggers(tiFlags, RECON); + } + + /** + * Indicates that a trigger simulated from a reconstructed cluster + * was partially matched to a trigger in the SSP bank, and notes + * which cuts did and did not match. + * @param tiFlags - An array of size 6 indicating which TI bank + * flags are active and which are not. + * @param triggerTypeID - An identifier indicating the type of + * trigger that was matched. + * @param matchedCuts - An array of size 3 or 4 indicating which + * cuts did and did not align between the triggers. + */ + public void matchedReconTrigger(boolean[] tiFlags, boolean[] matchedCuts) { + matchedTriggers(tiFlags, matchedCuts, RECON); + } + + /** + * Indicates that a trigger simulated from an SSP bank cluster was + * successfully matched to a trigger in the SSP bank. + * @param tiFlags - An array of size 6 indicating which TI bank + * flags are active and which are not. + * @param triggerTypeID - An identifier indicating the type of + * trigger that was matched. + */ + public void matchedSSPTrigger(boolean[] tiFlags) { + matchedTriggers(tiFlags, SSP); + } + + /** + * Indicates that a trigger simulated from an SSP bank cluster was + * partially matched to a trigger in the SSP bank, and notes which + * cuts did and did not match. + * @param tiFlags - An array of size 6 indicating which TI bank + * flags are active and which are not. + * @param triggerTypeID - An identifier indicating the type of + * trigger that was matched. + * @param matchedCuts - An array of size 3 or 4 indicating which + * cuts did and did not align between the triggers. + */ + public void matchedSSPTrigger(boolean[] tiFlags, boolean[] matchedCuts) { + matchedTriggers(tiFlags, matchedCuts, SSP); + } + + /** + * Indicates that a trigger simulated from a reconstructed cluster + * was seen and increments the count for this type of trigger by one. + * @param tiFlags - Whether or not each of the TI bank flags is + * active or not. + */ + public void sawReconSimulatedTrigger(boolean[] tiFlags) { + sawReconSimulatedTriggers(tiFlags, 1); + } + + /** + * Indicates that a number triggers simulated from reconstructed + * clusters were seen and increments the count for this type of + * trigger by the indicated number. + * @param tiFlags - Whether or not each of the TI bank flags is + * active or not. + * @param count - The number of simulated triggers seen. + */ + public void sawReconSimulatedTriggers(boolean[] tiFlags, int count) { + // Increment the total count. + simTriggers[RECON] += count; + + // Increment the TI flag counters. + for(int tiType = 0; tiType < 6; tiType++) { + if(tiFlags[tiType]) { + tiTriggersSeen[RECON][tiType] += count; + } + } + } + + /** + * Indicates that a trigger from the SSP trigger bank was seen and + * increments the count for this type of trigger by one. + */ + public void sawReportedTrigger() { + sawReportedTriggers(1); + } + + /** + * Indicates that a number triggers from the SSP trigger bank were + * seen and increments the count for this type of trigger by the + * indicated number. + * @param count - The number of simulated triggers seen. + */ + public void sawReportedTriggers(int count) { + reportedTriggers += count; + } + + /** + * Indicates that a trigger simulated from an SSP bank cluster was + * seen and increments the count for this type of trigger by one. + * @param tiFlags - Whether or not each of the TI bank flags is + * active or not. + */ + public void sawSSPSimulatedTrigger(boolean[] tiFlags) { + sawSSPSimulatedTriggers(tiFlags, 1); + } + + /** + * Indicates that a number triggers simulated from SSP bank clusters + * were seen and increments the count for this type of trigger by + * the indicated number. + * @param tiFlags - Whether or not each of the TI bank flags is + * active or not. + * @param count - The number of simulated triggers seen. + */ + public void sawSSPSimulatedTriggers(boolean[] tiFlags, int count) { + // Increment the total count. + simTriggers[SSP] += count; + + // Increment the TI flag counters. + for(int tiType = 0; tiType < 6; tiType++) { + if(tiFlags[tiType]) { + tiTriggersSeen[SSP][tiType] += count; + } + } + } + + /** + * Indicates that a simulated trigger was successfully matched to + * an SSP bank trigger. + * @param tiFlags - An array of size 6 indicating which TI bank + * flags are active and which are not. + * @param sourceType - Uses <code>SSP</code> for triggers simulated + * from an SSP bank cluster and <code>RECON</code> for triggers that + * were simulated from a reconstructed cluster. + */ + private final void matchedTriggers(boolean[] tiFlags, int sourceType) { + // Increment the total triggers matched. + matchedTriggers[sourceType]++; + + // Increment the triggers matched for this type for each if + // the active TI bank flags. + for(int tiType = 0; tiType < 6; tiType++) { + if(tiFlags[tiType]) { + tiTriggersMatched[sourceType][tiType]++; + } + } + } + + /** + * Indicates that a simulated trigger was partially matched to a + * trigger in the SSP bank, and notes which cuts did and did not + * match. + * @param tiFlags - An array of size 6 indicating which TI bank + * flags are active and which are not. + * @param sourceType - Uses <code>SSP</code> for triggers simulated + * from an SSP bank cluster and <code>RECON</code> for triggers that + * were simulated from a reconstructed cluster. + */ + private void matchedTriggers(boolean[] tiFlags, boolean[] matchedCuts, int sourceType) { + // The matched cuts must be defined. + if(matchedCuts == null) { + throw new NullPointerException("The matched cuts array must be defined."); + } + + // The matched cuts array must be of either size 3 or 4. + if(matchedCuts.length != 3 && matchedCuts.length != 4) { + throw new IllegalArgumentException("All triggers must use either three or four cuts."); + } + + // Increment the counters for each cut that was no matched. Also + // track whether or not a cut actually failed. + boolean cutFailed = false; + for(int cutIndex = 0; cutIndex < matchedCuts.length; cutIndex++) { + if(!matchedCuts[cutIndex]) { + failedCuts[sourceType][cutIndex]++; + cutFailed = true; + } + } + + // If no cut failed, this is actually a match. Increment the + // appropriate counters. + if(!cutFailed) { + matchedTriggers(tiFlags, sourceType); + } + } + + @Deprecated + public String getPrintData() { + StringBuffer out = new StringBuffer(); - out.append("\n"); - out.append("Trigger Result\n"); - out.append("SSP Sim Triggers :: " + simTriggers[SSP] + "\n"); - out.append("Recon Sim Triggers :: " + simTriggers[RECON] + "\n"); - out.append("Reported Triggers :: " + reportedTriggers + "\n"); - out.append(String.format("Internal Efficiency :: %d / %d (%7.3f)%n", matchedTriggers[SSP], simTriggers[SSP], - (100.0 * matchedTriggers[SSP] / simTriggers[SSP]))); - out.append(String.format("Trigger Efficiency :: %d / %d (%7.3f)%n", matchedTriggers[RECON], simTriggers[RECON], - (100.0 * matchedTriggers[RECON] / simTriggers[RECON]))); - - out.append("\n"); - out.append("Individual Cut Failure Rates\n"); - out.append("Unmatched Triggers :: " + unmatchedTriggers[SSP] + "\n"); - for(int i = 0; i < 4; i++) { - out.append(String.format("\tCut %d :: %d / %d (%7.3f)%n", i, failedCuts[SSP][i], simTriggers[SSP], - (100.0 * failedCuts[SSP][i] / simTriggers[SSP]))); - } - - return out.toString(); - } + out.append("\n"); + out.append("Trigger Result\n"); + out.append("SSP Sim Triggers :: " + simTriggers[SSP] + "\n"); + out.append("Recon Sim Triggers :: " + simTriggers[RECON] + "\n"); + out.append("Reported Triggers :: " + reportedTriggers + "\n"); + out.append(String.format("Internal Efficiency :: %d / %d (%7.3f)%n", matchedTriggers[SSP], simTriggers[SSP], + (100.0 * matchedTriggers[SSP] / simTriggers[SSP]))); + out.append(String.format("Trigger Efficiency :: %d / %d (%7.3f)%n", matchedTriggers[RECON], simTriggers[RECON], + (100.0 * matchedTriggers[RECON] / simTriggers[RECON]))); + + out.append("\n"); + out.append("Individual Cut Failure Rates\n"); + out.append("Unmatched Triggers :: " + unmatchedTriggers[SSP] + "\n"); + for(int i = 0; i < 4; i++) { + out.append(String.format("\tCut %d :: %d / %d (%7.3f)%n", i, failedCuts[SSP][i], simTriggers[SSP], + (100.0 * failedCuts[SSP][i] / simTriggers[SSP]))); + } + + return out.toString(); + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/TriggerStatModule.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/TriggerStatModule.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/data/TriggerStatModule.java Wed Mar 9 11:43:24 2016 @@ -10,285 +10,285 @@ * @author Kyle McCarty <[log in to unmask]> */ public class TriggerStatModule { - // Store the reference index for SSP simulated triggers and recon - // simulated triggers. - protected static final int SSP = 0; - protected static final int RECON = 1; - - // Define TI trigger type identifiers. - public static final int SINGLES_0 = 0; - public static final int SINGLES_1 = 1; - public static final int PAIR_0 = 2; - public static final int PAIR_1 = 3; - public static final int PULSER = 4; - public static final int COSMIC = 5; - - // Track the number of simulated triggers seen for each source type. - // SSP simulated triggers from the SSP bank clusters. Reconstructed - // simulated triggers come from clusters built from FADC data. - protected int[] simTriggers = new int[2]; - - // Also track the number of triggers reported by the SSP bank. - protected int reportedTriggers = 0; - - // Track the number of simulated triggers of each type that were - // successfully matched. - protected int[] matchedTriggers = new int[2]; - - // Track the number of simulated triggers that could not be matched - // at all. - protected int[] unmatchedTriggers = new int[2]; - - // Track which cuts succeeded and which cuts failed for each type. - // Note that this is currently only tracked for SSP cluster triggers. - protected int[][] failedCuts = new int[2][4]; - - // Store the number of trigger matches seen over all events that - // contain a given TI flag. - protected int[][] tiTriggersSeen = new int[2][6]; - protected int[][] tiTriggersMatched = new int[2][6]; - - /** - * Clears all of the statistical counters in the object. - */ - void clear() { - // Clear all values. - for(int sourceType = 0; sourceType < 2; sourceType++) { - // Clear the general statistics. - simTriggers[sourceType] = 0; - matchedTriggers[sourceType] = 0; - unmatchedTriggers[sourceType] = 0; - - // Clear the cut failure statistics. - for(int cutID = 0; cutID < 4; cutID++) { - failedCuts[sourceType][cutID] = 0; - } - - // Clear the TI flag statistics. - for(int tiType = 0; tiType < 6; tiType++) { - tiTriggersSeen[sourceType][tiType] = 0; - tiTriggersMatched[sourceType][tiType] = 0; - } - } - } - - @Override - public TriggerStatModule clone() { - // Make a new statistics module. - TriggerStatModule clone = new TriggerStatModule(); - - // Copy the values that do not depend on trigger source type. - clone.reportedTriggers = reportedTriggers; - - // Set each value that depends on the trigger source type. - for(int sourceType = 0; sourceType < 2; sourceType++) { - clone.simTriggers[sourceType] = simTriggers[sourceType]; - clone.matchedTriggers[sourceType] = matchedTriggers[sourceType]; - clone.unmatchedTriggers[sourceType] = unmatchedTriggers[sourceType]; - - // Set the number of times each cut failed. - for(int cutID = 0; cutID < 4; cutID++) { - clone.failedCuts[sourceType][cutID] = failedCuts[sourceType][cutID]; - } - - // Copy the values for the TI flag trigger counters. - for(int tiType = 0; tiType < 6; tiType++) { - clone.tiTriggersSeen[sourceType][tiType] = tiTriggersSeen[sourceType][tiType]; - clone.tiTriggersMatched[sourceType][tiType] = tiTriggersMatched[sourceType][tiType]; - } - } - - // Return the copied clone. - return clone; - } - - /** - * Gets the number of simulated triggers from reconstructed clusters - * that were not matched. - * @return Returns the number of triggers as an <code>int</code>. - */ - public int getFailedReconSimulatedTriggers() { - return simTriggers[RECON] - matchedTriggers[RECON]; - } - - /** - * Gets the number of simulated triggers from SSP bank clusters - * that were not matched. - * @return Returns the number of triggers as an <code>int</code>. - */ - public int getFailedSSPSimulatedTriggers() { - return simTriggers[SSP] - matchedTriggers[SSP]; - } - - /** - * Gets the number of simulated triggers from reconstructed clusters - * that were matched. - * @return Returns the number of triggers as an <code>int</code>. - */ - public int getMatchedReconSimulatedTriggers() { - return matchedTriggers[RECON]; - } - - /** - * Gets the number of simulated triggers from reconstructed clusters - * that were matched for a given type of trigger when a given TI - * bank flag was active. - * @param tiTypeID - The identifier for the type of TI bank trigger - * that should be active. - * @param triggerTypeID - The identifier for the type of trigger. - * @return Returns the number of triggers as an <code>int</code>. - */ - public int getMatchedReconSimulatedTriggers(int tiTypeID) { - return tiTriggersMatched[RECON][tiTypeID]; - } - - /** - * Gets the number of simulated triggers from SSP bank clusters - * that were matched. - * @return Returns the number of triggers as an <code>int</code>. - */ - public int getMatchedSSPSimulatedTriggers() { - return matchedTriggers[SSP]; - } - - /** - * Gets the number of simulated triggers from SSP bank clusters - * that were matched for a given type of trigger when a given TI - * bank flag was active. - * @param tiTypeID - The identifier for the type of TI bank trigger - * that should be active. - * @param triggerTypeID - The identifier for the type of trigger. - * @return Returns the number of triggers as an <code>int</code>. - */ - public int getMatchedSSPSimulatedTriggers(int tiTypeID) { - return tiTriggersMatched[SSP][tiTypeID]; - } - - /** - * Gets the number of simulated triggers from reconstructed clusters - * that were matched, but did not see full cut alignment. - * @return Returns the number of triggers as an <code>int</code>. - */ - public int getPartiallyMatchedReconSimulatedTriggers() { - return simTriggers[RECON] - (matchedTriggers[RECON] + unmatchedTriggers[RECON]); - } - - /** - * Gets the number of simulated triggers from SSP bank clusters - * that were matched, but did not see full cut alignment. - * @return Returns the number of triggers as an <code>int</code>. - */ - public int getPartiallyMatchedSSPSimulatedTriggers() { - return simTriggers[SSP] - (matchedTriggers[SSP] + unmatchedTriggers[SSP]); - } - - /** - * Gets the number of times the specified cut failed for triggers - * that were partially matched for triggers simulated from FADC - * reconstructed clusters. - * @param cutIndex - The numerical cut identifier. - * @return Returns the number of triggers as an <code>int</code>. - */ - public int getReconCutFailures(int cutIndex) { - return getCutFailures(RECON, cutIndex); - } - - /** - * Gets the number of simulated triggers from reconstructed clusters - * that were seen. - * @return Returns the number of triggers as an <code>int</code>. - */ - public int getReconSimulatedTriggers() { - return simTriggers[RECON]; - } - - /** - * Gets the number of simulated triggers from reconstructed clusters - * that were seen for a given trigger type when a given TI bank - * flag was active. - * @param tiTypeID - The identifier for the type of TI bank trigger - * that should be active. - * @param triggerTypeID - The identifier for the type of trigger. - * @return Returns the number of triggers as an <code>int</code>. - */ - public int getReconSimulatedTriggers(int tiTypeID) { - return tiTriggersSeen[RECON][tiTypeID]; - } - - /** - * Gets the number of triggers reported by the SSP bank. - * @return Returns the number of triggers as an <code>int</code>. - */ - public int getReportedTriggers() { - return reportedTriggers; - } - - /** - * Gets the number of times the specified cut failed for triggers - * that were partially matched for triggers simulated from SSP - * bank clusters. - * @param cutIndex - The numerical cut identifier. - * @return Returns the number of triggers as an <code>int</code>. - */ - public int getSSPCutFailures(int cutIndex) { - return getCutFailures(SSP, cutIndex); - } - - /** - * Gets the number of simulated triggers from SSP bank clusters - * that were seen. - * @return Returns the number of triggers as an <code>int</code>. - */ - public int getSSPSimulatedTriggers() { - return simTriggers[SSP]; - } - - /** - * Gets the number of simulated triggers from SSP bank clusters - * that were seen for a given trigger type when a given TI bank - * flag was active. - * @param tiTypeID - The identifier for the type of TI bank trigger - * that should be active. - * @param triggerTypeID - The identifier for the type of trigger. - * @return Returns the number of triggers as an <code>int</code>. - */ - public int getSSPSimulatedTriggers(int tiTypeID) { - return tiTriggersSeen[SSP][tiTypeID]; - } - - /** - * Gets the number of simulated triggers from reconstructed clusters - * that were completely unmatched. - * @return Returns the number of triggers as an <code>int</code>. - */ - public int getUnmatchedReconSimulatedTriggers() { - return unmatchedTriggers[RECON]; - } - - /** - * Gets the number of simulated triggers from SSP bank clusters - * that were completely unmatched. - * @return Returns the number of triggers as an <code>int</code>. - */ - public int getUnmatchedSSPSimulatedTriggers() { - return unmatchedTriggers[SSP]; - } - - /** - * Gets the number of times the specified cut failed for triggers - * that were partially matched for triggers simulated from the type - * of cluster indicated. - * @param type - Either <code>SSP</code> or <code>RECON</code>. - * @param cutIndex - The numerical cut identifier. - * @return Returns the number of triggers as an <code>int</code>. - */ - private int getCutFailures(int type, int cutIndex) { - // Ensure that the cut index is valid. - if(cutIndex < 0 || cutIndex >= 4) { - throw new IndexOutOfBoundsException(String.format("Cut index \"%d\" is not recognized.", cutIndex)); - } - - // Return the cut failures. - return failedCuts[type][cutIndex]; - } + // Store the reference index for SSP simulated triggers and recon + // simulated triggers. + protected static final int SSP = 0; + protected static final int RECON = 1; + + // Define TI trigger type identifiers. + public static final int SINGLES_0 = 0; + public static final int SINGLES_1 = 1; + public static final int PAIR_0 = 2; + public static final int PAIR_1 = 3; + public static final int PULSER = 4; + public static final int COSMIC = 5; + + // Track the number of simulated triggers seen for each source type. + // SSP simulated triggers from the SSP bank clusters. Reconstructed + // simulated triggers come from clusters built from FADC data. + protected int[] simTriggers = new int[2]; + + // Also track the number of triggers reported by the SSP bank. + protected int reportedTriggers = 0; + + // Track the number of simulated triggers of each type that were + // successfully matched. + protected int[] matchedTriggers = new int[2]; + + // Track the number of simulated triggers that could not be matched + // at all. + protected int[] unmatchedTriggers = new int[2]; + + // Track which cuts succeeded and which cuts failed for each type. + // Note that this is currently only tracked for SSP cluster triggers. + protected int[][] failedCuts = new int[2][4]; + + // Store the number of trigger matches seen over all events that + // contain a given TI flag. + protected int[][] tiTriggersSeen = new int[2][6]; + protected int[][] tiTriggersMatched = new int[2][6]; + + /** + * Clears all of the statistical counters in the object. + */ + void clear() { + // Clear all values. + for(int sourceType = 0; sourceType < 2; sourceType++) { + // Clear the general statistics. + simTriggers[sourceType] = 0; + matchedTriggers[sourceType] = 0; + unmatchedTriggers[sourceType] = 0; + + // Clear the cut failure statistics. + for(int cutID = 0; cutID < 4; cutID++) { + failedCuts[sourceType][cutID] = 0; + } + + // Clear the TI flag statistics. + for(int tiType = 0; tiType < 6; tiType++) { + tiTriggersSeen[sourceType][tiType] = 0; + tiTriggersMatched[sourceType][tiType] = 0; + } + } + } + + @Override + public TriggerStatModule clone() { + // Make a new statistics module. + TriggerStatModule clone = new TriggerStatModule(); + + // Copy the values that do not depend on trigger source type. + clone.reportedTriggers = reportedTriggers; + + // Set each value that depends on the trigger source type. + for(int sourceType = 0; sourceType < 2; sourceType++) { + clone.simTriggers[sourceType] = simTriggers[sourceType]; + clone.matchedTriggers[sourceType] = matchedTriggers[sourceType]; + clone.unmatchedTriggers[sourceType] = unmatchedTriggers[sourceType]; + + // Set the number of times each cut failed. + for(int cutID = 0; cutID < 4; cutID++) { + clone.failedCuts[sourceType][cutID] = failedCuts[sourceType][cutID]; + } + + // Copy the values for the TI flag trigger counters. + for(int tiType = 0; tiType < 6; tiType++) { + clone.tiTriggersSeen[sourceType][tiType] = tiTriggersSeen[sourceType][tiType]; + clone.tiTriggersMatched[sourceType][tiType] = tiTriggersMatched[sourceType][tiType]; + } + } + + // Return the copied clone. + return clone; + } + + /** + * Gets the number of simulated triggers from reconstructed clusters + * that were not matched. + * @return Returns the number of triggers as an <code>int</code>. + */ + public int getFailedReconSimulatedTriggers() { + return simTriggers[RECON] - matchedTriggers[RECON]; + } + + /** + * Gets the number of simulated triggers from SSP bank clusters + * that were not matched. + * @return Returns the number of triggers as an <code>int</code>. + */ + public int getFailedSSPSimulatedTriggers() { + return simTriggers[SSP] - matchedTriggers[SSP]; + } + + /** + * Gets the number of simulated triggers from reconstructed clusters + * that were matched. + * @return Returns the number of triggers as an <code>int</code>. + */ + public int getMatchedReconSimulatedTriggers() { + return matchedTriggers[RECON]; + } + + /** + * Gets the number of simulated triggers from reconstructed clusters + * that were matched for a given type of trigger when a given TI + * bank flag was active. + * @param tiTypeID - The identifier for the type of TI bank trigger + * that should be active. + * @param triggerTypeID - The identifier for the type of trigger. + * @return Returns the number of triggers as an <code>int</code>. + */ + public int getMatchedReconSimulatedTriggers(int tiTypeID) { + return tiTriggersMatched[RECON][tiTypeID]; + } + + /** + * Gets the number of simulated triggers from SSP bank clusters + * that were matched. + * @return Returns the number of triggers as an <code>int</code>. + */ + public int getMatchedSSPSimulatedTriggers() { + return matchedTriggers[SSP]; + } + + /** + * Gets the number of simulated triggers from SSP bank clusters + * that were matched for a given type of trigger when a given TI + * bank flag was active. + * @param tiTypeID - The identifier for the type of TI bank trigger + * that should be active. + * @param triggerTypeID - The identifier for the type of trigger. + * @return Returns the number of triggers as an <code>int</code>. + */ + public int getMatchedSSPSimulatedTriggers(int tiTypeID) { + return tiTriggersMatched[SSP][tiTypeID]; + } + + /** + * Gets the number of simulated triggers from reconstructed clusters + * that were matched, but did not see full cut alignment. + * @return Returns the number of triggers as an <code>int</code>. + */ + public int getPartiallyMatchedReconSimulatedTriggers() { + return simTriggers[RECON] - (matchedTriggers[RECON] + unmatchedTriggers[RECON]); + } + + /** + * Gets the number of simulated triggers from SSP bank clusters + * that were matched, but did not see full cut alignment. + * @return Returns the number of triggers as an <code>int</code>. + */ + public int getPartiallyMatchedSSPSimulatedTriggers() { + return simTriggers[SSP] - (matchedTriggers[SSP] + unmatchedTriggers[SSP]); + } + + /** + * Gets the number of times the specified cut failed for triggers + * that were partially matched for triggers simulated from FADC + * reconstructed clusters. + * @param cutIndex - The numerical cut identifier. + * @return Returns the number of triggers as an <code>int</code>. + */ + public int getReconCutFailures(int cutIndex) { + return getCutFailures(RECON, cutIndex); + } + + /** + * Gets the number of simulated triggers from reconstructed clusters + * that were seen. + * @return Returns the number of triggers as an <code>int</code>. + */ + public int getReconSimulatedTriggers() { + return simTriggers[RECON]; + } + + /** + * Gets the number of simulated triggers from reconstructed clusters + * that were seen for a given trigger type when a given TI bank + * flag was active. + * @param tiTypeID - The identifier for the type of TI bank trigger + * that should be active. + * @param triggerTypeID - The identifier for the type of trigger. + * @return Returns the number of triggers as an <code>int</code>. + */ + public int getReconSimulatedTriggers(int tiTypeID) { + return tiTriggersSeen[RECON][tiTypeID]; + } + + /** + * Gets the number of triggers reported by the SSP bank. + * @return Returns the number of triggers as an <code>int</code>. + */ + public int getReportedTriggers() { + return reportedTriggers; + } + + /** + * Gets the number of times the specified cut failed for triggers + * that were partially matched for triggers simulated from SSP + * bank clusters. + * @param cutIndex - The numerical cut identifier. + * @return Returns the number of triggers as an <code>int</code>. + */ + public int getSSPCutFailures(int cutIndex) { + return getCutFailures(SSP, cutIndex); + } + + /** + * Gets the number of simulated triggers from SSP bank clusters + * that were seen. + * @return Returns the number of triggers as an <code>int</code>. + */ + public int getSSPSimulatedTriggers() { + return simTriggers[SSP]; + } + + /** + * Gets the number of simulated triggers from SSP bank clusters + * that were seen for a given trigger type when a given TI bank + * flag was active. + * @param tiTypeID - The identifier for the type of TI bank trigger + * that should be active. + * @param triggerTypeID - The identifier for the type of trigger. + * @return Returns the number of triggers as an <code>int</code>. + */ + public int getSSPSimulatedTriggers(int tiTypeID) { + return tiTriggersSeen[SSP][tiTypeID]; + } + + /** + * Gets the number of simulated triggers from reconstructed clusters + * that were completely unmatched. + * @return Returns the number of triggers as an <code>int</code>. + */ + public int getUnmatchedReconSimulatedTriggers() { + return unmatchedTriggers[RECON]; + } + + /** + * Gets the number of simulated triggers from SSP bank clusters + * that were completely unmatched. + * @return Returns the number of triggers as an <code>int</code>. + */ + public int getUnmatchedSSPSimulatedTriggers() { + return unmatchedTriggers[SSP]; + } + + /** + * Gets the number of times the specified cut failed for triggers + * that were partially matched for triggers simulated from the type + * of cluster indicated. + * @param type - Either <code>SSP</code> or <code>RECON</code>. + * @param cutIndex - The numerical cut identifier. + * @return Returns the number of triggers as an <code>int</code>. + */ + private int getCutFailures(int type, int cutIndex) { + // Ensure that the cut index is valid. + if(cutIndex < 0 || cutIndex >= 4) { + throw new IndexOutOfBoundsException(String.format("Cut index \"%d\" is not recognized.", cutIndex)); + } + + // Return the cut failures. + return failedCuts[type][cutIndex]; + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerPlotsModule.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerPlotsModule.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/event/TriggerPlotsModule.java Wed Mar 9 11:43:24 2016 @@ -16,383 +16,383 @@ * @author Kyle McCarty */ public class TriggerPlotsModule { - // Reference variables. - private static final int RECON = 0; - private static final int SSP = 1; - private static final int ALL = 0; - private static final int MATCHED = 1; - private static final int FAILED = 2; - private static final int TRIGGERED = 3; - private static final int NO_CUTS = 4; - - // Class variables. - private final double[] energySlopeParamF; - private static final double MÃLLER_SUM_THRESHOLD = 0.750; - - // Plots. - private AIDA aida = AIDA.defaultInstance(); - private IHistogram1D[][][] singlesClusterEnergyPlot = new IHistogram1D[2][2][5]; - private IHistogram1D[][][] singlesHitCountPlot = new IHistogram1D[2][2][5]; - private IHistogram1D[][][] singlesTriggerTimePlot = new IHistogram1D[2][2][5]; - - private IHistogram1D[][][] pairClusterEnergyPlot = new IHistogram1D[2][2][5]; - private IHistogram1D[][][] pairHitCountPlot = new IHistogram1D[2][2][5]; - private IHistogram1D[][][] pairTimePlot = new IHistogram1D[2][2][5]; - private IHistogram1D[][][] pairSumPlot = new IHistogram1D[2][2][5]; + // Reference variables. + private static final int RECON = 0; + private static final int SSP = 1; + private static final int ALL = 0; + private static final int MATCHED = 1; + private static final int FAILED = 2; + private static final int TRIGGERED = 3; + private static final int NO_CUTS = 4; + + // Class variables. + private final double[] energySlopeParamF; + private static final double MÃLLER_SUM_THRESHOLD = 0.750; + + // Plots. + private AIDA aida = AIDA.defaultInstance(); + private IHistogram1D[][][] singlesClusterEnergyPlot = new IHistogram1D[2][2][5]; + private IHistogram1D[][][] singlesHitCountPlot = new IHistogram1D[2][2][5]; + private IHistogram1D[][][] singlesTriggerTimePlot = new IHistogram1D[2][2][5]; + + private IHistogram1D[][][] pairClusterEnergyPlot = new IHistogram1D[2][2][5]; + private IHistogram1D[][][] pairHitCountPlot = new IHistogram1D[2][2][5]; + private IHistogram1D[][][] pairTimePlot = new IHistogram1D[2][2][5]; + private IHistogram1D[][][] pairSumPlot = new IHistogram1D[2][2][5]; private IHistogram2D[][][] pairSumEnergiesPlot = new IHistogram2D[2][2][5]; - private IHistogram1D[][][] pairDiffPlot = new IHistogram1D[2][2][5]; - private IHistogram1D[][][] pairSlopePlot = new IHistogram1D[2][2][5]; - private IHistogram1D[][][] pairCoplanarityPlot = new IHistogram1D[2][2][5]; - private IHistogram1D[][][] pairTriggerTimePlot = new IHistogram1D[2][2][5]; - - private IHistogram1D[] møllerClusterEnergyPlot = new IHistogram1D[2]; - private IHistogram1D[] møllerHitCountPlot = new IHistogram1D[2]; - private IHistogram1D[] møllerTimePlot = new IHistogram1D[2]; - private IHistogram1D[] møllerSumPlot = new IHistogram1D[2]; + private IHistogram1D[][][] pairDiffPlot = new IHistogram1D[2][2][5]; + private IHistogram1D[][][] pairSlopePlot = new IHistogram1D[2][2][5]; + private IHistogram1D[][][] pairCoplanarityPlot = new IHistogram1D[2][2][5]; + private IHistogram1D[][][] pairTriggerTimePlot = new IHistogram1D[2][2][5]; + + private IHistogram1D[] møllerClusterEnergyPlot = new IHistogram1D[2]; + private IHistogram1D[] møllerHitCountPlot = new IHistogram1D[2]; + private IHistogram1D[] møllerTimePlot = new IHistogram1D[2]; + private IHistogram1D[] møllerSumPlot = new IHistogram1D[2]; private IHistogram2D[] møllerSumEnergiesPlot = new IHistogram2D[2]; - private IHistogram1D[] møllerDiffPlot = new IHistogram1D[2]; - private IHistogram1D[] møllerSlopePlot = new IHistogram1D[2]; - private IHistogram1D[] møllerCoplanarityPlot = new IHistogram1D[2]; - private IHistogram1D[] møllerTriggerTimePlot = new IHistogram1D[2]; + private IHistogram1D[] møllerDiffPlot = new IHistogram1D[2]; + private IHistogram1D[] møllerSlopePlot = new IHistogram1D[2]; + private IHistogram1D[] møllerCoplanarityPlot = new IHistogram1D[2]; + private IHistogram1D[] møllerTriggerTimePlot = new IHistogram1D[2]; private IHistogram2D[] møllerPositionPlot = new IHistogram2D[2]; - - private IHistogram1D[] tridentClusterEnergyPlot = new IHistogram1D[2]; - private IHistogram1D[] tridentHitCountPlot = new IHistogram1D[2]; + + private IHistogram1D[] tridentClusterEnergyPlot = new IHistogram1D[2]; + private IHistogram1D[] tridentHitCountPlot = new IHistogram1D[2]; private IHistogram2D[] tridentPositionPlot = new IHistogram2D[2]; - - /** - * Instantiates a new <code>TriggerPlotsModule</code> that will use - * the indicated values for the energy slope conversion factor when - * plotting energy slope values. Plots will be attached to the - * default AIDA instance. - * @param trigger0F - The energy slope conversion factor for the - * first trigger. - * @param trigger1F - The energy slope conversion factor for the - * second trigger. - */ - public TriggerPlotsModule(double trigger0F, double trigger1F) { - // Store the energy slope parameter. - energySlopeParamF = new double[2]; - energySlopeParamF[0] = trigger0F; - energySlopeParamF[1] = trigger1F; - - // Define type string values. - String[] sourceType = { "Recon", "SSP" }; - String[] resultType = { "All", "Matched", "Failed", "Triggered", "No Cuts" }; - - // Instantiate the trigger result plots for each trigger. - for(int triggerNum = 0; triggerNum < 2; triggerNum++) { - // Get the directory for the current triggers. - String pairDir = "Pair Trigger " + triggerNum; - String singlesDir = "Singles Trigger " + triggerNum; - - // Instantiate the trigger result plots for each type of - // trigger source object. - for(int source = 0; source < 2; source++) { - // Instantiate the trigger result plots for each type - // of trigger match result. - for(int result = 0; result < 5; result++) { - // Instantiate the singles trigger plots. - singlesClusterEnergyPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Singles Cluster Energy (%s)", - singlesDir, sourceType[source], resultType[result]), 300, 0.0, 3.0); - singlesHitCountPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Singles Hit Count (%s)", - singlesDir, sourceType[source], resultType[result]), 9, 0.5, 9.5); - singlesTriggerTimePlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Singles Trigger Time (%s)", - singlesDir, sourceType[source], resultType[result]), 100, 0, 400); - - // Instantiate the pair trigger plots. - pairHitCountPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Pair Hit Count (%s)", - pairDir, sourceType[source], resultType[result]), 9, 0.5, 9.5); - pairClusterEnergyPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Pair Cluster Energy (%s)", - pairDir, sourceType[source], resultType[result]), 300, 0.0, 3.0); - pairTimePlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Pair Time Coincidence (%s)", - pairDir, sourceType[source], resultType[result]), 8, 0, 32); - pairSumPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Pair Energy Sum (%s)", - pairDir, sourceType[source], resultType[result]), 300, 0.0, 3.0); + + /** + * Instantiates a new <code>TriggerPlotsModule</code> that will use + * the indicated values for the energy slope conversion factor when + * plotting energy slope values. Plots will be attached to the + * default AIDA instance. + * @param trigger0F - The energy slope conversion factor for the + * first trigger. + * @param trigger1F - The energy slope conversion factor for the + * second trigger. + */ + public TriggerPlotsModule(double trigger0F, double trigger1F) { + // Store the energy slope parameter. + energySlopeParamF = new double[2]; + energySlopeParamF[0] = trigger0F; + energySlopeParamF[1] = trigger1F; + + // Define type string values. + String[] sourceType = { "Recon", "SSP" }; + String[] resultType = { "All", "Matched", "Failed", "Triggered", "No Cuts" }; + + // Instantiate the trigger result plots for each trigger. + for(int triggerNum = 0; triggerNum < 2; triggerNum++) { + // Get the directory for the current triggers. + String pairDir = "Pair Trigger " + triggerNum; + String singlesDir = "Singles Trigger " + triggerNum; + + // Instantiate the trigger result plots for each type of + // trigger source object. + for(int source = 0; source < 2; source++) { + // Instantiate the trigger result plots for each type + // of trigger match result. + for(int result = 0; result < 5; result++) { + // Instantiate the singles trigger plots. + singlesClusterEnergyPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Singles Cluster Energy (%s)", + singlesDir, sourceType[source], resultType[result]), 300, 0.0, 3.0); + singlesHitCountPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Singles Hit Count (%s)", + singlesDir, sourceType[source], resultType[result]), 9, 0.5, 9.5); + singlesTriggerTimePlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Singles Trigger Time (%s)", + singlesDir, sourceType[source], resultType[result]), 100, 0, 400); + + // Instantiate the pair trigger plots. + pairHitCountPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Pair Hit Count (%s)", + pairDir, sourceType[source], resultType[result]), 9, 0.5, 9.5); + pairClusterEnergyPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Pair Cluster Energy (%s)", + pairDir, sourceType[source], resultType[result]), 300, 0.0, 3.0); + pairTimePlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Pair Time Coincidence (%s)", + pairDir, sourceType[source], resultType[result]), 8, 0, 32); + pairSumPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Pair Energy Sum (%s)", + pairDir, sourceType[source], resultType[result]), 300, 0.0, 3.0); pairSumEnergiesPlot[triggerNum][source][result] = aida.histogram2D(String.format("%s/%s/Pair 2D Energy Sum (%s)", pairDir, sourceType[source], resultType[result]), 300, 0.0, 3.0, 300, 0.0, 3.0); - pairDiffPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Pair Energy Difference (%s)", - pairDir, sourceType[source], resultType[result]), 300, 0.0, 3.0); - pairSlopePlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Pair Energy Slope (%s)", - pairDir, sourceType[source], resultType[result]), 300, 0.0, 3.0); - pairCoplanarityPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Pair Coplanarity (%s)", - pairDir, sourceType[source], resultType[result]), 180, 0, 180); - pairTriggerTimePlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Pair Trigger Time (%s)", - pairDir, sourceType[source], resultType[result]), 100, 0, 400); - } - } - - // Instantiate the Møller plots. - møllerHitCountPlot[triggerNum] = aida.histogram1D(String.format("%s/Møller/Møller-like Pair Hit Count", - pairDir), 9, 0.5, 9.5); - møllerClusterEnergyPlot[triggerNum] = aida.histogram1D(String.format("%s/Møller/Møller-like Pair Cluster Energy", - pairDir), 300, 0.0, 3.0); - møllerTimePlot[triggerNum] = aida.histogram1D(String.format("%s/Møller/Møller-like Pair Time Coincidence", - pairDir), 8, 0, 32); - møllerSumPlot[triggerNum] = aida.histogram1D(String.format("%s/Møller/Møller-like Pair Energy Sum", - pairDir), 300, 0.0, 3.0); - møllerSumEnergiesPlot[triggerNum] = aida.histogram2D(String.format("%s/Møller/Møller-like Pair 2D Energy Sum", + pairDiffPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Pair Energy Difference (%s)", + pairDir, sourceType[source], resultType[result]), 300, 0.0, 3.0); + pairSlopePlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Pair Energy Slope (%s)", + pairDir, sourceType[source], resultType[result]), 300, 0.0, 3.0); + pairCoplanarityPlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Pair Coplanarity (%s)", + pairDir, sourceType[source], resultType[result]), 180, 0, 180); + pairTriggerTimePlot[triggerNum][source][result] = aida.histogram1D(String.format("%s/%s/Pair Trigger Time (%s)", + pairDir, sourceType[source], resultType[result]), 100, 0, 400); + } + } + + // Instantiate the Møller plots. + møllerHitCountPlot[triggerNum] = aida.histogram1D(String.format("%s/Møller/Møller-like Pair Hit Count", + pairDir), 9, 0.5, 9.5); + møllerClusterEnergyPlot[triggerNum] = aida.histogram1D(String.format("%s/Møller/Møller-like Pair Cluster Energy", + pairDir), 300, 0.0, 3.0); + møllerTimePlot[triggerNum] = aida.histogram1D(String.format("%s/Møller/Møller-like Pair Time Coincidence", + pairDir), 8, 0, 32); + møllerSumPlot[triggerNum] = aida.histogram1D(String.format("%s/Møller/Møller-like Pair Energy Sum", + pairDir), 300, 0.0, 3.0); + møllerSumEnergiesPlot[triggerNum] = aida.histogram2D(String.format("%s/Møller/Møller-like Pair 2D Energy Sum", pairDir), 300, 0.0, 3.0, 300, 0.0, 3.0); møllerDiffPlot[triggerNum] = aida.histogram1D(String.format("%s/Møller/Møller-like Pair Energy Difference", - pairDir), 300, 0.0, 3.0); + pairDir), 300, 0.0, 3.0); møllerSlopePlot[triggerNum] = aida.histogram1D(String.format("%s/Møller/Møller-like Pair Energy Slope", - pairDir), 300, 0.0, 3.0); + pairDir), 300, 0.0, 3.0); møllerCoplanarityPlot[triggerNum] = aida.histogram1D(String.format("%s/Møller/Møller-like Pair Coplanarity", - pairDir), 180, 0, 180); + pairDir), 180, 0, 180); møllerTriggerTimePlot[triggerNum] = aida.histogram1D(String.format("%s/Møller/Møller-like Pair Trigger Time", - pairDir), 100, 0, 400); + pairDir), 100, 0, 400); møllerPositionPlot[triggerNum] = aida.histogram2D(String.format("%s/Møller/Møller-like Pair Position", - pairDir), 46, -23, 23, 11, -5.5, 5.5); + pairDir), 46, -23, 23, 11, -5.5, 5.5); // Instantiate the trident plots. tridentHitCountPlot[triggerNum] = aida.histogram1D(String.format("%s/Trident/Trident-like Pair Hit Count", - singlesDir), 9, 0.5, 9.5); - tridentClusterEnergyPlot[triggerNum] = aida.histogram1D(String.format("%s/Trident/Trident-like Pair Cluster Energy", - singlesDir), 300, 0.0, 3.0); + singlesDir), 9, 0.5, 9.5); + tridentClusterEnergyPlot[triggerNum] = aida.histogram1D(String.format("%s/Trident/Trident-like Pair Cluster Energy", + singlesDir), 300, 0.0, 3.0); tridentPositionPlot[triggerNum] = aida.histogram2D(String.format("%s/Trident/Trident-like Pair Position", - singlesDir), 46, -23, 23, 11, -5.5, 5.5); - } - } - - /** - * Populates the "failed" plots of the appropriate type with the - * cut results from the argument trigger. - * @param trigger - The trigger from which to populate the plots. - */ - public void failedTrigger(Trigger<?> trigger) { - processTrigger(trigger, FAILED); - } - - /** - * Populates the "matched" plots of the appropriate type with the - * cut results from the argument trigger. - * @param trigger - The trigger from which to populate the plots. - */ - public void matchedTrigger(Trigger<?> trigger) { - processTrigger(trigger, MATCHED); - } - - /** - * Populates the "triggered" plots of the appropriate type with the - * cut results from the argument trigger. - * @param trigger - The trigger from which to populate the plots. - */ - public void passedTrigger(Trigger<?> trigger) { - processTrigger(trigger, TRIGGERED); - } - - /** - * Indicates that a cluster was seen by a trigger and adds it to - * the "no cuts" plots. - * @param triggerNum - The number of the trigger. - * @param cluster - The cluster that was seen. - */ - public void sawCluster(int triggerNum, Cluster cluster) { - processSingles(triggerNum, NO_CUTS, cluster); - } - - /** - * Indicates that a cluster was seen by a trigger and adds it to - * the "no cuts" plots. - * @param triggerNum - The number of the trigger. - * @param cluster - The cluster that was seen. - */ - public void sawCluster(int triggerNum, SSPCluster cluster) { - processSingles(triggerNum, NO_CUTS, cluster); - } - - /** - * Indicates that a cluster pair was seen by a trigger and adds it - * to the "no cuts" plots. - * @param triggerNum - The number of the trigger. - * @param pair - The cluster pair that was seen. - */ - public void sawPair(int triggerNum, Cluster[] pair) { - processPair(triggerNum, NO_CUTS, pair); - } - - /** - * Indicates that a cluster pair was seen by a trigger and adds it - * to the "no cuts" plots. - * @param triggerNum - The number of the trigger. - * @param pair - The cluster pair that was seen. - */ - public void sawPair(int triggerNum, SSPCluster[] pair) { - processPair(triggerNum, NO_CUTS, pair); - } - - /** - * Populates the "all" plots of the appropriate type with the cut - * results from the argument trigger. - * @param trigger - The trigger from which to populate the plots. - */ - public void sawTrigger(Trigger<?> trigger) { - processTrigger(trigger, ALL); - } - - /** - * Sets the energy slope conversion factor to be used to calculate - * the energy slope value for plots. - * @param triggerNum - The trigger for which the conversion factor - * should be used. - * @param value - The conversion factor in units of GeV/mm. - */ - public void setEnergySlopeParamF(int triggerNum, double value) { - // Make sure that the trigger number is valid. - if(triggerNum < 0 || triggerNum > 1) { - throw new IllegalArgumentException(String.format("Trigger number %d is not valid.", triggerNum)); - } - - // Set the parameter. - energySlopeParamF[triggerNum] = value; - } - - /** - * Populates the indicated type of plots of the appropriate type - * for the argument trigger. - * @param trigger - The trigger from which to populate the plots. - * @param plotType - The type of plot to populate. This must be one - * of <code>ALL</code>, <code>MATCHED</code>, or <code>FAILED</code>. - */ - private void processTrigger(Trigger<?> trigger, int plotType) { - // Get the trigger number and source. - Object source = trigger.getTriggerSource(); - int triggerNum = trigger.getTriggerNumber(); - - // Populate the plots using the appropriate method. - if(source instanceof Cluster) { - processSingles(triggerNum, plotType, (Cluster) source); - } - else if(source instanceof SSPCluster) { - processSingles(triggerNum, plotType, (SSPCluster) source); - } - else if(source instanceof Cluster[]) { - processPair(triggerNum, plotType, (Cluster[]) source); - } - else if(source instanceof SSPCluster[]) { - processPair(triggerNum, plotType, (SSPCluster[]) source); - } - - // If the trigger source is unsupported, produce an error. - else { - throw new IllegalArgumentException(String.format("Trigger source \"%s\" is not supported.", source.getClass().getSimpleName())); - } - } - - /** - * Populates the trigger singles plots for the indicated type for - * reconstructed clusters. - * @param triggerNum - The trigger number of the source trigger. - * @param plotType - The type of plot to populate. This must be one - * of <code>ALL</code>, <code>MATCHED</code>, or <code>FAILED</code>. - * @param pair - The triggering cluster. - */ - private void processSingles(int triggerNum, int plotType, Cluster cluster) { - // Fill the cluster singles plots. - singlesHitCountPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueClusterHitCount(cluster)); - singlesClusterEnergyPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueClusterTotalEnergy(cluster)); - singlesTriggerTimePlot[triggerNum][RECON][plotType].fill(cluster.getCalorimeterHits().get(0).getTime()); - } - - /** - * Populates the trigger singles plots for the indicated type for SSP - * clusters. - * @param triggerNum - The trigger number of the source trigger. - * @param plotType - The type of plot to populate. This must be one - * of <code>ALL</code>, <code>MATCHED</code>, or <code>FAILED</code>. - * @param pair - The triggering cluster. - */ - private void processSingles(int triggerNum, int plotType, SSPCluster cluster) { - // Fill the cluster singles plots. - singlesHitCountPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueClusterHitCount(cluster)); - singlesClusterEnergyPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueClusterTotalEnergy(cluster)); - singlesTriggerTimePlot[triggerNum][SSP][plotType].fill(cluster.getTime()); - - // Check if this cluster is "trident-like." - // TODO: Define "trident-like." - boolean processTrident = false; - - // If this is a trident-like event, add it to the trident plots. - if(processTrident) { - tridentHitCountPlot[triggerNum].fill(TriggerModule.getValueClusterHitCount(cluster)); - tridentClusterEnergyPlot[triggerNum].fill(TriggerModule.getValueClusterTotalEnergy(cluster)); - tridentPositionPlot[triggerNum].fill(cluster.getXIndex() > 0 ? cluster.getXIndex() - 1 : cluster.getXIndex(), cluster.getYIndex()); - } - } - - /** - * Populates the trigger pair plots for the indicated type for - * reconstructed cluster pairs. - * @param triggerNum - The trigger number of the source trigger. - * @param plotType - The type of plot to populate. This must be one - * of <code>ALL</code>, <code>MATCHED</code>, or <code>FAILED</code>. - * @param pair - The triggering pair. - */ - private void processPair(int triggerNum, int plotType, Cluster[] pair) { - // Fill the cluster singles plots. - pairHitCountPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueClusterHitCount(pair[0])); - pairHitCountPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueClusterHitCount(pair[1])); - pairClusterEnergyPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueClusterTotalEnergy(pair[0])); - pairClusterEnergyPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueClusterTotalEnergy(pair[1])); - pairTriggerTimePlot[triggerNum][RECON][plotType].fill(pair[0].getCalorimeterHits().get(0).getTime()); - pairTriggerTimePlot[triggerNum][RECON][plotType].fill(pair[1].getCalorimeterHits().get(0).getTime()); - - // Fill the cluster pair plots. - pairTimePlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueTimeCoincidence(pair)); - pairSumPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueEnergySum(pair)); + singlesDir), 46, -23, 23, 11, -5.5, 5.5); + } + } + + /** + * Populates the "failed" plots of the appropriate type with the + * cut results from the argument trigger. + * @param trigger - The trigger from which to populate the plots. + */ + public void failedTrigger(Trigger<?> trigger) { + processTrigger(trigger, FAILED); + } + + /** + * Populates the "matched" plots of the appropriate type with the + * cut results from the argument trigger. + * @param trigger - The trigger from which to populate the plots. + */ + public void matchedTrigger(Trigger<?> trigger) { + processTrigger(trigger, MATCHED); + } + + /** + * Populates the "triggered" plots of the appropriate type with the + * cut results from the argument trigger. + * @param trigger - The trigger from which to populate the plots. + */ + public void passedTrigger(Trigger<?> trigger) { + processTrigger(trigger, TRIGGERED); + } + + /** + * Indicates that a cluster was seen by a trigger and adds it to + * the "no cuts" plots. + * @param triggerNum - The number of the trigger. + * @param cluster - The cluster that was seen. + */ + public void sawCluster(int triggerNum, Cluster cluster) { + processSingles(triggerNum, NO_CUTS, cluster); + } + + /** + * Indicates that a cluster was seen by a trigger and adds it to + * the "no cuts" plots. + * @param triggerNum - The number of the trigger. + * @param cluster - The cluster that was seen. + */ + public void sawCluster(int triggerNum, SSPCluster cluster) { + processSingles(triggerNum, NO_CUTS, cluster); + } + + /** + * Indicates that a cluster pair was seen by a trigger and adds it + * to the "no cuts" plots. + * @param triggerNum - The number of the trigger. + * @param pair - The cluster pair that was seen. + */ + public void sawPair(int triggerNum, Cluster[] pair) { + processPair(triggerNum, NO_CUTS, pair); + } + + /** + * Indicates that a cluster pair was seen by a trigger and adds it + * to the "no cuts" plots. + * @param triggerNum - The number of the trigger. + * @param pair - The cluster pair that was seen. + */ + public void sawPair(int triggerNum, SSPCluster[] pair) { + processPair(triggerNum, NO_CUTS, pair); + } + + /** + * Populates the "all" plots of the appropriate type with the cut + * results from the argument trigger. + * @param trigger - The trigger from which to populate the plots. + */ + public void sawTrigger(Trigger<?> trigger) { + processTrigger(trigger, ALL); + } + + /** + * Sets the energy slope conversion factor to be used to calculate + * the energy slope value for plots. + * @param triggerNum - The trigger for which the conversion factor + * should be used. + * @param value - The conversion factor in units of GeV/mm. + */ + public void setEnergySlopeParamF(int triggerNum, double value) { + // Make sure that the trigger number is valid. + if(triggerNum < 0 || triggerNum > 1) { + throw new IllegalArgumentException(String.format("Trigger number %d is not valid.", triggerNum)); + } + + // Set the parameter. + energySlopeParamF[triggerNum] = value; + } + + /** + * Populates the indicated type of plots of the appropriate type + * for the argument trigger. + * @param trigger - The trigger from which to populate the plots. + * @param plotType - The type of plot to populate. This must be one + * of <code>ALL</code>, <code>MATCHED</code>, or <code>FAILED</code>. + */ + private void processTrigger(Trigger<?> trigger, int plotType) { + // Get the trigger number and source. + Object source = trigger.getTriggerSource(); + int triggerNum = trigger.getTriggerNumber(); + + // Populate the plots using the appropriate method. + if(source instanceof Cluster) { + processSingles(triggerNum, plotType, (Cluster) source); + } + else if(source instanceof SSPCluster) { + processSingles(triggerNum, plotType, (SSPCluster) source); + } + else if(source instanceof Cluster[]) { + processPair(triggerNum, plotType, (Cluster[]) source); + } + else if(source instanceof SSPCluster[]) { + processPair(triggerNum, plotType, (SSPCluster[]) source); + } + + // If the trigger source is unsupported, produce an error. + else { + throw new IllegalArgumentException(String.format("Trigger source \"%s\" is not supported.", source.getClass().getSimpleName())); + } + } + + /** + * Populates the trigger singles plots for the indicated type for + * reconstructed clusters. + * @param triggerNum - The trigger number of the source trigger. + * @param plotType - The type of plot to populate. This must be one + * of <code>ALL</code>, <code>MATCHED</code>, or <code>FAILED</code>. + * @param pair - The triggering cluster. + */ + private void processSingles(int triggerNum, int plotType, Cluster cluster) { + // Fill the cluster singles plots. + singlesHitCountPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueClusterHitCount(cluster)); + singlesClusterEnergyPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueClusterTotalEnergy(cluster)); + singlesTriggerTimePlot[triggerNum][RECON][plotType].fill(cluster.getCalorimeterHits().get(0).getTime()); + } + + /** + * Populates the trigger singles plots for the indicated type for SSP + * clusters. + * @param triggerNum - The trigger number of the source trigger. + * @param plotType - The type of plot to populate. This must be one + * of <code>ALL</code>, <code>MATCHED</code>, or <code>FAILED</code>. + * @param pair - The triggering cluster. + */ + private void processSingles(int triggerNum, int plotType, SSPCluster cluster) { + // Fill the cluster singles plots. + singlesHitCountPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueClusterHitCount(cluster)); + singlesClusterEnergyPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueClusterTotalEnergy(cluster)); + singlesTriggerTimePlot[triggerNum][SSP][plotType].fill(cluster.getTime()); + + // Check if this cluster is "trident-like." + // TODO: Define "trident-like." + boolean processTrident = false; + + // If this is a trident-like event, add it to the trident plots. + if(processTrident) { + tridentHitCountPlot[triggerNum].fill(TriggerModule.getValueClusterHitCount(cluster)); + tridentClusterEnergyPlot[triggerNum].fill(TriggerModule.getValueClusterTotalEnergy(cluster)); + tridentPositionPlot[triggerNum].fill(cluster.getXIndex() > 0 ? cluster.getXIndex() - 1 : cluster.getXIndex(), cluster.getYIndex()); + } + } + + /** + * Populates the trigger pair plots for the indicated type for + * reconstructed cluster pairs. + * @param triggerNum - The trigger number of the source trigger. + * @param plotType - The type of plot to populate. This must be one + * of <code>ALL</code>, <code>MATCHED</code>, or <code>FAILED</code>. + * @param pair - The triggering pair. + */ + private void processPair(int triggerNum, int plotType, Cluster[] pair) { + // Fill the cluster singles plots. + pairHitCountPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueClusterHitCount(pair[0])); + pairHitCountPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueClusterHitCount(pair[1])); + pairClusterEnergyPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueClusterTotalEnergy(pair[0])); + pairClusterEnergyPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueClusterTotalEnergy(pair[1])); + pairTriggerTimePlot[triggerNum][RECON][plotType].fill(pair[0].getCalorimeterHits().get(0).getTime()); + pairTriggerTimePlot[triggerNum][RECON][plotType].fill(pair[1].getCalorimeterHits().get(0).getTime()); + + // Fill the cluster pair plots. + pairTimePlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueTimeCoincidence(pair)); + pairSumPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueEnergySum(pair)); pairSumEnergiesPlot[triggerNum][RECON][plotType].fill(pair[0].getEnergy(), pair[1].getEnergy()); - pairDiffPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueEnergyDifference(pair)); - pairSlopePlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueEnergySlope(pair, energySlopeParamF[triggerNum])); - pairCoplanarityPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueCoplanarity(pair)); - } - - /** - * Populates the trigger pair plots for the indicated type for SSP - * cluster pairs. - * @param triggerNum - The trigger number of the source trigger. - * @param plotType - The type of plot to populate. This must be one - * of <code>ALL</code>, <code>MATCHED</code>, or <code>FAILED</code>. - * @param pair - The triggering pair. - */ - private void processPair(int triggerNum, int plotType, SSPCluster[] pair) { - // Fill the cluster singles plots. - pairHitCountPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueClusterHitCount(pair[0])); - pairHitCountPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueClusterHitCount(pair[1])); - pairClusterEnergyPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueClusterTotalEnergy(pair[0])); - pairClusterEnergyPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueClusterTotalEnergy(pair[1])); - pairTriggerTimePlot[triggerNum][SSP][plotType].fill(pair[0].getTime()); - pairTriggerTimePlot[triggerNum][SSP][plotType].fill(pair[1].getTime()); - - // Fill the cluster pair plots. - pairTimePlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueTimeCoincidence(pair)); - pairSumPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueEnergySum(pair)); + pairDiffPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueEnergyDifference(pair)); + pairSlopePlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueEnergySlope(pair, energySlopeParamF[triggerNum])); + pairCoplanarityPlot[triggerNum][RECON][plotType].fill(TriggerModule.getValueCoplanarity(pair)); + } + + /** + * Populates the trigger pair plots for the indicated type for SSP + * cluster pairs. + * @param triggerNum - The trigger number of the source trigger. + * @param plotType - The type of plot to populate. This must be one + * of <code>ALL</code>, <code>MATCHED</code>, or <code>FAILED</code>. + * @param pair - The triggering pair. + */ + private void processPair(int triggerNum, int plotType, SSPCluster[] pair) { + // Fill the cluster singles plots. + pairHitCountPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueClusterHitCount(pair[0])); + pairHitCountPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueClusterHitCount(pair[1])); + pairClusterEnergyPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueClusterTotalEnergy(pair[0])); + pairClusterEnergyPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueClusterTotalEnergy(pair[1])); + pairTriggerTimePlot[triggerNum][SSP][plotType].fill(pair[0].getTime()); + pairTriggerTimePlot[triggerNum][SSP][plotType].fill(pair[1].getTime()); + + // Fill the cluster pair plots. + pairTimePlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueTimeCoincidence(pair)); + pairSumPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueEnergySum(pair)); pairSumEnergiesPlot[triggerNum][SSP][plotType].fill(pair[0].getEnergy(), pair[1].getEnergy()); - pairDiffPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueEnergyDifference(pair)); - pairSlopePlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueEnergySlope(pair, energySlopeParamF[triggerNum])); - pairCoplanarityPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueCoplanarity(pair)); - - // Check if this pair is "Møller-like." - boolean processMøller = TriggerModule.getValueEnergySum(pair) >= MÃLLER_SUM_THRESHOLD; - - // If the pair is Møller-like, populate the Møller plots. - if(processMøller) { - // Fill the cluster singles plots. - møllerHitCountPlot[triggerNum].fill(TriggerModule.getValueClusterHitCount(pair[0])); - møllerHitCountPlot[triggerNum].fill(TriggerModule.getValueClusterHitCount(pair[1])); - møllerClusterEnergyPlot[triggerNum].fill(TriggerModule.getValueClusterTotalEnergy(pair[0])); - møllerClusterEnergyPlot[triggerNum].fill(TriggerModule.getValueClusterTotalEnergy(pair[1])); - møllerTriggerTimePlot[triggerNum].fill(pair[0].getTime()); - møllerTriggerTimePlot[triggerNum].fill(pair[1].getTime()); - møllerPositionPlot[triggerNum].fill(pair[0].getXIndex() > 0 ? pair[0].getXIndex() - 1 : pair[0].getXIndex(), pair[0].getYIndex()); - møllerPositionPlot[triggerNum].fill(pair[1].getXIndex() > 0 ? pair[1].getXIndex() - 1 : pair[1].getXIndex(), pair[1].getYIndex()); - - // Fill the cluster pair plots. - møllerTimePlot[triggerNum].fill(TriggerModule.getValueTimeCoincidence(pair)); - møllerSumPlot[triggerNum].fill(TriggerModule.getValueEnergySum(pair)); - møllerSumEnergiesPlot[triggerNum].fill(pair[0].getEnergy(), pair[1].getEnergy()); - møllerDiffPlot[triggerNum].fill(TriggerModule.getValueEnergyDifference(pair)); - møllerSlopePlot[triggerNum].fill(TriggerModule.getValueEnergySlope(pair, energySlopeParamF[triggerNum])); - møllerCoplanarityPlot[triggerNum].fill(TriggerModule.getValueCoplanarity(pair)); - } - } + pairDiffPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueEnergyDifference(pair)); + pairSlopePlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueEnergySlope(pair, energySlopeParamF[triggerNum])); + pairCoplanarityPlot[triggerNum][SSP][plotType].fill(TriggerModule.getValueCoplanarity(pair)); + + // Check if this pair is "Møller-like." + boolean processMøller = TriggerModule.getValueEnergySum(pair) >= MÃLLER_SUM_THRESHOLD; + + // If the pair is Møller-like, populate the Møller plots. + if(processMøller) { + // Fill the cluster singles plots. + møllerHitCountPlot[triggerNum].fill(TriggerModule.getValueClusterHitCount(pair[0])); + møllerHitCountPlot[triggerNum].fill(TriggerModule.getValueClusterHitCount(pair[1])); + møllerClusterEnergyPlot[triggerNum].fill(TriggerModule.getValueClusterTotalEnergy(pair[0])); + møllerClusterEnergyPlot[triggerNum].fill(TriggerModule.getValueClusterTotalEnergy(pair[1])); + møllerTriggerTimePlot[triggerNum].fill(pair[0].getTime()); + møllerTriggerTimePlot[triggerNum].fill(pair[1].getTime()); + møllerPositionPlot[triggerNum].fill(pair[0].getXIndex() > 0 ? pair[0].getXIndex() - 1 : pair[0].getXIndex(), pair[0].getYIndex()); + møllerPositionPlot[triggerNum].fill(pair[1].getXIndex() > 0 ? pair[1].getXIndex() - 1 : pair[1].getXIndex(), pair[1].getYIndex()); + + // Fill the cluster pair plots. + møllerTimePlot[triggerNum].fill(TriggerModule.getValueTimeCoincidence(pair)); + møllerSumPlot[triggerNum].fill(TriggerModule.getValueEnergySum(pair)); + møllerSumEnergiesPlot[triggerNum].fill(pair[0].getEnergy(), pair[1].getEnergy()); + møllerDiffPlot[triggerNum].fill(TriggerModule.getValueEnergyDifference(pair)); + møllerSlopePlot[triggerNum].fill(TriggerModule.getValueEnergySlope(pair, energySlopeParamF[triggerNum])); + møllerCoplanarityPlot[triggerNum].fill(TriggerModule.getValueCoplanarity(pair)); + } + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/ComponentUtils.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/ComponentUtils.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/ComponentUtils.java Wed Mar 9 11:43:24 2016 @@ -11,116 +11,116 @@ * @author Kyle McCarty <[log in to unmask]> */ public class ComponentUtils { - /** The default spacing used between a horizontal edge of one - * component and the horizontal edge of another. */ - public static final int hinternal = 10; - /** The default spacing used between a vertical edge of one - * component and the vertical edge of another. */ - public static final int vinternal = 10; - /** The default spacing used between a horizontal edge of one - * component and the edge of its parent component. */ - public static final int hexternal = 0; - /** The default spacing used between a vertical edge of one - * component and the edge of its parent component. */ - public static final int vexternal = 0; - - /** - * Gets a <code>String</code> composed of a number of instances of - * character <code>c</code> equal to <code>number</code>. - * @param c - The character to repeat. - * @param number - The number of repetitions. - * @return Returns the repeated character as a <code>String</code>. - */ - public static final String getChars(char c, int number) { - // Create a buffer to store the characters in. - StringBuffer s = new StringBuffer(); - - // Add the indicated number of instances. - for(int i = 0; i < number; i++) { - s.append(c); - } - - // Return the string. - return s.toString(); - } - - /** - * Gets the number of digits in the base-10 String representation - * of an integer primitive. Negative signs are not included in the - * digit count. - * @param value - The value of which to obtain the length. - * @return Returns the number of digits in the String representation - * of the argument value. - */ - public static final int getDigits(int value) { - return TriggerDiagnosticUtil.getDigits(value); - } - - /** - * Gets the maximum value from a list of values. - * @param values - The values to compare. - * @return Returns the largest of the argument values. - * @throws IllegalArgumentException Occurs if no values are given. - */ - public static final int max(int... values) throws IllegalArgumentException { - // Throw an error if no arguments are provided. - if(values == null || values.length == 0) { - throw new IllegalArgumentException("Can not determine maximum value from a list of 0 values."); - } - - // If there is only one value, return it. - if(values.length == 1) { return values[0]; } - - // Otherwise, get the largest value. - int largest = Integer.MIN_VALUE; - for(int value : values) { - if(value > largest) { largest = value; } - } - - // Return the result. - return largest; - } - - /** - * Gets the x-coordinate immediately to the right of the given - * component. - * @param c - The component of which to find the edge. - * @return Returns the x-coordinate as an <code>int</code> value. - */ - public static final int getNextX(Component c) { - return getNextX(c, 0); - } - - /** - * Gets the x-coordinate a given distance to the right edge of the - * argument component. - * @param c - The component of which to find the edge. - * @param spacing - The additional spacing past the edge of the - * component to add. - * @return Returns the x-coordinate as an <code>int</code> value. - */ - public static final int getNextX(Component c, int spacing) { - return c.getX() + c.getWidth() + spacing; - } - - /** - * Gets the y-coordinate immediately below the given component. - * @param c - The component of which to find the edge. - * @return Returns the y-coordinate as an <code>int</code> value. - */ - public static final int getNextY(Component c) { - return getNextY(c, 0); - } - - /** - * Gets the y-coordinate a given distance below the bottom edge - * of the argument component. - * @param c - The component of which to find the edge. - * @param spacing - The additional spacing past the edge of the - * component to add. - * @return Returns the y-coordinate as an <code>int</code> value. - */ - public static final int getNextY(Component c, int spacing) { - return c.getY() + c.getHeight() + spacing; - } + /** The default spacing used between a horizontal edge of one + * component and the horizontal edge of another. */ + public static final int hinternal = 10; + /** The default spacing used between a vertical edge of one + * component and the vertical edge of another. */ + public static final int vinternal = 10; + /** The default spacing used between a horizontal edge of one + * component and the edge of its parent component. */ + public static final int hexternal = 0; + /** The default spacing used between a vertical edge of one + * component and the edge of its parent component. */ + public static final int vexternal = 0; + + /** + * Gets a <code>String</code> composed of a number of instances of + * character <code>c</code> equal to <code>number</code>. + * @param c - The character to repeat. + * @param number - The number of repetitions. + * @return Returns the repeated character as a <code>String</code>. + */ + public static final String getChars(char c, int number) { + // Create a buffer to store the characters in. + StringBuffer s = new StringBuffer(); + + // Add the indicated number of instances. + for(int i = 0; i < number; i++) { + s.append(c); + } + + // Return the string. + return s.toString(); + } + + /** + * Gets the number of digits in the base-10 String representation + * of an integer primitive. Negative signs are not included in the + * digit count. + * @param value - The value of which to obtain the length. + * @return Returns the number of digits in the String representation + * of the argument value. + */ + public static final int getDigits(int value) { + return TriggerDiagnosticUtil.getDigits(value); + } + + /** + * Gets the maximum value from a list of values. + * @param values - The values to compare. + * @return Returns the largest of the argument values. + * @throws IllegalArgumentException Occurs if no values are given. + */ + public static final int max(int... values) throws IllegalArgumentException { + // Throw an error if no arguments are provided. + if(values == null || values.length == 0) { + throw new IllegalArgumentException("Can not determine maximum value from a list of 0 values."); + } + + // If there is only one value, return it. + if(values.length == 1) { return values[0]; } + + // Otherwise, get the largest value. + int largest = Integer.MIN_VALUE; + for(int value : values) { + if(value > largest) { largest = value; } + } + + // Return the result. + return largest; + } + + /** + * Gets the x-coordinate immediately to the right of the given + * component. + * @param c - The component of which to find the edge. + * @return Returns the x-coordinate as an <code>int</code> value. + */ + public static final int getNextX(Component c) { + return getNextX(c, 0); + } + + /** + * Gets the x-coordinate a given distance to the right edge of the + * argument component. + * @param c - The component of which to find the edge. + * @param spacing - The additional spacing past the edge of the + * component to add. + * @return Returns the x-coordinate as an <code>int</code> value. + */ + public static final int getNextX(Component c, int spacing) { + return c.getX() + c.getWidth() + spacing; + } + + /** + * Gets the y-coordinate immediately below the given component. + * @param c - The component of which to find the edge. + * @return Returns the y-coordinate as an <code>int</code> value. + */ + public static final int getNextY(Component c) { + return getNextY(c, 0); + } + + /** + * Gets the y-coordinate a given distance below the bottom edge + * of the argument component. + * @param c - The component of which to find the edge. + * @param spacing - The additional spacing past the edge of the + * component to add. + * @return Returns the y-coordinate as an <code>int</code> value. + */ + public static final int getNextY(Component c, int spacing) { + return c.getY() + c.getHeight() + spacing; + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/OutputLogger.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/OutputLogger.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/OutputLogger.java Wed Mar 9 11:43:24 2016 @@ -3,28 +3,28 @@ public class OutputLogger { private static StringBuffer outputBuffer = new StringBuffer(); - public static final void printf(String text, Object... args) { - outputBuffer.append(String.format(text, args)); - } - - public static final void println() { printf(String.format("%n")); } - - public static final void println(String text) { printf(String.format("%s%n", text)); } - - public static final void print(String text) { printf(text); } - - public static final void printLog() { - System.out.println(outputBuffer.toString()); - clearLog(); - } - - public static final void printNewLine() { println(); } - - public static final void printNewLine(int quantity) { - for(int i = 0; i < quantity; i++) { println(); } - } - - public static final void clearLog() { - outputBuffer = new StringBuffer(); - } + public static final void printf(String text, Object... args) { + outputBuffer.append(String.format(text, args)); + } + + public static final void println() { printf(String.format("%n")); } + + public static final void println(String text) { printf(String.format("%s%n", text)); } + + public static final void print(String text) { printf(text); } + + public static final void printLog() { + System.out.println(outputBuffer.toString()); + clearLog(); + } + + public static final void printNewLine() { println(); } + + public static final void printNewLine(int quantity) { + for(int i = 0; i < quantity; i++) { println(); } + } + + public static final void clearLog() { + outputBuffer = new StringBuffer(); + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/Pair.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/Pair.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/Pair.java Wed Mar 9 11:43:24 2016 @@ -8,32 +8,32 @@ * @param <F> - The object type of the second element in the pair. */ public class Pair<E, F> { - private final E firstObject; - private final F secondObject; - - /** - * Creates a pair of the two indicated objects. - * @param firstObject - The first object. - * @param secondObject - The second object. - */ - public Pair(E firstElement, F secondElement) { - this.firstObject = firstElement; - this.secondObject = secondElement; - } - - /** - * Gets the first element of the pair. - * @return Returns the first element. - */ - public E getFirstElement() { - return firstObject; - } - - /** - * Gets the second element of the pair. - * @return Returns the second element. - */ - public F getSecondElement() { - return secondObject; - } + private final E firstObject; + private final F secondObject; + + /** + * Creates a pair of the two indicated objects. + * @param firstObject - The first object. + * @param secondObject - The second object. + */ + public Pair(E firstElement, F secondElement) { + this.firstObject = firstElement; + this.secondObject = secondElement; + } + + /** + * Gets the first element of the pair. + * @return Returns the first element. + */ + public E getFirstElement() { + return firstObject; + } + + /** + * Gets the second element of the pair. + * @return Returns the second element. + */ + public F getSecondElement() { + return secondObject; + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/PairTrigger.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/PairTrigger.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/PairTrigger.java Wed Mar 9 11:43:24 2016 @@ -3,164 +3,164 @@ import org.hps.record.triggerbank.TriggerModule; public class PairTrigger<E> extends SinglesTrigger<E> { - // Define the supported trigger cuts. - private static final String PAIR_ENERGY_SUM_LOW = TriggerModule.PAIR_ENERGY_SUM_LOW; - private static final String PAIR_ENERGY_SUM_HIGH = TriggerModule.PAIR_ENERGY_SUM_HIGH; - private static final String PAIR_ENERGY_DIFFERENCE_HIGH = TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH; - private static final String PAIR_ENERGY_SLOPE_LOW = TriggerModule.PAIR_ENERGY_SLOPE_LOW; - private static final String PAIR_COPLANARITY_HIGH = TriggerModule.PAIR_COPLANARITY_HIGH; + // Define the supported trigger cuts. + private static final String PAIR_ENERGY_SUM_LOW = TriggerModule.PAIR_ENERGY_SUM_LOW; + private static final String PAIR_ENERGY_SUM_HIGH = TriggerModule.PAIR_ENERGY_SUM_HIGH; + private static final String PAIR_ENERGY_DIFFERENCE_HIGH = TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH; + private static final String PAIR_ENERGY_SLOPE_LOW = TriggerModule.PAIR_ENERGY_SLOPE_LOW; + private static final String PAIR_COPLANARITY_HIGH = TriggerModule.PAIR_COPLANARITY_HIGH; private static final String PAIR_TIME_COINCIDENCE = "pairTimeCoincidence"; - - /** - * Instantiates a new <code>PairTrigger</code> with all cut - * states set to <code>false</code> and with the trigger source - * defined according to the specified object. - * @param source - The object from which the trigger cut states - * are derived. - */ - public PairTrigger(E source, int triggerNum) { - // Instantiate the superclass. - super(source, triggerNum); - - // Add the supported cuts types. - addValidCut(PAIR_ENERGY_SUM_LOW); - addValidCut(PAIR_ENERGY_SUM_HIGH); - addValidCut(PAIR_ENERGY_DIFFERENCE_HIGH); - addValidCut(PAIR_ENERGY_SLOPE_LOW); - addValidCut(PAIR_COPLANARITY_HIGH); - addValidCut(PAIR_TIME_COINCIDENCE); - } - - /** - * Gets whether the pair energy sum lower bound cut was met. - * @return Returns <code>true</code> if the cut was met and - * <code>false</code> otherwise. - */ - public boolean getStateEnergySumLow() { - return getCutState(PAIR_ENERGY_SUM_LOW); - } - - /** - * Gets whether the pair energy sum upper bound cut was met. - * @return Returns <code>true</code> if the cut was met and - * <code>false</code> otherwise. - */ - public boolean getStateEnergySumHigh() { - return getCutState(PAIR_ENERGY_SUM_HIGH); - } - - /** - * Gets whether both the pair energy sum upper and lower bound cuts - * were met. - * @return Returns <code>true</code> if the cuts were met and - * <code>false</code> otherwise. - */ - public boolean getStateEnergySum() { - return getCutState(PAIR_ENERGY_SUM_HIGH); - } - - /** - * Gets whether the pair energy difference cut was met. - * @return Returns <code>true</code> if the cut was met and - * <code>false</code> otherwise. - */ - public boolean getStateEnergyDifference() { - return getCutState(PAIR_ENERGY_DIFFERENCE_HIGH); - } - - /** - * Gets whether the pair energy slope cut was met. - * @return Returns <code>true</code> if the cut was met and - * <code>false</code> otherwise. - */ - public boolean getStateEnergySlope() { - return getCutState(PAIR_ENERGY_SLOPE_LOW); - } - - /** - * Gets whether the pair coplanarity cut was met. - * @return Returns <code>true</code> if the cut was met and - * <code>false</code> otherwise. - */ - public boolean getStateCoplanarity() { - return getCutState(PAIR_COPLANARITY_HIGH); - } - - /** - * Gets whether the time coincidence cut was met. - * @return Returns <code>true</code> if the cut was met and - * <code>false</code> otherwise. - */ - public boolean getStateTimeCoincidence() { - return getCutState(PAIR_TIME_COINCIDENCE); - } - - /** - * Sets whether the conditions for the pair energy sum lower bound - * cut were met. - * @param state - <code>true</code> indicates that the cut conditions - * were met and <code>false</code> that they were not. - */ - public void setStateEnergySumLow(boolean state) { - setCutState(PAIR_ENERGY_SUM_LOW, state); - } - - /** - * Sets whether the conditions for the pair energy sum upper bound - * cut were met. - * @param state - <code>true</code> indicates that the cut conditions - * were met and <code>false</code> that they were not. - */ - public void setStateEnergySumHigh(boolean state) { - setCutState(PAIR_ENERGY_SUM_HIGH, state); - } - - /** - * Sets whether the conditions for the pair energy difference cut - * were met. - * @param state - <code>true</code> indicates that the cut conditions - * were met and <code>false</code> that they were not. - */ - public void setStateEnergyDifference(boolean state) { - setCutState(PAIR_ENERGY_DIFFERENCE_HIGH, state); - } - - /** - * Sets whether the conditions for the pair energy slope cut were - * met. - * @param state - <code>true</code> indicates that the cut conditions - * were met and <code>false</code> that they were not. - */ - public void setStateEnergySlope(boolean state) { - setCutState(PAIR_ENERGY_SLOPE_LOW, state); - } - - /** - * Sets whether the conditions for the pair coplanarity cut were - * met. - * @param state - <code>true</code> indicates that the cut conditions - * were met and <code>false</code> that they were not. - */ - public void setStateCoplanarity(boolean state) { - setCutState(PAIR_COPLANARITY_HIGH, state); - } - - /** - * Sets whether the conditions for the time coincidence cut were - * met. - * @param state - <code>true</code> indicates that the cut conditions - * were met and <code>false</code> that they were not. - */ - public void setStateTimeCoincidence(boolean state) { - setCutState(PAIR_TIME_COINCIDENCE, state); - } - - @Override - public String toString() { - return String.format("EClusterLow: %d; EClusterHigh %d; HitCount: %d; ESumLow: %d, ESumHigh: %d, EDiff: %d, ESlope: %d, Coplanarity: %d", - getStateClusterEnergyLow() ? 1 : 0, getStateClusterEnergyHigh() ? 1 : 0, - getStateHitCount() ? 1 : 0, getStateEnergySumLow() ? 1 : 0, - getStateEnergySumHigh() ? 1 : 0, getStateEnergyDifference() ? 1 : 0, - getStateEnergySlope() ? 1 : 0, getStateCoplanarity() ? 1 : 0); - } + + /** + * Instantiates a new <code>PairTrigger</code> with all cut + * states set to <code>false</code> and with the trigger source + * defined according to the specified object. + * @param source - The object from which the trigger cut states + * are derived. + */ + public PairTrigger(E source, int triggerNum) { + // Instantiate the superclass. + super(source, triggerNum); + + // Add the supported cuts types. + addValidCut(PAIR_ENERGY_SUM_LOW); + addValidCut(PAIR_ENERGY_SUM_HIGH); + addValidCut(PAIR_ENERGY_DIFFERENCE_HIGH); + addValidCut(PAIR_ENERGY_SLOPE_LOW); + addValidCut(PAIR_COPLANARITY_HIGH); + addValidCut(PAIR_TIME_COINCIDENCE); + } + + /** + * Gets whether the pair energy sum lower bound cut was met. + * @return Returns <code>true</code> if the cut was met and + * <code>false</code> otherwise. + */ + public boolean getStateEnergySumLow() { + return getCutState(PAIR_ENERGY_SUM_LOW); + } + + /** + * Gets whether the pair energy sum upper bound cut was met. + * @return Returns <code>true</code> if the cut was met and + * <code>false</code> otherwise. + */ + public boolean getStateEnergySumHigh() { + return getCutState(PAIR_ENERGY_SUM_HIGH); + } + + /** + * Gets whether both the pair energy sum upper and lower bound cuts + * were met. + * @return Returns <code>true</code> if the cuts were met and + * <code>false</code> otherwise. + */ + public boolean getStateEnergySum() { + return getCutState(PAIR_ENERGY_SUM_HIGH); + } + + /** + * Gets whether the pair energy difference cut was met. + * @return Returns <code>true</code> if the cut was met and + * <code>false</code> otherwise. + */ + public boolean getStateEnergyDifference() { + return getCutState(PAIR_ENERGY_DIFFERENCE_HIGH); + } + + /** + * Gets whether the pair energy slope cut was met. + * @return Returns <code>true</code> if the cut was met and + * <code>false</code> otherwise. + */ + public boolean getStateEnergySlope() { + return getCutState(PAIR_ENERGY_SLOPE_LOW); + } + + /** + * Gets whether the pair coplanarity cut was met. + * @return Returns <code>true</code> if the cut was met and + * <code>false</code> otherwise. + */ + public boolean getStateCoplanarity() { + return getCutState(PAIR_COPLANARITY_HIGH); + } + + /** + * Gets whether the time coincidence cut was met. + * @return Returns <code>true</code> if the cut was met and + * <code>false</code> otherwise. + */ + public boolean getStateTimeCoincidence() { + return getCutState(PAIR_TIME_COINCIDENCE); + } + + /** + * Sets whether the conditions for the pair energy sum lower bound + * cut were met. + * @param state - <code>true</code> indicates that the cut conditions + * were met and <code>false</code> that they were not. + */ + public void setStateEnergySumLow(boolean state) { + setCutState(PAIR_ENERGY_SUM_LOW, state); + } + + /** + * Sets whether the conditions for the pair energy sum upper bound + * cut were met. + * @param state - <code>true</code> indicates that the cut conditions + * were met and <code>false</code> that they were not. + */ + public void setStateEnergySumHigh(boolean state) { + setCutState(PAIR_ENERGY_SUM_HIGH, state); + } + + /** + * Sets whether the conditions for the pair energy difference cut + * were met. + * @param state - <code>true</code> indicates that the cut conditions + * were met and <code>false</code> that they were not. + */ + public void setStateEnergyDifference(boolean state) { + setCutState(PAIR_ENERGY_DIFFERENCE_HIGH, state); + } + + /** + * Sets whether the conditions for the pair energy slope cut were + * met. + * @param state - <code>true</code> indicates that the cut conditions + * were met and <code>false</code> that they were not. + */ + public void setStateEnergySlope(boolean state) { + setCutState(PAIR_ENERGY_SLOPE_LOW, state); + } + + /** + * Sets whether the conditions for the pair coplanarity cut were + * met. + * @param state - <code>true</code> indicates that the cut conditions + * were met and <code>false</code> that they were not. + */ + public void setStateCoplanarity(boolean state) { + setCutState(PAIR_COPLANARITY_HIGH, state); + } + + /** + * Sets whether the conditions for the time coincidence cut were + * met. + * @param state - <code>true</code> indicates that the cut conditions + * were met and <code>false</code> that they were not. + */ + public void setStateTimeCoincidence(boolean state) { + setCutState(PAIR_TIME_COINCIDENCE, state); + } + + @Override + public String toString() { + return String.format("EClusterLow: %d; EClusterHigh %d; HitCount: %d; ESumLow: %d, ESumHigh: %d, EDiff: %d, ESlope: %d, Coplanarity: %d", + getStateClusterEnergyLow() ? 1 : 0, getStateClusterEnergyHigh() ? 1 : 0, + getStateHitCount() ? 1 : 0, getStateEnergySumLow() ? 1 : 0, + getStateEnergySumHigh() ? 1 : 0, getStateEnergyDifference() ? 1 : 0, + getStateEnergySlope() ? 1 : 0, getStateCoplanarity() ? 1 : 0); + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/SinglesTrigger.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/SinglesTrigger.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/SinglesTrigger.java Wed Mar 9 11:43:24 2016 @@ -3,151 +3,151 @@ import org.hps.record.triggerbank.TriggerModule; public class SinglesTrigger<E> extends Trigger<E> { - // Define the supported trigger cuts. - private static final String CLUSTER_HIT_COUNT_LOW = TriggerModule.CLUSTER_HIT_COUNT_LOW; - private static final String CLUSTER_SEED_ENERGY_LOW = TriggerModule.CLUSTER_SEED_ENERGY_LOW; - private static final String CLUSTER_SEED_ENERGY_HIGH = TriggerModule.CLUSTER_SEED_ENERGY_HIGH; - private static final String CLUSTER_TOTAL_ENERGY_LOW = TriggerModule.CLUSTER_TOTAL_ENERGY_LOW; - private static final String CLUSTER_TOTAL_ENERGY_HIGH = TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH; - - /** - * Instantiates a new <code>SinglesTrigger</code> with all cut - * states set to <code>false</code> and with the trigger source - * defined according to the specified object. - * @param source - The object from which the trigger cut states - * are derived. - */ - public SinglesTrigger(E source, int triggerNum) { - // Instantiate the superclass. - super(source, triggerNum); - - // Add the supported cuts types. - addValidCut(CLUSTER_HIT_COUNT_LOW); - addValidCut(CLUSTER_SEED_ENERGY_LOW); - addValidCut(CLUSTER_SEED_ENERGY_HIGH); - addValidCut(CLUSTER_TOTAL_ENERGY_LOW); - addValidCut(CLUSTER_TOTAL_ENERGY_HIGH); - } - - /** - * Gets whether the cluster hit count cut was met. - * @return Returns <code>true</code> if the cut was met and - * <code>false</code> otherwise. - */ - public boolean getStateHitCount() { - return getCutState(CLUSTER_HIT_COUNT_LOW); - } - - /** - * Gets whether the cluster seed energy lower bound cut was met. - * @return Returns <code>true</code> if the cut was met and - * <code>false</code> otherwise. - */ - public boolean getStateSeedEnergyLow() { - return getCutState(CLUSTER_SEED_ENERGY_LOW); - } - - /** - * Gets whether the cluster seed energy upper bound cut was met. - * @return Returns <code>true</code> if the cut was met and - * <code>false</code> otherwise. - */ - public boolean getStateSeedEnergyHigh() { - return getCutState(CLUSTER_SEED_ENERGY_HIGH); - } - - /** - * Gets whether both the cluster seed energy upper and lower bound - * cuts were met. - * @return Returns <code>true</code> if the cuts were met and - * <code>false</code> otherwise. - */ - public boolean getStateSeedEnergy() { - return getCutState(CLUSTER_SEED_ENERGY_LOW) && getCutState(CLUSTER_SEED_ENERGY_HIGH); - } - - /** - * Gets whether the cluster total energy lower bound cut was met. - * @return Returns <code>true</code> if the cut was met and - * <code>false</code> otherwise. - */ - public boolean getStateClusterEnergyLow() { - return getCutState(CLUSTER_TOTAL_ENERGY_LOW); - } - - /** - * Gets whether the cluster total energy upper bound cut was met. - * @return Returns <code>true</code> if the cut was met and - * <code>false</code> otherwise. - */ - public boolean getStateClusterEnergyHigh() { - return getCutState(CLUSTER_TOTAL_ENERGY_HIGH); - } - - /** - * Gets whether both the cluster total energy upper and lower bound - * cuts were met. - * @return Returns <code>true</code> if the cuts were met and - * <code>false</code> otherwise. - */ - public boolean getStateClusterEnergy() { - return getCutState(CLUSTER_TOTAL_ENERGY_LOW) && getCutState(CLUSTER_TOTAL_ENERGY_HIGH); - } - - /** - * Sets whether the conditions for the cluster hit count cut were - * met. - * @param state - <code>true</code> indicates that the cut conditions - * were met and <code>false</code> that they were not. - */ - public void setStateHitCount(boolean state) { - setCutState(CLUSTER_HIT_COUNT_LOW, state); - } - - /** - * Sets whether the conditions for the cluster seed energy lower - * bound cut were met. - * @param state - <code>true</code> indicates that the cut conditions - * were met and <code>false</code> that they were not. - */ - public void setStateSeedEnergyLow(boolean state) { - setCutState(CLUSTER_SEED_ENERGY_LOW, state); - } - - /** - * Sets whether the conditions for the cluster seed energy upper - * bound cut were met. - * @param state - <code>true</code> indicates that the cut conditions - * were met and <code>false</code> that they were not. - */ - public void setStateSeedEnergyHigh(boolean state) { - setCutState(CLUSTER_SEED_ENERGY_HIGH, state); - } - - /** - * Sets whether the conditions for the cluster total energy lower - * bound cut were met. - * @param state - <code>true</code> indicates that the cut conditions - * were met and <code>false</code> that they were not. - */ - public void setStateClusterEnergyLow(boolean state) { - setCutState(CLUSTER_TOTAL_ENERGY_LOW, state); - } - - /** - * Sets whether the conditions for the cluster total energy upper - * bound cut were met. - * @param state - <code>true</code> indicates that the cut conditions - * were met and <code>false</code> that they were not. - */ - public void setStateClusterEnergyHigh(boolean state) { - setCutState(CLUSTER_TOTAL_ENERGY_HIGH, state); - } - - @Override - public String toString() { - return String.format("EClusterLow: %d; EClusterHigh %d; HitCount: %d", - getStateClusterEnergyLow() ? 1 : 0, getStateClusterEnergyHigh() ? 1 : 0, - getStateHitCount() ? 1 : 0); - } + // Define the supported trigger cuts. + private static final String CLUSTER_HIT_COUNT_LOW = TriggerModule.CLUSTER_HIT_COUNT_LOW; + private static final String CLUSTER_SEED_ENERGY_LOW = TriggerModule.CLUSTER_SEED_ENERGY_LOW; + private static final String CLUSTER_SEED_ENERGY_HIGH = TriggerModule.CLUSTER_SEED_ENERGY_HIGH; + private static final String CLUSTER_TOTAL_ENERGY_LOW = TriggerModule.CLUSTER_TOTAL_ENERGY_LOW; + private static final String CLUSTER_TOTAL_ENERGY_HIGH = TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH; + + /** + * Instantiates a new <code>SinglesTrigger</code> with all cut + * states set to <code>false</code> and with the trigger source + * defined according to the specified object. + * @param source - The object from which the trigger cut states + * are derived. + */ + public SinglesTrigger(E source, int triggerNum) { + // Instantiate the superclass. + super(source, triggerNum); + + // Add the supported cuts types. + addValidCut(CLUSTER_HIT_COUNT_LOW); + addValidCut(CLUSTER_SEED_ENERGY_LOW); + addValidCut(CLUSTER_SEED_ENERGY_HIGH); + addValidCut(CLUSTER_TOTAL_ENERGY_LOW); + addValidCut(CLUSTER_TOTAL_ENERGY_HIGH); + } + + /** + * Gets whether the cluster hit count cut was met. + * @return Returns <code>true</code> if the cut was met and + * <code>false</code> otherwise. + */ + public boolean getStateHitCount() { + return getCutState(CLUSTER_HIT_COUNT_LOW); + } + + /** + * Gets whether the cluster seed energy lower bound cut was met. + * @return Returns <code>true</code> if the cut was met and + * <code>false</code> otherwise. + */ + public boolean getStateSeedEnergyLow() { + return getCutState(CLUSTER_SEED_ENERGY_LOW); + } + + /** + * Gets whether the cluster seed energy upper bound cut was met. + * @return Returns <code>true</code> if the cut was met and + * <code>false</code> otherwise. + */ + public boolean getStateSeedEnergyHigh() { + return getCutState(CLUSTER_SEED_ENERGY_HIGH); + } + + /** + * Gets whether both the cluster seed energy upper and lower bound + * cuts were met. + * @return Returns <code>true</code> if the cuts were met and + * <code>false</code> otherwise. + */ + public boolean getStateSeedEnergy() { + return getCutState(CLUSTER_SEED_ENERGY_LOW) && getCutState(CLUSTER_SEED_ENERGY_HIGH); + } + + /** + * Gets whether the cluster total energy lower bound cut was met. + * @return Returns <code>true</code> if the cut was met and + * <code>false</code> otherwise. + */ + public boolean getStateClusterEnergyLow() { + return getCutState(CLUSTER_TOTAL_ENERGY_LOW); + } + + /** + * Gets whether the cluster total energy upper bound cut was met. + * @return Returns <code>true</code> if the cut was met and + * <code>false</code> otherwise. + */ + public boolean getStateClusterEnergyHigh() { + return getCutState(CLUSTER_TOTAL_ENERGY_HIGH); + } + + /** + * Gets whether both the cluster total energy upper and lower bound + * cuts were met. + * @return Returns <code>true</code> if the cuts were met and + * <code>false</code> otherwise. + */ + public boolean getStateClusterEnergy() { + return getCutState(CLUSTER_TOTAL_ENERGY_LOW) && getCutState(CLUSTER_TOTAL_ENERGY_HIGH); + } + + /** + * Sets whether the conditions for the cluster hit count cut were + * met. + * @param state - <code>true</code> indicates that the cut conditions + * were met and <code>false</code> that they were not. + */ + public void setStateHitCount(boolean state) { + setCutState(CLUSTER_HIT_COUNT_LOW, state); + } + + /** + * Sets whether the conditions for the cluster seed energy lower + * bound cut were met. + * @param state - <code>true</code> indicates that the cut conditions + * were met and <code>false</code> that they were not. + */ + public void setStateSeedEnergyLow(boolean state) { + setCutState(CLUSTER_SEED_ENERGY_LOW, state); + } + + /** + * Sets whether the conditions for the cluster seed energy upper + * bound cut were met. + * @param state - <code>true</code> indicates that the cut conditions + * were met and <code>false</code> that they were not. + */ + public void setStateSeedEnergyHigh(boolean state) { + setCutState(CLUSTER_SEED_ENERGY_HIGH, state); + } + + /** + * Sets whether the conditions for the cluster total energy lower + * bound cut were met. + * @param state - <code>true</code> indicates that the cut conditions + * were met and <code>false</code> that they were not. + */ + public void setStateClusterEnergyLow(boolean state) { + setCutState(CLUSTER_TOTAL_ENERGY_LOW, state); + } + + /** + * Sets whether the conditions for the cluster total energy upper + * bound cut were met. + * @param state - <code>true</code> indicates that the cut conditions + * were met and <code>false</code> that they were not. + */ + public void setStateClusterEnergyHigh(boolean state) { + setCutState(CLUSTER_TOTAL_ENERGY_HIGH, state); + } + + @Override + public String toString() { + return String.format("EClusterLow: %d; EClusterHigh %d; HitCount: %d", + getStateClusterEnergyLow() ? 1 : 0, getStateClusterEnergyHigh() ? 1 : 0, + getStateHitCount() ? 1 : 0); + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/Trigger.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/Trigger.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/Trigger.java Wed Mar 9 11:43:24 2016 @@ -14,139 +14,139 @@ * @author Kyle McCarty <[log in to unmask]> */ public abstract class Trigger<E> { - // Track whether the trigger conditions were met. - private boolean passTrigger = false; - // Store the cut condition states. - private Map<String, Boolean> passMap = new HashMap<String, Boolean>(); - // Store the cluster associated with the trigger. - private final E source; - // Store the trigger number. - private final int triggerNum; - - /** - * Creates a new <code>Trigger</code> object with the argument - * specifying the object from whence the trigger state is derived. - * @param source - The trigger source object. - */ - protected Trigger(E source) { - this(source, -1); - } - - /** - * Creates a new <code>Trigger</code> object with the argument - * specifying the object from whence the trigger state is derived. - * @param source - The trigger source object. - * @param triggerNum - The number of the trigger. - */ - protected Trigger(E source, int triggerNum) { - this.source = source; - this.triggerNum = triggerNum; - } - - /** - * Adds a cut to the set of cuts tracked by this trigger. - * @param cut - The identifier for the cut. - */ - protected void addValidCut(String cut) { - passMap.put(cut, new Boolean(false)); - } - - /** - * Gets the state of the specified cut. - * @param cut - The identifier for the cut. - * @return Returns <code>true</code> if the conditions for the - * specified cut were met and <code>false</code> otherwise. - * @throws IllegalArgumentException Occurs if the specified cut - * is not supported by the object. - */ - protected boolean getCutState(String cut) throws IllegalArgumentException { - if(passMap.containsKey(cut)) { - return passMap.get(cut); - } else { - throw new IllegalArgumentException(String.format("Trigger cut \"%s\" is not a supported trigger cut.", cut)); - } - } - - /** - * Gets the number of the trigger. If the trigger has no number, - * it will return <code>-1</code>. - * @return Returns the trigger number as an <code>int</code>. - */ - public int getTriggerNumber() { - return triggerNum; - } - - /** - * Gets the object to which the trigger cuts are applied. - * @return Returns the trigger source object. - */ - public E getTriggerSource() { return source; } - - /** - * Gets whether the conditions for the trigger were met. - * @return Returns <code>true</code> if the conditions for the - * trigger were met and <code>false</code> if they were not. - */ - public boolean getTriggerState() { - return passTrigger; - } - - /** - * Removes a cut from the set of cuts tracked by the trigger. - * @param cut - The identifier for the cut. - */ - protected void removeValidCut(String cut) { - passMap.remove(cut); - } - - /** - * Checks whether the all of the trigger cut conditions were met. - * @return Returns <code>true</code> if all of the cut conditions - * were met and <code>false</code> otherwise. - */ - private boolean isValidTrigger() { - // Iterate over all of the cuts and look for any that have not - // been met. - for(Entry<String, Boolean> cut : passMap.entrySet()) { - if(!cut.getValue()) { return false; } - } - - // If there are no cut conditions that have not been met, then - // the trigger is valid. - return true; - } - - /** - * Sets whether the conditions for the specified cut were met. - * @param cut - The identifier for the cut. - * @param state - <code>true</code> indicates that the conditions - * for the cut were met and <code>false</code> that they were not. - * @throws IllegalArgumentException Occurs if the specified cut - * is not supported by the object. - */ - protected void setCutState(String cut, boolean state) throws IllegalArgumentException { - if(passMap.containsKey(cut)) { - // Set the cut state. - passMap.put(cut, state); - - // If the cut state is true, then all cut conditions may have - // been met. Check whether this is true and, if so, set the - // trigger state accordingly. - if(state && isValidTrigger()) { passTrigger = true; } - else { passTrigger = false; } - } else { - throw new IllegalArgumentException(String.format("Trigger cut \"%s\" is not a supported trigger cut.", cut)); - } - } - - /** - * Indicates whether the specified cut state is tracked by this - * object or not. - * @param cut - The identifier for the cut. - * @return Returns <code>true</code> if the cut state is tracked - * by this object and <code>false</code> otherwise. - */ - protected boolean supportsCut(String cut) { - return passMap.containsKey(cut); - } + // Track whether the trigger conditions were met. + private boolean passTrigger = false; + // Store the cut condition states. + private Map<String, Boolean> passMap = new HashMap<String, Boolean>(); + // Store the cluster associated with the trigger. + private final E source; + // Store the trigger number. + private final int triggerNum; + + /** + * Creates a new <code>Trigger</code> object with the argument + * specifying the object from whence the trigger state is derived. + * @param source - The trigger source object. + */ + protected Trigger(E source) { + this(source, -1); + } + + /** + * Creates a new <code>Trigger</code> object with the argument + * specifying the object from whence the trigger state is derived. + * @param source - The trigger source object. + * @param triggerNum - The number of the trigger. + */ + protected Trigger(E source, int triggerNum) { + this.source = source; + this.triggerNum = triggerNum; + } + + /** + * Adds a cut to the set of cuts tracked by this trigger. + * @param cut - The identifier for the cut. + */ + protected void addValidCut(String cut) { + passMap.put(cut, new Boolean(false)); + } + + /** + * Gets the state of the specified cut. + * @param cut - The identifier for the cut. + * @return Returns <code>true</code> if the conditions for the + * specified cut were met and <code>false</code> otherwise. + * @throws IllegalArgumentException Occurs if the specified cut + * is not supported by the object. + */ + protected boolean getCutState(String cut) throws IllegalArgumentException { + if(passMap.containsKey(cut)) { + return passMap.get(cut); + } else { + throw new IllegalArgumentException(String.format("Trigger cut \"%s\" is not a supported trigger cut.", cut)); + } + } + + /** + * Gets the number of the trigger. If the trigger has no number, + * it will return <code>-1</code>. + * @return Returns the trigger number as an <code>int</code>. + */ + public int getTriggerNumber() { + return triggerNum; + } + + /** + * Gets the object to which the trigger cuts are applied. + * @return Returns the trigger source object. + */ + public E getTriggerSource() { return source; } + + /** + * Gets whether the conditions for the trigger were met. + * @return Returns <code>true</code> if the conditions for the + * trigger were met and <code>false</code> if they were not. + */ + public boolean getTriggerState() { + return passTrigger; + } + + /** + * Removes a cut from the set of cuts tracked by the trigger. + * @param cut - The identifier for the cut. + */ + protected void removeValidCut(String cut) { + passMap.remove(cut); + } + + /** + * Checks whether the all of the trigger cut conditions were met. + * @return Returns <code>true</code> if all of the cut conditions + * were met and <code>false</code> otherwise. + */ + private boolean isValidTrigger() { + // Iterate over all of the cuts and look for any that have not + // been met. + for(Entry<String, Boolean> cut : passMap.entrySet()) { + if(!cut.getValue()) { return false; } + } + + // If there are no cut conditions that have not been met, then + // the trigger is valid. + return true; + } + + /** + * Sets whether the conditions for the specified cut were met. + * @param cut - The identifier for the cut. + * @param state - <code>true</code> indicates that the conditions + * for the cut were met and <code>false</code> that they were not. + * @throws IllegalArgumentException Occurs if the specified cut + * is not supported by the object. + */ + protected void setCutState(String cut, boolean state) throws IllegalArgumentException { + if(passMap.containsKey(cut)) { + // Set the cut state. + passMap.put(cut, state); + + // If the cut state is true, then all cut conditions may have + // been met. Check whether this is true and, if so, set the + // trigger state accordingly. + if(state && isValidTrigger()) { passTrigger = true; } + else { passTrigger = false; } + } else { + throw new IllegalArgumentException(String.format("Trigger cut \"%s\" is not a supported trigger cut.", cut)); + } + } + + /** + * Indicates whether the specified cut state is tracked by this + * object or not. + * @param cut - The identifier for the cut. + * @return Returns <code>true</code> if the cut state is tracked + * by this object and <code>false</code> otherwise. + */ + protected boolean supportsCut(String cut) { + return passMap.containsKey(cut); + } } Modified: java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/TriggerDiagnosticUtil.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/TriggerDiagnosticUtil.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/trigger/util/TriggerDiagnosticUtil.java Wed Mar 9 11:43:24 2016 @@ -15,208 +15,208 @@ * @author Kyle McCarty <[log in to unmask]> */ public class TriggerDiagnosticUtil { - // Cluster match state variables. - public static final byte CLUSTER_STATE_MATCHED = 0; - public static final byte CLUSTER_STATE_FAIL_POSITION = 1; - public static final byte CLUSTER_STATE_FAIL_ENERGY = 2; - public static final byte CLUSTER_STATE_FAIL_HIT_COUNT = 3; - public static final byte CLUSTER_STATE_FAIL_TIME = 4; - public static final byte CLUSTER_STATE_FAIL_UNKNOWN = 5; - - // Trigger match cut IDs. - public static final int SINGLES_ENERGY_MIN = 0; - public static final int SINGLES_ENERGY_MAX = 1; - public static final int SINGLES_HIT_COUNT = 2; - public static final int PAIR_ENERGY_SUM = 0; - public static final int PAIR_ENERGY_DIFF = 1; - public static final int PAIR_ENERGY_SLOPE = 2; - public static final int PAIR_COPLANARITY = 3; - - // Trigger type variables. - public static final int TRIGGER_PULSER = TriggerStatModule.PULSER; - public static final int TRIGGER_COSMIC = TriggerStatModule.COSMIC; - public static final int TRIGGER_SINGLES_0 = TriggerStatModule.SINGLES_0; - public static final int TRIGGER_SINGLES_1 = TriggerStatModule.SINGLES_1; - public static final int TRIGGER_PAIR_0 = TriggerStatModule.PAIR_0; - public static final int TRIGGER_PAIR_1 = TriggerStatModule.PAIR_1; - public static final String[] TRIGGER_NAME = { "Singles 0", "Singles 1", "Pair 0", "Pair 1", "Pulser", "Cosmic" }; - - /** - * Convenience method that writes the position of a cluster in the - * form (ix, iy). - * @param cluster - The cluster. - * @return Returns the cluster position as a <code>String</code>. - */ - public static final String clusterPositionString(Cluster cluster) { - return String.format("(%3d, %3d)", - cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"), - cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy")); - } - - /** - * Convenience method that writes the position of a cluster in the - * form (ix, iy). - * @param cluster - The cluster. - * @return Returns the cluster position as a <code>String</code>. - */ - public static final String clusterPositionString(SSPCluster cluster) { - return String.format("(%3d, %3d)", cluster.getXIndex(), cluster.getYIndex()); - } - - /** - * Convenience method that writes the information in a cluster to - * a <code>String</code>. - * @param cluster - The cluster. - * @return Returns the cluster information as a <code>String</code>. - */ - public static final String clusterToString(Cluster cluster) { - return String.format("Cluster at (%3d, %3d) with %.3f GeV and %d hits at %4.0f ns.", - cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"), - cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy"), - cluster.getEnergy(), cluster.getCalorimeterHits().size(), - cluster.getCalorimeterHits().get(0).getTime()); - } - - /** - * Convenience method that writes the information in a cluster to - * a <code>String</code>. - * @param cluster - The cluster. - * @return Returns the cluster information as a <code>String</code>. - */ - public static final String clusterToString(SSPCluster cluster) { - return String.format("Cluster at (%3d, %3d) with %.3f GeV and %d hits at %4d ns.", - cluster.getXIndex(), cluster.getYIndex(), cluster.getEnergy(), - cluster.getHitCount(), cluster.getTime()); - } - - /** - * Gets the x/y-indices of the cluster. - * @param cluster - The cluster of which to obtain the indices. - * @return Returns the indices as a <code>Point</code> object. - */ - public static final Point getClusterPosition(Cluster cluster) { - return new Point(getXIndex(cluster), getYIndex(cluster)); - } - - /** - * Gets the x/y-indices of the cluster. - * @param cluster - The cluster of which to obtain the indices. - * @return Returns the indices as a <code>Point</code> object. - */ - public static final Point getClusterPosition(SSPCluster cluster) { - return new Point(cluster.getXIndex(), cluster.getYIndex()); - } - - /** - * Gets the time stamp of the cluster in nanoseconds. - * @param cluster - The cluster. - * @return Returns the time-stamp. - */ - public static final double getClusterTime(Cluster cluster) { - return cluster.getCalorimeterHits().get(0).getTime(); - } - - /** - * Gets the time stamp of the cluster in nanoseconds. - * @param cluster - The cluster. - * @return Returns the time-stamp. - */ - public static final int getClusterTime(SSPCluster cluster) { - return cluster.getTime(); - } - - /** - * Gets the number of digits in the base-10 String representation - * of an integer primitive. Negative signs are not included in the - * digit count. - * @param value - The value of which to obtain the length. - * @return Returns the number of digits in the String representation - * of the argument value. - */ - public static final int getDigits(int value) { - if(value < 0) { return Integer.toString(value).length() - 1; } - else { return Integer.toString(value).length(); } - } - - /** - * Gets the number of hits in a cluster. - * @param cluster - The cluster. - * @return Returns the number of hits in the cluster. - */ - public static final int getHitCount(Cluster cluster) { - return cluster.getCalorimeterHits().size(); - } - - /** - * Gets the number of hits in a cluster. - * @param cluster - The cluster. - * @return Returns the number of hits in the cluster. - */ - public static final int getHitCount(SSPCluster cluster) { - return cluster.getHitCount(); - } - - /** - * Gets the x-index of the cluster's seed hit. - * @param cluster - The cluster. - * @return Returns the x-index. - */ - public static final int getXIndex(Cluster cluster) { - return cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"); - } - - /** - * Gets the x-index of the cluster's seed hit. - * @param cluster - The cluster. - * @return Returns the x-index. - */ - public static final int getXIndex(SSPCluster cluster) { - return cluster.getXIndex(); - } - - /** - * Gets the y-index of the cluster's seed hit. - * @param cluster - The cluster. - * @return Returns the y-index. - */ - public static final int getYIndex(Cluster cluster) { - return cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy"); - } - - /** - * Gets the y-index of the cluster's seed hit. - * @param cluster - The cluster. - * @return Returns the y-index. - */ - public static final int getYIndex(SSPCluster cluster) { - return cluster.getYIndex(); - } - - /** - * Checks whether all of the hits in a cluster are within the safe - * region of the FADC output window. - * @param reconCluster - The cluster to check. - * @return Returns <code>true</code> if the cluster is safe and - * returns <code>false</code> otherwise. - */ - public static final boolean isVerifiable(Cluster reconCluster, int nsa, int nsb, int windowWidth) { - // Iterate over the hits in the cluster. - for(CalorimeterHit hit : reconCluster.getCalorimeterHits()) { - // Check that none of the hits are within the disallowed - // region of the FADC readout window. - if(hit.getTime() <= nsb || hit.getTime() >= (windowWidth - nsa)) { - return false; - } - - // Also check to make sure that the cluster does not have - // any negative energy hits. These are, obviously, wrong. - if(hit.getCorrectedEnergy() < 0.0) { - return false; - } - } - - // If all of the cluster hits pass the time cut, the cluster - // is valid. - return true; - } + // Cluster match state variables. + public static final byte CLUSTER_STATE_MATCHED = 0; + public static final byte CLUSTER_STATE_FAIL_POSITION = 1; + public static final byte CLUSTER_STATE_FAIL_ENERGY = 2; + public static final byte CLUSTER_STATE_FAIL_HIT_COUNT = 3; + public static final byte CLUSTER_STATE_FAIL_TIME = 4; + public static final byte CLUSTER_STATE_FAIL_UNKNOWN = 5; + + // Trigger match cut IDs. + public static final int SINGLES_ENERGY_MIN = 0; + public static final int SINGLES_ENERGY_MAX = 1; + public static final int SINGLES_HIT_COUNT = 2; + public static final int PAIR_ENERGY_SUM = 0; + public static final int PAIR_ENERGY_DIFF = 1; + public static final int PAIR_ENERGY_SLOPE = 2; + public static final int PAIR_COPLANARITY = 3; + + // Trigger type variables. + public static final int TRIGGER_PULSER = TriggerStatModule.PULSER; + public static final int TRIGGER_COSMIC = TriggerStatModule.COSMIC; + public static final int TRIGGER_SINGLES_0 = TriggerStatModule.SINGLES_0; + public static final int TRIGGER_SINGLES_1 = TriggerStatModule.SINGLES_1; + public static final int TRIGGER_PAIR_0 = TriggerStatModule.PAIR_0; + public static final int TRIGGER_PAIR_1 = TriggerStatModule.PAIR_1; + public static final String[] TRIGGER_NAME = { "Singles 0", "Singles 1", "Pair 0", "Pair 1", "Pulser", "Cosmic" }; + + /** + * Convenience method that writes the position of a cluster in the + * form (ix, iy). + * @param cluster - The cluster. + * @return Returns the cluster position as a <code>String</code>. + */ + public static final String clusterPositionString(Cluster cluster) { + return String.format("(%3d, %3d)", + cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"), + cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy")); + } + + /** + * Convenience method that writes the position of a cluster in the + * form (ix, iy). + * @param cluster - The cluster. + * @return Returns the cluster position as a <code>String</code>. + */ + public static final String clusterPositionString(SSPCluster cluster) { + return String.format("(%3d, %3d)", cluster.getXIndex(), cluster.getYIndex()); + } + + /** + * Convenience method that writes the information in a cluster to + * a <code>String</code>. + * @param cluster - The cluster. + * @return Returns the cluster information as a <code>String</code>. + */ + public static final String clusterToString(Cluster cluster) { + return String.format("Cluster at (%3d, %3d) with %.3f GeV and %d hits at %4.0f ns.", + cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"), + cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy"), + cluster.getEnergy(), cluster.getCalorimeterHits().size(), + cluster.getCalorimeterHits().get(0).getTime()); + } + + /** + * Convenience method that writes the information in a cluster to + * a <code>String</code>. + * @param cluster - The cluster. + * @return Returns the cluster information as a <code>String</code>. + */ + public static final String clusterToString(SSPCluster cluster) { + return String.format("Cluster at (%3d, %3d) with %.3f GeV and %d hits at %4d ns.", + cluster.getXIndex(), cluster.getYIndex(), cluster.getEnergy(), + cluster.getHitCount(), cluster.getTime()); + } + + /** + * Gets the x/y-indices of the cluster. + * @param cluster - The cluster of which to obtain the indices. + * @return Returns the indices as a <code>Point</code> object. + */ + public static final Point getClusterPosition(Cluster cluster) { + return new Point(getXIndex(cluster), getYIndex(cluster)); + } + + /** + * Gets the x/y-indices of the cluster. + * @param cluster - The cluster of which to obtain the indices. + * @return Returns the indices as a <code>Point</code> object. + */ + public static final Point getClusterPosition(SSPCluster cluster) { + return new Point(cluster.getXIndex(), cluster.getYIndex()); + } + + /** + * Gets the time stamp of the cluster in nanoseconds. + * @param cluster - The cluster. + * @return Returns the time-stamp. + */ + public static final double getClusterTime(Cluster cluster) { + return cluster.getCalorimeterHits().get(0).getTime(); + } + + /** + * Gets the time stamp of the cluster in nanoseconds. + * @param cluster - The cluster. + * @return Returns the time-stamp. + */ + public static final int getClusterTime(SSPCluster cluster) { + return cluster.getTime(); + } + + /** + * Gets the number of digits in the base-10 String representation + * of an integer primitive. Negative signs are not included in the + * digit count. + * @param value - The value of which to obtain the length. + * @return Returns the number of digits in the String representation + * of the argument value. + */ + public static final int getDigits(int value) { + if(value < 0) { return Integer.toString(value).length() - 1; } + else { return Integer.toString(value).length(); } + } + + /** + * Gets the number of hits in a cluster. + * @param cluster - The cluster. + * @return Returns the number of hits in the cluster. + */ + public static final int getHitCount(Cluster cluster) { + return cluster.getCalorimeterHits().size(); + } + + /** + * Gets the number of hits in a cluster. + * @param cluster - The cluster. + * @return Returns the number of hits in the cluster. + */ + public static final int getHitCount(SSPCluster cluster) { + return cluster.getHitCount(); + } + + /** + * Gets the x-index of the cluster's seed hit. + * @param cluster - The cluster. + * @return Returns the x-index. + */ + public static final int getXIndex(Cluster cluster) { + return cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"); + } + + /** + * Gets the x-index of the cluster's seed hit. + * @param cluster - The cluster. + * @return Returns the x-index. + */ + public static final int getXIndex(SSPCluster cluster) { + return cluster.getXIndex(); + } + + /** + * Gets the y-index of the cluster's seed hit. + * @param cluster - The cluster. + * @return Returns the y-index. + */ + public static final int getYIndex(Cluster cluster) { + return cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy"); + } + + /** + * Gets the y-index of the cluster's seed hit. + * @param cluster - The cluster. + * @return Returns the y-index. + */ + public static final int getYIndex(SSPCluster cluster) { + return cluster.getYIndex(); + } + + /** + * Checks whether all of the hits in a cluster are within the safe + * region of the FADC output window. + * @param reconCluster - The cluster to check. + * @return Returns <code>true</code> if the cluster is safe and + * returns <code>false</code> otherwise. + */ + public static final boolean isVerifiable(Cluster reconCluster, int nsa, int nsb, int windowWidth) { + // Iterate over the hits in the cluster. + for(CalorimeterHit hit : reconCluster.getCalorimeterHits()) { + // Check that none of the hits are within the disallowed + // region of the FADC readout window. + if(hit.getTime() <= nsb || hit.getTime() >= (windowWidth - nsa)) { + return false; + } + + // Also check to make sure that the cluster does not have + // any negative energy hits. These are, obviously, wrong. + if(hit.getCorrectedEnergy() < 0.0) { + return false; + } + } + + // If all of the cluster hits pass the time cut, the cluster + // is valid. + return true; + } } Modified: java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-3/compact.xml ============================================================================= --- java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-3/compact.xml (original) +++ java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-3/compact.xml Wed Mar 9 11:43:24 2016 @@ -9,8 +9,8 @@ 1) float L2_tu, 2) float L2_tu, L4_tu, L5_tu 2nd: round 1) float L2_tu, L4_tu, L5_tu - 3rd: round - 1) float L2_tu_rw, L4_tu_rw, L5_tu_rw + 3rd: round + 1) float L2_tu_rw, L4_tu_rw, L5_tu_rw </comment> </info> Modified: java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-4-1/compact.xml ============================================================================= --- java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-4-1/compact.xml (original) +++ java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-4-1/compact.xml Wed Mar 9 11:43:24 2016 @@ -9,8 +9,8 @@ 1) float L2_tu, 2) float L2_tu, L4_tu, L5_tu 2nd: round 1) float L2_tu, L4_tu, L5_tu - 3rd: round - 1) float L2_tu_rw, L4_tu_rw, L5_tu_rw + 3rd: round + 1) float L2_tu_rw, L4_tu_rw, L5_tu_rw 4th: round start with v1-3 L3_L4_L5_tu_rw_THEN_L2_tu_rw_THEN_L2_L3_L4_tu_rw_THEN_L2_L3_L5_tu_rw_THEN_L2_L3_L4_L5_excl_L3ST_tu_L4Sb_tu_THEN_L2_L4_L5_tu_rw </comment> Modified: java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-4-1/compact_millepede-milleBinaryISN_hps_005772.evio.0.gbl-L3_L4_L5_tu_rw_THEN_L2_tu_rw_THEN_L2_L3_L4_tu_rw_THEN_L2_L3_L5_tu_rw_THEN_L2_L3_L4_L5_excl_L3ST_tu_L4Sb_tu_THEN_L2_L4_L5_tu_rw.xml ============================================================================= --- java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-4-1/compact_millepede-milleBinaryISN_hps_005772.evio.0.gbl-L3_L4_L5_tu_rw_THEN_L2_tu_rw_THEN_L2_L3_L4_tu_rw_THEN_L2_L3_L5_tu_rw_THEN_L2_L3_L4_L5_excl_L3ST_tu_L4Sb_tu_THEN_L2_L4_L5_tu_rw.xml (original) +++ java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-4-1/compact_millepede-milleBinaryISN_hps_005772.evio.0.gbl-L3_L4_L5_tu_rw_THEN_L2_tu_rw_THEN_L2_L3_L4_tu_rw_THEN_L2_L3_L5_tu_rw_THEN_L2_L3_L4_L5_excl_L3ST_tu_L4Sb_tu_THEN_L2_L4_L5_tu_rw.xml Wed Mar 9 11:43:24 2016 @@ -9,8 +9,8 @@ 1) float L2_tu, 2) float L2_tu, L4_tu, L5_tu 2nd: round 1) float L2_tu, L4_tu, L5_tu - 3rd: round - 1) float L2_tu_rw, L4_tu_rw, L5_tu_rw + 3rd: round + 1) float L2_tu_rw, L4_tu_rw, L5_tu_rw </comment> </info> Modified: java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-4/compact.xml ============================================================================= --- java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-4/compact.xml (original) +++ java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-4/compact.xml Wed Mar 9 11:43:24 2016 @@ -9,8 +9,8 @@ 1) float L2_tu, 2) float L2_tu, L4_tu, L5_tu 2nd: round 1) float L2_tu, L4_tu, L5_tu - 3rd: round - 1) float L2_tu_rw, L4_tu_rw, L5_tu_rw + 3rd: round + 1) float L2_tu_rw, L4_tu_rw, L5_tu_rw 4th: round start with v1-3 1) float L2_tu_rw, L3_tu_rw, L4_tu_rw </comment> Modified: java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-4/compact_millepede-milleBinaryISN_hps_005772.evio.0.gbl-L2-3-4_tu_rw.xml ============================================================================= --- java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-4/compact_millepede-milleBinaryISN_hps_005772.evio.0.gbl-L2-3-4_tu_rw.xml (original) +++ java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-4/compact_millepede-milleBinaryISN_hps_005772.evio.0.gbl-L2-3-4_tu_rw.xml Wed Mar 9 11:43:24 2016 @@ -9,8 +9,8 @@ 1) float L2_tu, 2) float L2_tu, L4_tu, L5_tu 2nd: round 1) float L2_tu, L4_tu, L5_tu - 3rd: round - 1) float L2_tu_rw, L4_tu_rw, L5_tu_rw + 3rd: round + 1) float L2_tu_rw, L4_tu_rw, L5_tu_rw </comment> </info> Modified: java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-5-1/compact_millepede-milleBinaryISN_hps_005772.evio.0.gbl-L3_L4_L5_tu_rw_THEN_L2_tu_rw_THEN_L2_L3_L4_tu_rw_THEN_L2_L3_L5_tu_rw_THEN_L2_L3_L4_L5_excl_L3ST_tu_L4Sb_tu_THEN_L2_L4_L5_tu_rw.xml ============================================================================= --- java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-5-1/compact_millepede-milleBinaryISN_hps_005772.evio.0.gbl-L3_L4_L5_tu_rw_THEN_L2_tu_rw_THEN_L2_L3_L4_tu_rw_THEN_L2_L3_L5_tu_rw_THEN_L2_L3_L4_L5_excl_L3ST_tu_L4Sb_tu_THEN_L2_L4_L5_tu_rw.xml (original) +++ java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-5-1/compact_millepede-milleBinaryISN_hps_005772.evio.0.gbl-L3_L4_L5_tu_rw_THEN_L2_tu_rw_THEN_L2_L3_L4_tu_rw_THEN_L2_L3_L5_tu_rw_THEN_L2_L3_L4_L5_excl_L3ST_tu_L4Sb_tu_THEN_L2_L4_L5_tu_rw.xml Wed Mar 9 11:43:24 2016 @@ -9,8 +9,8 @@ 1) float L2_tu, 2) float L2_tu, L4_tu, L5_tu 2nd: round 1) float L2_tu, L4_tu, L5_tu - 3rd: round - 1) float L2_tu_rw, L4_tu_rw, L5_tu_rw + 3rd: round + 1) float L2_tu_rw, L4_tu_rw, L5_tu_rw </comment> </info> Modified: java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-5-2/compact_millepede-milleBinaryISN_hps_005772.evio.0.gbl-HPS-EngRun2015-Nominal-v1-4-1-100k-L456_L123_L234_L345_L123_L456_tu_rwIter0Iter1Iter2Iter3Iter4Iter5.xml ============================================================================= --- java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-5-2/compact_millepede-milleBinaryISN_hps_005772.evio.0.gbl-HPS-EngRun2015-Nominal-v1-4-1-100k-L456_L123_L234_L345_L123_L456_tu_rwIter0Iter1Iter2Iter3Iter4Iter5.xml (original) +++ java/trunk/detector-data/detectors/HPS-EngRun2015-Nominal-v1-5-2/compact_millepede-milleBinaryISN_hps_005772.evio.0.gbl-HPS-EngRun2015-Nominal-v1-4-1-100k-L456_L123_L234_L345_L123_L456_tu_rwIter0Iter1Iter2Iter3Iter4Iter5.xml Wed Mar 9 11:43:24 2016 @@ -9,8 +9,8 @@ 1) float L2_tu, 2) float L2_tu, L4_tu, L5_tu 2nd: round 1) float L2_tu, L4_tu, L5_tu - 3rd: round - 1) float L2_tu_rw, L4_tu_rw, L5_tu_rw + 3rd: round + 1) float L2_tu_rw, L4_tu_rw, L5_tu_rw 4th: round start with v1-3 L3_L4_L5_tu_rw_THEN_L2_tu_rw_THEN_L2_L3_L4_tu_rw_THEN_L2_L3_L5_tu_rw_THEN_L2_L3_L4_L5_excl_L3ST_tu_L4Sb_tu_THEN_L2_L4_L5_tu_rw </comment> Modified: java/trunk/detector-data/detectors/HPS-Proposal2014-v3-2pt2-0zOffset/compact.xml ============================================================================= --- java/trunk/detector-data/detectors/HPS-Proposal2014-v3-2pt2-0zOffset/compact.xml (original) +++ java/trunk/detector-data/detectors/HPS-Proposal2014-v3-2pt2-0zOffset/compact.xml Wed Mar 9 11:43:24 2016 @@ -305,7 +305,7 @@ </layer> <layer id="2"> <module_placement name="TestRunModuleFieldDef" id="0" x="0" y="0" z="endOfFieldZ" rx="0" ry="0" rz="-PI/2"/> - </layer> + </layer> </detector> Modified: java/trunk/detector-data/detectors/HPS-TestRun-v5/compact.xml ============================================================================= --- java/trunk/detector-data/detectors/HPS-TestRun-v5/compact.xml (original) +++ java/trunk/detector-data/detectors/HPS-TestRun-v5/compact.xml Wed Mar 9 11:43:24 2016 @@ -488,7 +488,7 @@ </define> <materials> - <!-- Set the world material to vacuum. --> + <!-- Set the world material to vacuum. --> <material name="WorldMaterial"> <D type="density" unit="g/cm3" value="0.0000000000000001"/> <fraction n="1.0" ref="Vacuum" /> @@ -578,7 +578,7 @@ </layer> <layer id="2"> <module_placement name="TestRunModuleFieldDef" id="0" x="0" y="0" z="endOfFieldZ" rx="0" ry="0" rz="-PI/2"/> - </layer> + </layer> </detector> <detector id="13" name="Ecal" type="HPSEcal3" insideTrackingVolume="false" readout="EcalHits" vis="ECALVis"> Modified: java/trunk/detector-data/detectors/HPS-TestRun-v6/compact.xml ============================================================================= --- java/trunk/detector-data/detectors/HPS-TestRun-v6/compact.xml (original) +++ java/trunk/detector-data/detectors/HPS-TestRun-v6/compact.xml Wed Mar 9 11:43:24 2016 @@ -488,7 +488,7 @@ </define> <materials> - <!-- Set the world material to vacuum. --> + <!-- Set the world material to vacuum. --> <material name="WorldMaterial"> <D type="density" unit="g/cm3" value="0.0000000000000001"/> <fraction n="1.0" ref="Vacuum" /> @@ -578,7 +578,7 @@ </layer> <layer id="2"> <module_placement name="TestRunModuleFieldDef" id="0" x="0" y="0" z="endOfFieldZ" rx="0" ry="0" rz="-PI/2"/> - </layer> + </layer> </detector> <detector id="13" name="Ecal" type="HPSEcal3" insideTrackingVolume="false" readout="EcalHits" vis="ECALVis"> Modified: java/trunk/detector-data/detectors/HPS-TestRun-v7-2/compact.xml ============================================================================= --- java/trunk/detector-data/detectors/HPS-TestRun-v7-2/compact.xml (original) +++ java/trunk/detector-data/detectors/HPS-TestRun-v7-2/compact.xml Wed Mar 9 11:43:24 2016 @@ -86,127 +86,127 @@ <constant name="y9b_misalign" value="0.0"/> <constant name="y10b_misalign" value="0.0"/> - <!-- alignment corrections --> - <constant name="x1t_align" value="0.000000"/> - <constant name="x2t_align" value="0.000000"/> - <constant name="x3t_align" value="0.000000"/> - <constant name="x4t_align" value="0.000000"/> - <constant name="x5t_align" value="0.000000"/> - <constant name="x6t_align" value="0.000000"/> - <constant name="x7t_align" value="0.000000"/> - <constant name="x8t_align" value="0.000000"/> - <constant name="x9t_align" value="0.000000"/> - <constant name="x10t_align" value="0.000000"/> - <constant name="y1t_align" value="0.000000"/> - <constant name="y2t_align" value="0.000000"/> - <constant name="y3t_align" value="0.0"/> - <constant name="y4t_align" value="0.0"/> - <constant name="y5t_align" value="0.000000"/> - <constant name="y6t_align" value="0.000000"/> - <constant name="y7t_align" value="0.000000"/> - <constant name="y8t_align" value="0.000000"/> - <constant name="y9t_align" value="0.000000"/> - <constant name="y10t_align" value="0.000000"/> - <constant name="z1t_align" value="0.000000"/> - <constant name="z2t_align" value="0.000000"/> - <constant name="z3t_align" value="0.000000"/> - <constant name="z4t_align" value="0.000000"/> - <constant name="z5t_align" value="0.000000"/> - <constant name="z6t_align" value="0.000000"/> - <constant name="z7t_align" value="0.000000"/> - <constant name="z8t_align" value="0.000000"/> - <constant name="z9t_align" value="0.000000"/> - <constant name="z10t_align" value="0.000000"/> - <constant name="rx1t_align" value="0.000000"/> - <constant name="rx2t_align" value="0.000000"/> - <constant name="rx3t_align" value="0.000000"/> - <constant name="rx4t_align" value="0.000000"/> - <constant name="rx5t_align" value="0.000000"/> - <constant name="rx6t_align" value="0.000000"/> - <constant name="rx7t_align" value="0.000000"/> - <constant name="rx8t_align" value="0.000000"/> - <constant name="rx9t_align" value="0.000000"/> - <constant name="rx10t_align" value="0.000000"/> - <constant name="ry1t_align" value="0.000000"/> - <constant name="ry2t_align" value="0.000000"/> - <constant name="ry3t_align" value="0.000000"/> - <constant name="ry4t_align" value="0.000000"/> - <constant name="ry5t_align" value="0.000000"/> - <constant name="ry6t_align" value="0.000000"/> - <constant name="ry7t_align" value="0.000000"/> - <constant name="ry8t_align" value="0.000000"/> - <constant name="ry9t_align" value="0.000000"/> - <constant name="ry10t_align" value="0.000000"/> - <constant name="rz1t_align" value="0.000000"/> - <constant name="rz2t_align" value="0.000000"/> - <constant name="rz3t_align" value="0.000000"/> - <constant name="rz4t_align" value="0.000000"/> - <constant name="rz5t_align" value="0.000000"/> - <constant name="rz6t_align" value="0.000000"/> - <constant name="rz7t_align" value="0.000000"/> - <constant name="rz8t_align" value="0.000000"/> - <constant name="rz9t_align" value="0.000000"/> - <constant name="rz10t_align" value="0.000000"/> - <constant name="x1b_align" value="0.000000"/> - <constant name="x2b_align" value="0.000000"/> - <constant name="x3b_align" value="0.000000"/> - <constant name="x4b_align" value="0.000000"/> - <constant name="x5b_align" value="0.000000"/> - <constant name="x6b_align" value="0.00000"/> - <constant name="x7b_align" value="0.000000"/> - <constant name="x8b_align" value="0.000000"/> - <constant name="x9b_align" value="0.000000"/> - <constant name="x10b_align" value="0.000000"/> - <constant name="y1b_align" value="0.000000"/> - <constant name="y2b_align" value="0.000000"/> - <constant name="y3b_align" value="0.000000"/> - <constant name="y4b_align" value="0.000000"/> - <constant name="y5b_align" value="0.0"/> - <constant name="y6b_align" value="0.0"/> - <constant name="y7b_align" value="0.000000"/> - <constant name="y8b_align" value="0.000000"/> - <constant name="y9b_align" value="0.000000"/> - <constant name="y10b_align" value="0.000000"/> - <constant name="z1b_align" value="0.000000"/> - <constant name="z2b_align" value="0.000000"/> - <constant name="z3b_align" value="0.000000"/> - <constant name="z4b_align" value="0.000000"/> - <constant name="z5b_align" value="0.000000"/> - <constant name="z6b_align" value="0.000000"/> - <constant name="z7b_align" value="0.000000"/> - <constant name="z8b_align" value="0.000000"/> - <constant name="z9b_align" value="0.000000"/> - <constant name="z10b_align" value="0.000000"/> - <constant name="rx1b_align" value="0.000000"/> - <constant name="rx2b_align" value="0.000000"/> - <constant name="rx3b_align" value="0.000000"/> - <constant name="rx4b_align" value="0.000000"/> - <constant name="rx5b_align" value="0.000000"/> - <constant name="rx6b_align" value="0.000000"/> - <constant name="rx7b_align" value="0.000000"/> - <constant name="rx8b_align" value="0.000000"/> - <constant name="rx9b_align" value="0.000000"/> - <constant name="rx10b_align" value="0.000000"/> - <constant name="ry1b_align" value="0.000000"/> - <constant name="ry2b_align" value="0.000000"/> - <constant name="ry3b_align" value="0.000000"/> - <constant name="ry4b_align" value="0.000000"/> - <constant name="ry5b_align" value="0.000000"/> - <constant name="ry6b_align" value="0.000000"/> - <constant name="ry7b_align" value="0.000000"/> - <constant name="ry8b_align" value="0.000000"/> - <constant name="ry9b_align" value="0.000000"/> - <constant name="ry10b_align" value="0.000000"/> - <constant name="rz1b_align" value="0.000000"/> - <constant name="rz2b_align" value="0.000000"/> - <constant name="rz3b_align" value="0.000000"/> - <constant name="rz4b_align" value="0.000000"/> - <constant name="rz5b_align" value="0.000000"/> - <constant name="rz6b_align" value="0.000000"/> - <constant name="rz7b_align" value="0.000000"/> - <constant name="rz8b_align" value="0.000000"/> - <constant name="rz9b_align" value="0.000000"/> - <constant name="rz10b_align" value="0.000000"/> + <!-- alignment corrections --> + <constant name="x1t_align" value="0.000000"/> + <constant name="x2t_align" value="0.000000"/> + <constant name="x3t_align" value="0.000000"/> + <constant name="x4t_align" value="0.000000"/> + <constant name="x5t_align" value="0.000000"/> + <constant name="x6t_align" value="0.000000"/> + <constant name="x7t_align" value="0.000000"/> + <constant name="x8t_align" value="0.000000"/> + <constant name="x9t_align" value="0.000000"/> + <constant name="x10t_align" value="0.000000"/> + <constant name="y1t_align" value="0.000000"/> + <constant name="y2t_align" value="0.000000"/> + <constant name="y3t_align" value="0.0"/> + <constant name="y4t_align" value="0.0"/> + <constant name="y5t_align" value="0.000000"/> + <constant name="y6t_align" value="0.000000"/> + <constant name="y7t_align" value="0.000000"/> + <constant name="y8t_align" value="0.000000"/> + <constant name="y9t_align" value="0.000000"/> + <constant name="y10t_align" value="0.000000"/> + <constant name="z1t_align" value="0.000000"/> + <constant name="z2t_align" value="0.000000"/> + <constant name="z3t_align" value="0.000000"/> + <constant name="z4t_align" value="0.000000"/> + <constant name="z5t_align" value="0.000000"/> + <constant name="z6t_align" value="0.000000"/> + <constant name="z7t_align" value="0.000000"/> + <constant name="z8t_align" value="0.000000"/> + <constant name="z9t_align" value="0.000000"/> + <constant name="z10t_align" value="0.000000"/> + <constant name="rx1t_align" value="0.000000"/> + <constant name="rx2t_align" value="0.000000"/> + <constant name="rx3t_align" value="0.000000"/> + <constant name="rx4t_align" value="0.000000"/> + <constant name="rx5t_align" value="0.000000"/> + <constant name="rx6t_align" value="0.000000"/> + <constant name="rx7t_align" value="0.000000"/> + <constant name="rx8t_align" value="0.000000"/> + <constant name="rx9t_align" value="0.000000"/> + <constant name="rx10t_align" value="0.000000"/> + <constant name="ry1t_align" value="0.000000"/> + <constant name="ry2t_align" value="0.000000"/> + <constant name="ry3t_align" value="0.000000"/> + <constant name="ry4t_align" value="0.000000"/> + <constant name="ry5t_align" value="0.000000"/> + <constant name="ry6t_align" value="0.000000"/> + <constant name="ry7t_align" value="0.000000"/> + <constant name="ry8t_align" value="0.000000"/> + <constant name="ry9t_align" value="0.000000"/> + <constant name="ry10t_align" value="0.000000"/> + <constant name="rz1t_align" value="0.000000"/> + <constant name="rz2t_align" value="0.000000"/> + <constant name="rz3t_align" value="0.000000"/> + <constant name="rz4t_align" value="0.000000"/> + <constant name="rz5t_align" value="0.000000"/> + <constant name="rz6t_align" value="0.000000"/> + <constant name="rz7t_align" value="0.000000"/> + <constant name="rz8t_align" value="0.000000"/> + <constant name="rz9t_align" value="0.000000"/> + <constant name="rz10t_align" value="0.000000"/> + <constant name="x1b_align" value="0.000000"/> + <constant name="x2b_align" value="0.000000"/> + <constant name="x3b_align" value="0.000000"/> + <constant name="x4b_align" value="0.000000"/> + <constant name="x5b_align" value="0.000000"/> + <constant name="x6b_align" value="0.00000"/> + <constant name="x7b_align" value="0.000000"/> + <constant name="x8b_align" value="0.000000"/> + <constant name="x9b_align" value="0.000000"/> + <constant name="x10b_align" value="0.000000"/> + <constant name="y1b_align" value="0.000000"/> + <constant name="y2b_align" value="0.000000"/> + <constant name="y3b_align" value="0.000000"/> + <constant name="y4b_align" value="0.000000"/> + <constant name="y5b_align" value="0.0"/> + <constant name="y6b_align" value="0.0"/> + <constant name="y7b_align" value="0.000000"/> + <constant name="y8b_align" value="0.000000"/> + <constant name="y9b_align" value="0.000000"/> + <constant name="y10b_align" value="0.000000"/> + <constant name="z1b_align" value="0.000000"/> + <constant name="z2b_align" value="0.000000"/> + <constant name="z3b_align" value="0.000000"/> + <constant name="z4b_align" value="0.000000"/> + <constant name="z5b_align" value="0.000000"/> + <constant name="z6b_align" value="0.000000"/> + <constant name="z7b_align" value="0.000000"/> + <constant name="z8b_align" value="0.000000"/> + <constant name="z9b_align" value="0.000000"/> + <constant name="z10b_align" value="0.000000"/> + <constant name="rx1b_align" value="0.000000"/> + <constant name="rx2b_align" value="0.000000"/> + <constant name="rx3b_align" value="0.000000"/> + <constant name="rx4b_align" value="0.000000"/> + <constant name="rx5b_align" value="0.000000"/> + <constant name="rx6b_align" value="0.000000"/> + <constant name="rx7b_align" value="0.000000"/> + <constant name="rx8b_align" value="0.000000"/> + <constant name="rx9b_align" value="0.000000"/> + <constant name="rx10b_align" value="0.000000"/> + <constant name="ry1b_align" value="0.000000"/> + <constant name="ry2b_align" value="0.000000"/> + <constant name="ry3b_align" value="0.000000"/> + <constant name="ry4b_align" value="0.000000"/> + <constant name="ry5b_align" value="0.000000"/> + <constant name="ry6b_align" value="0.000000"/> + <constant name="ry7b_align" value="0.000000"/> + <constant name="ry8b_align" value="0.000000"/> + <constant name="ry9b_align" value="0.000000"/> + <constant name="ry10b_align" value="0.000000"/> + <constant name="rz1b_align" value="0.000000"/> + <constant name="rz2b_align" value="0.000000"/> + <constant name="rz3b_align" value="0.000000"/> + <constant name="rz4b_align" value="0.000000"/> + <constant name="rz5b_align" value="0.000000"/> + <constant name="rz6b_align" value="0.000000"/> + <constant name="rz7b_align" value="0.000000"/> + <constant name="rz8b_align" value="0.000000"/> + <constant name="rz9b_align" value="0.000000"/> + <constant name="rz10b_align" value="0.000000"/> <!-- Positions of sensor centers above/below nominal beam --> <constant name="y1t" value="36.894" /> @@ -606,134 +606,134 @@ <constant name="mod2_rx10b" value="mod_rx10b"/> <constant name="mod2_ry10b" value="mod_ry10b+y_rot_bot_pivot"/> <constant name="mod2_rz10b" value="mod_rz10b"/> - - <!-- final constants --> - <constant name="final_x1t" value="mod2_x1t+x1t_align"/> - <constant name="final_x2t" value="mod2_x2t+x2t_align"/> - <constant name="final_x3t" value="mod2_x3t+x3t_align"/> - <constant name="final_x4t" value="mod2_x4t+x4t_align"/> - <constant name="final_x5t" value="mod2_x5t+x5t_align"/> - <constant name="final_x6t" value="mod2_x6t+x6t_align"/> - <constant name="final_x7t" value="mod2_x7t+x7t_align"/> - <constant name="final_x8t" value="mod2_x8t+x8t_align"/> - <constant name="final_x9t" value="mod2_x9t+x9t_align"/> - <constant name="final_x10t" value="mod2_x10t+x10t_align"/> - <constant name="final_y1t" value="mod2_y1t+y1t_align"/> - <constant name="final_y2t" value="mod2_y2t+y2t_align"/> - <constant name="final_y3t" value="mod2_y3t+y3t_align"/> - <constant name="final_y4t" value="mod2_y4t+y4t_align"/> - <constant name="final_y5t" value="mod2_y5t+y5t_align"/> - <constant name="final_y6t" value="mod2_y6t+y6t_align"/> - <constant name="final_y7t" value="mod2_y7t+y7t_align"/> - <constant name="final_y8t" value="mod2_y8t+y8t_align"/> - <constant name="final_y9t" value="mod2_y9t+y9t_align"/> - <constant name="final_y10t" value="mod2_y10t+y10t_align"/> - <constant name="final_z1t" value="mod2_z1t+z1t_align"/> - <constant name="final_z2t" value="mod2_z2t+z2t_align"/> - <constant name="final_z3t" value="mod2_z3t+z3t_align"/> - <constant name="final_z4t" value="mod2_z4t+z4t_align"/> - <constant name="final_z5t" value="mod2_z5t+z5t_align"/> - <constant name="final_z6t" value="mod2_z6t+z6t_align"/> - <constant name="final_z7t" value="mod2_z7t+z7t_align"/> - <constant name="final_z8t" value="mod2_z8t+z8t_align"/> - <constant name="final_z9t" value="mod2_z9t+z9t_align"/> - <constant name="final_z10t" value="mod2_z10t+z10t_align"/> - <constant name="final_rx1t" value="mod2_rx1t+rx1t_align"/> - <constant name="final_rx2t" value="mod2_rx2t+rx2t_align"/> - <constant name="final_rx3t" value="mod2_rx3t+rx3t_align"/> - <constant name="final_rx4t" value="mod2_rx4t+rx4t_align"/> - <constant name="final_rx5t" value="mod2_rx5t+rx5t_align"/> - <constant name="final_rx6t" value="mod2_rx6t+rx6t_align"/> - <constant name="final_rx7t" value="mod2_rx7t+rx7t_align"/> - <constant name="final_rx8t" value="mod2_rx8t+rx8t_align"/> - <constant name="final_rx9t" value="mod2_rx9t+rx9t_align"/> - <constant name="final_rx10t" value="mod2_rx10t+rx10t_align"/> - <constant name="final_ry1t" value="mod2_ry1t+ry1t_align"/> - <constant name="final_ry2t" value="mod2_ry2t+ry2t_align"/> - <constant name="final_ry3t" value="mod2_ry3t+ry3t_align"/> - <constant name="final_ry4t" value="mod2_ry4t+ry4t_align"/> - <constant name="final_ry5t" value="mod2_ry5t+ry5t_align"/> - <constant name="final_ry6t" value="mod2_ry6t+ry6t_align"/> - <constant name="final_ry7t" value="mod2_ry7t+ry7t_align"/> - <constant name="final_ry8t" value="mod2_ry8t+ry8t_align"/> - <constant name="final_ry9t" value="mod2_ry9t+ry9t_align"/> - <constant name="final_ry10t" value="mod2_ry10t+ry10t_align"/> - <constant name="final_rz1t" value="mod2_rz1t+rz1t_align"/> - <constant name="final_rz2t" value="mod2_rz2t+rz2t_align"/> - <constant name="final_rz3t" value="mod2_rz3t+rz3t_align"/> - <constant name="final_rz4t" value="mod2_rz4t+rz4t_align"/> - <constant name="final_rz5t" value="mod2_rz5t+rz5t_align"/> - <constant name="final_rz6t" value="mod2_rz6t+rz6t_align"/> - <constant name="final_rz7t" value="mod2_rz7t+rz7t_align"/> - <constant name="final_rz8t" value="mod2_rz8t+rz8t_align"/> - <constant name="final_rz9t" value="mod2_rz9t+rz9t_align"/> - <constant name="final_rz10t" value="mod2_rz10t+rz10t_align"/> - <constant name="final_x1b" value="mod2_x1b+x1b_align"/> - <constant name="final_x2b" value="mod2_x2b+x2b_align"/> - <constant name="final_x3b" value="mod2_x3b+x3b_align"/> - <constant name="final_x4b" value="mod2_x4b+x4b_align"/> - <constant name="final_x5b" value="mod2_x5b+x5b_align"/> - <constant name="final_x6b" value="mod2_x6b+x6b_align"/> - <constant name="final_x7b" value="mod2_x7b+x7b_align"/> - <constant name="final_x8b" value="mod2_x8b+x8b_align"/> - <constant name="final_x9b" value="mod2_x9b+x9b_align"/> - <constant name="final_x10b" value="mod2_x10b+x10b_align"/> - <constant name="final_y1b" value="mod2_y1b+y1b_align"/> - <constant name="final_y2b" value="mod2_y2b+y2b_align"/> - <constant name="final_y3b" value="mod2_y3b+y3b_align"/> - <constant name="final_y4b" value="mod2_y4b+y4b_align"/> - <constant name="final_y5b" value="mod2_y5b+y5b_align"/> - <constant name="final_y6b" value="mod2_y6b+y6b_align"/> - <constant name="final_y7b" value="mod2_y7b+y7b_align"/> - <constant name="final_y8b" value="mod2_y8b+y8b_align"/> - <constant name="final_y9b" value="mod2_y9b+y9b_align"/> - <constant name="final_y10b" value="mod2_y10b+y10b_align"/> - <constant name="final_z1b" value="mod2_z1b+z1b_align"/> - <constant name="final_z2b" value="mod2_z2b+z2b_align"/> - <constant name="final_z3b" value="mod2_z3b+z3b_align"/> - <constant name="final_z4b" value="mod2_z4b+z4b_align"/> - <constant name="final_z5b" value="mod2_z5b+z5b_align"/> - <constant name="final_z6b" value="mod2_z6b+z6b_align"/> - <constant name="final_z7b" value="mod2_z7b+z7b_align"/> - <constant name="final_z8b" value="mod2_z8b+z8b_align"/> - <constant name="final_z9b" value="mod2_z9b+z9b_align"/> - <constant name="final_z10b" value="mod2_z10b+z10b_align"/> - <constant name="final_rx1b" value="mod2_rx1b+rx1b_align"/> - <constant name="final_rx2b" value="mod2_rx2b+rx2b_align"/> - <constant name="final_rx3b" value="mod2_rx3b+rx3b_align"/> - <constant name="final_rx4b" value="mod2_rx4b+rx4b_align"/> - <constant name="final_rx5b" value="mod2_rx5b+rx5b_align"/> - <constant name="final_rx6b" value="mod2_rx6b+rx6b_align"/> - <constant name="final_rx7b" value="mod2_rx7b+rx7b_align"/> - <constant name="final_rx8b" value="mod2_rx8b+rx8b_align"/> - <constant name="final_rx9b" value="mod2_rx9b+rx9b_align"/> - <constant name="final_rx10b" value="mod2_rx10b+rx10b_align"/> - <constant name="final_ry1b" value="mod2_ry1b+ry1b_align"/> - <constant name="final_ry2b" value="mod2_ry2b+ry2b_align"/> - <constant name="final_ry3b" value="mod2_ry3b+ry3b_align"/> - <constant name="final_ry4b" value="mod2_ry4b+ry4b_align"/> - <constant name="final_ry5b" value="mod2_ry5b+ry5b_align"/> - <constant name="final_ry6b" value="mod2_ry6b+ry6b_align"/> - <constant name="final_ry7b" value="mod2_ry7b+ry7b_align"/> - <constant name="final_ry8b" value="mod2_ry8b+ry8b_align"/> - <constant name="final_ry9b" value="mod2_ry9b+ry9b_align"/> - <constant name="final_ry10b" value="mod2_ry10b+ry10b_align"/> - <constant name="final_rz1b" value="mod2_rz1b+rz1b_align"/> - <constant name="final_rz2b" value="mod2_rz2b+rz2b_align"/> - <constant name="final_rz3b" value="mod2_rz3b+rz3b_align"/> - <constant name="final_rz4b" value="mod2_rz4b+rz4b_align"/> - <constant name="final_rz5b" value="mod2_rz5b+rz5b_align"/> - <constant name="final_rz6b" value="mod2_rz6b+rz6b_align"/> - <constant name="final_rz7b" value="mod2_rz7b+rz7b_align"/> - <constant name="final_rz8b" value="mod2_rz8b+rz8b_align"/> - <constant name="final_rz9b" value="mod2_rz9b+rz9b_align"/> - <constant name="final_rz10b" value="mod2_rz10b+rz10b_align"/> - - + + <!-- final constants --> + <constant name="final_x1t" value="mod2_x1t+x1t_align"/> + <constant name="final_x2t" value="mod2_x2t+x2t_align"/> + <constant name="final_x3t" value="mod2_x3t+x3t_align"/> + <constant name="final_x4t" value="mod2_x4t+x4t_align"/> + <constant name="final_x5t" value="mod2_x5t+x5t_align"/> + <constant name="final_x6t" value="mod2_x6t+x6t_align"/> + <constant name="final_x7t" value="mod2_x7t+x7t_align"/> + <constant name="final_x8t" value="mod2_x8t+x8t_align"/> + <constant name="final_x9t" value="mod2_x9t+x9t_align"/> + <constant name="final_x10t" value="mod2_x10t+x10t_align"/> + <constant name="final_y1t" value="mod2_y1t+y1t_align"/> + <constant name="final_y2t" value="mod2_y2t+y2t_align"/> + <constant name="final_y3t" value="mod2_y3t+y3t_align"/> + <constant name="final_y4t" value="mod2_y4t+y4t_align"/> + <constant name="final_y5t" value="mod2_y5t+y5t_align"/> + <constant name="final_y6t" value="mod2_y6t+y6t_align"/> + <constant name="final_y7t" value="mod2_y7t+y7t_align"/> + <constant name="final_y8t" value="mod2_y8t+y8t_align"/> + <constant name="final_y9t" value="mod2_y9t+y9t_align"/> + <constant name="final_y10t" value="mod2_y10t+y10t_align"/> + <constant name="final_z1t" value="mod2_z1t+z1t_align"/> + <constant name="final_z2t" value="mod2_z2t+z2t_align"/> + <constant name="final_z3t" value="mod2_z3t+z3t_align"/> + <constant name="final_z4t" value="mod2_z4t+z4t_align"/> + <constant name="final_z5t" value="mod2_z5t+z5t_align"/> + <constant name="final_z6t" value="mod2_z6t+z6t_align"/> + <constant name="final_z7t" value="mod2_z7t+z7t_align"/> + <constant name="final_z8t" value="mod2_z8t+z8t_align"/> + <constant name="final_z9t" value="mod2_z9t+z9t_align"/> + <constant name="final_z10t" value="mod2_z10t+z10t_align"/> + <constant name="final_rx1t" value="mod2_rx1t+rx1t_align"/> + <constant name="final_rx2t" value="mod2_rx2t+rx2t_align"/> + <constant name="final_rx3t" value="mod2_rx3t+rx3t_align"/> + <constant name="final_rx4t" value="mod2_rx4t+rx4t_align"/> + <constant name="final_rx5t" value="mod2_rx5t+rx5t_align"/> + <constant name="final_rx6t" value="mod2_rx6t+rx6t_align"/> + <constant name="final_rx7t" value="mod2_rx7t+rx7t_align"/> + <constant name="final_rx8t" value="mod2_rx8t+rx8t_align"/> + <constant name="final_rx9t" value="mod2_rx9t+rx9t_align"/> + <constant name="final_rx10t" value="mod2_rx10t+rx10t_align"/> + <constant name="final_ry1t" value="mod2_ry1t+ry1t_align"/> + <constant name="final_ry2t" value="mod2_ry2t+ry2t_align"/> + <constant name="final_ry3t" value="mod2_ry3t+ry3t_align"/> + <constant name="final_ry4t" value="mod2_ry4t+ry4t_align"/> + <constant name="final_ry5t" value="mod2_ry5t+ry5t_align"/> + <constant name="final_ry6t" value="mod2_ry6t+ry6t_align"/> + <constant name="final_ry7t" value="mod2_ry7t+ry7t_align"/> + <constant name="final_ry8t" value="mod2_ry8t+ry8t_align"/> + <constant name="final_ry9t" value="mod2_ry9t+ry9t_align"/> + <constant name="final_ry10t" value="mod2_ry10t+ry10t_align"/> + <constant name="final_rz1t" value="mod2_rz1t+rz1t_align"/> + <constant name="final_rz2t" value="mod2_rz2t+rz2t_align"/> + <constant name="final_rz3t" value="mod2_rz3t+rz3t_align"/> + <constant name="final_rz4t" value="mod2_rz4t+rz4t_align"/> + <constant name="final_rz5t" value="mod2_rz5t+rz5t_align"/> + <constant name="final_rz6t" value="mod2_rz6t+rz6t_align"/> + <constant name="final_rz7t" value="mod2_rz7t+rz7t_align"/> + <constant name="final_rz8t" value="mod2_rz8t+rz8t_align"/> + <constant name="final_rz9t" value="mod2_rz9t+rz9t_align"/> + <constant name="final_rz10t" value="mod2_rz10t+rz10t_align"/> + <constant name="final_x1b" value="mod2_x1b+x1b_align"/> + <constant name="final_x2b" value="mod2_x2b+x2b_align"/> + <constant name="final_x3b" value="mod2_x3b+x3b_align"/> + <constant name="final_x4b" value="mod2_x4b+x4b_align"/> + <constant name="final_x5b" value="mod2_x5b+x5b_align"/> + <constant name="final_x6b" value="mod2_x6b+x6b_align"/> + <constant name="final_x7b" value="mod2_x7b+x7b_align"/> + <constant name="final_x8b" value="mod2_x8b+x8b_align"/> + <constant name="final_x9b" value="mod2_x9b+x9b_align"/> + <constant name="final_x10b" value="mod2_x10b+x10b_align"/> + <constant name="final_y1b" value="mod2_y1b+y1b_align"/> + <constant name="final_y2b" value="mod2_y2b+y2b_align"/> + <constant name="final_y3b" value="mod2_y3b+y3b_align"/> + <constant name="final_y4b" value="mod2_y4b+y4b_align"/> + <constant name="final_y5b" value="mod2_y5b+y5b_align"/> + <constant name="final_y6b" value="mod2_y6b+y6b_align"/> + <constant name="final_y7b" value="mod2_y7b+y7b_align"/> + <constant name="final_y8b" value="mod2_y8b+y8b_align"/> + <constant name="final_y9b" value="mod2_y9b+y9b_align"/> + <constant name="final_y10b" value="mod2_y10b+y10b_align"/> + <constant name="final_z1b" value="mod2_z1b+z1b_align"/> + <constant name="final_z2b" value="mod2_z2b+z2b_align"/> + <constant name="final_z3b" value="mod2_z3b+z3b_align"/> + <constant name="final_z4b" value="mod2_z4b+z4b_align"/> + <constant name="final_z5b" value="mod2_z5b+z5b_align"/> + <constant name="final_z6b" value="mod2_z6b+z6b_align"/> + <constant name="final_z7b" value="mod2_z7b+z7b_align"/> + <constant name="final_z8b" value="mod2_z8b+z8b_align"/> + <constant name="final_z9b" value="mod2_z9b+z9b_align"/> + <constant name="final_z10b" value="mod2_z10b+z10b_align"/> + <constant name="final_rx1b" value="mod2_rx1b+rx1b_align"/> + <constant name="final_rx2b" value="mod2_rx2b+rx2b_align"/> + <constant name="final_rx3b" value="mod2_rx3b+rx3b_align"/> + <constant name="final_rx4b" value="mod2_rx4b+rx4b_align"/> + <constant name="final_rx5b" value="mod2_rx5b+rx5b_align"/> + <constant name="final_rx6b" value="mod2_rx6b+rx6b_align"/> + <constant name="final_rx7b" value="mod2_rx7b+rx7b_align"/> + <constant name="final_rx8b" value="mod2_rx8b+rx8b_align"/> + <constant name="final_rx9b" value="mod2_rx9b+rx9b_align"/> + <constant name="final_rx10b" value="mod2_rx10b+rx10b_align"/> + <constant name="final_ry1b" value="mod2_ry1b+ry1b_align"/> + <constant name="final_ry2b" value="mod2_ry2b+ry2b_align"/> + <constant name="final_ry3b" value="mod2_ry3b+ry3b_align"/> + <constant name="final_ry4b" value="mod2_ry4b+ry4b_align"/> + <constant name="final_ry5b" value="mod2_ry5b+ry5b_align"/> + <constant name="final_ry6b" value="mod2_ry6b+ry6b_align"/> + <constant name="final_ry7b" value="mod2_ry7b+ry7b_align"/> + <constant name="final_ry8b" value="mod2_ry8b+ry8b_align"/> + <constant name="final_ry9b" value="mod2_ry9b+ry9b_align"/> + <constant name="final_ry10b" value="mod2_ry10b+ry10b_align"/> + <constant name="final_rz1b" value="mod2_rz1b+rz1b_align"/> + <constant name="final_rz2b" value="mod2_rz2b+rz2b_align"/> + <constant name="final_rz3b" value="mod2_rz3b+rz3b_align"/> + <constant name="final_rz4b" value="mod2_rz4b+rz4b_align"/> + <constant name="final_rz5b" value="mod2_rz5b+rz5b_align"/> + <constant name="final_rz6b" value="mod2_rz6b+rz6b_align"/> + <constant name="final_rz7b" value="mod2_rz7b+rz7b_align"/> + <constant name="final_rz8b" value="mod2_rz8b+rz8b_align"/> + <constant name="final_rz9b" value="mod2_rz9b+rz9b_align"/> + <constant name="final_rz10b" value="mod2_rz10b+rz10b_align"/> + + </define> <materials> - <!-- Set the world material to vacuum. --> + <!-- Set the world material to vacuum. --> <material name="WorldMaterial"> <D type="density" unit="g/cm3" value="0.0000000000000001"/> <fraction n="1.0" ref="Vacuum" /> @@ -822,7 +822,7 @@ </layer> <layer id="2"> <module_placement name="TestRunModuleFieldDef" id="0" x="0" y="0" z="dipoleMagnetPositionZ+dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/> - </layer> + </layer> </detector> <detector id="13" name="Ecal" type="HPSEcal3" insideTrackingVolume="false" readout="EcalHits" vis="ECALVis"> Modified: java/trunk/detector-data/detectors/HPS-TestRun-v7-3/compact.xml ============================================================================= --- java/trunk/detector-data/detectors/HPS-TestRun-v7-3/compact.xml (original) +++ java/trunk/detector-data/detectors/HPS-TestRun-v7-3/compact.xml Wed Mar 9 11:43:24 2016 @@ -84,127 +84,127 @@ <constant name="y9b_misalign" value="0.0" /> <constant name="y10b_misalign" value="0.0" /> - <!-- alignment corrections --> - <constant name="x1t_align" value="0.000000" /> - <constant name="x2t_align" value="-0.000000" /> - <constant name="x3t_align" value="-0.000012" /> - <constant name="x4t_align" value="-0.017488" /> - <constant name="x5t_align" value="-0.000064" /> - <constant name="x6t_align" value="-0.000141" /> - <constant name="x7t_align" value="0.000002" /> - <constant name="x8t_align" value="0.000573" /> - <constant name="x9t_align" value="0.000000" /> - <constant name="x10t_align" value="-0.000000" /> - <constant name="y1t_align" value="0.000000" /> - <constant name="y2t_align" value="0.000000" /> - <constant name="y3t_align" value="-0.094679" /> - <constant name="y4t_align" value="-0.174440" /> - <constant name="y5t_align" value="0.118670" /> - <constant name="y6t_align" value="-0.001400" /> - <constant name="y7t_align" value="0.047526" /> - <constant name="y8t_align" value="0.011511" /> - <constant name="y9t_align" value="0.000000" /> - <constant name="y10t_align" value="0.000000" /> - <constant name="z1t_align" value="0.000000" /> - <constant name="z2t_align" value="0.000000" /> - <constant name="z3t_align" value="-0.002463" /> - <constant name="z4t_align" value="-0.003986" /> - <constant name="z5t_align" value="0.003089" /> - <constant name="z6t_align" value="-0.000032" /> - <constant name="z7t_align" value="0.001236" /> - <constant name="z8t_align" value="0.000281" /> - <constant name="z9t_align" value="0.000000" /> - <constant name="z10t_align" value="0.000000" /> - <constant name="rx1t_align" value="0.000000" /> - <constant name="rx2t_align" value="-0.000000" /> - <constant name="rx3t_align" value="0.000000" /> - <constant name="rx4t_align" value="-0.000000" /> - <constant name="rx5t_align" value="0.000000" /> - <constant name="rx6t_align" value="-0.000000" /> - <constant name="rx7t_align" value="0.000000" /> - <constant name="rx8t_align" value="-0.000000" /> - <constant name="rx9t_align" value="0.000000" /> - <constant name="rx10t_align" value="-0.000000" /> - <constant name="ry1t_align" value="0.000000" /> - <constant name="ry2t_align" value="0.000000" /> - <constant name="ry3t_align" value="0.000000" /> - <constant name="ry4t_align" value="0.000000" /> - <constant name="ry5t_align" value="0.000000" /> - <constant name="ry6t_align" value="0.000000" /> - <constant name="ry7t_align" value="0.000000" /> - <constant name="ry8t_align" value="0.000000" /> - <constant name="ry9t_align" value="0.000000" /> - <constant name="ry10t_align" value="0.000000" /> - <constant name="rz1t_align" value="0.000000" /> - <constant name="rz2t_align" value="0.000000" /> - <constant name="rz3t_align" value="0.000000" /> - <constant name="rz4t_align" value="0.000000" /> - <constant name="rz5t_align" value="0.000000" /> - <constant name="rz6t_align" value="0.000000" /> - <constant name="rz7t_align" value="0.000000" /> - <constant name="rz8t_align" value="0.000000" /> - <constant name="rz9t_align" value="0.000000" /> - <constant name="rz10t_align" value="0.000000" /> - <constant name="x1b_align" value="0.000000" /> - <constant name="x2b_align" value="-0.000000" /> - <constant name="x3b_align" value="-0.068351" /> - <constant name="x4b_align" value="0.000012" /> - <constant name="x5b_align" value="-0.100385" /> - <constant name="x6b_align" value="0.000012" /> - <constant name="x7b_align" value="-0.025606" /> - <constant name="x8b_align" value="0.000007" /> - <constant name="x9b_align" value="0.000000" /> - <constant name="x10b_align" value="-0.000000" /> - <constant name="y1b_align" value="0.000000" /> - <constant name="y2b_align" value="0.000000" /> - <constant name="y3b_align" value="0.681109" /> - <constant name="y4b_align" value="0.061551" /> - <constant name="y5b_align" value="1.004204" /> - <constant name="y6b_align" value="0.037831" /> - <constant name="y7b_align" value="0.506463" /> - <constant name="y8b_align" value="0.015775" /> - <constant name="y9b_align" value="0.000000" /> - <constant name="y10b_align" value="0.000000" /> - <constant name="z1b_align" value="0.000000" /> - <constant name="z2b_align" value="0.000000" /> - <constant name="z3b_align" value="-0.013322" /> - <constant name="z4b_align" value="-0.001371" /> - <constant name="z5b_align" value="-0.019651" /> - <constant name="z6b_align" value="-0.000843" /> - <constant name="z7b_align" value="-0.010587" /> - <constant name="z8b_align" value="-0.000352" /> - <constant name="z9b_align" value="0.000000" /> - <constant name="z10b_align" value="0.000000" /> - <constant name="rx1b_align" value="0.000000" /> - <constant name="rx2b_align" value="-0.000000" /> - <constant name="rx3b_align" value="0.000000" /> - <constant name="rx4b_align" value="-0.000000" /> - <constant name="rx5b_align" value="0.000000" /> - <constant name="rx6b_align" value="-0.000000" /> - <constant name="rx7b_align" value="0.000000" /> - <constant name="rx8b_align" value="-0.000000" /> - <constant name="rx9b_align" value="0.000000" /> - <constant name="rx10b_align" value="-0.000000" /> - <constant name="ry1b_align" value="0.000000" /> - <constant name="ry2b_align" value="0.000000" /> - <constant name="ry3b_align" value="0.000000" /> - <constant name="ry4b_align" value="0.000000" /> - <constant name="ry5b_align" value="0.000000" /> - <constant name="ry6b_align" value="0.000000" /> - <constant name="ry7b_align" value="0.000000" /> - <constant name="ry8b_align" value="0.000000" /> - <constant name="ry9b_align" value="0.000000" /> - <constant name="ry10b_align" value="0.000000" /> - <constant name="rz1b_align" value="0.000000" /> - <constant name="rz2b_align" value="0.000000" /> - <constant name="rz3b_align" value="0.000000" /> - <constant name="rz4b_align" value="0.000000" /> - <constant name="rz5b_align" value="0.000000" /> - <constant name="rz6b_align" value="0.000000" /> - <constant name="rz7b_align" value="0.000000" /> - <constant name="rz8b_align" value="0.000000" /> - <constant name="rz9b_align" value="0.000000" /> - <constant name="rz10b_align" value="0.000000" /> + <!-- alignment corrections --> + <constant name="x1t_align" value="0.000000" /> + <constant name="x2t_align" value="-0.000000" /> + <constant name="x3t_align" value="-0.000012" /> + <constant name="x4t_align" value="-0.017488" /> + <constant name="x5t_align" value="-0.000064" /> + <constant name="x6t_align" value="-0.000141" /> + <constant name="x7t_align" value="0.000002" /> + <constant name="x8t_align" value="0.000573" /> + <constant name="x9t_align" value="0.000000" /> + <constant name="x10t_align" value="-0.000000" /> + <constant name="y1t_align" value="0.000000" /> + <constant name="y2t_align" value="0.000000" /> + <constant name="y3t_align" value="-0.094679" /> + <constant name="y4t_align" value="-0.174440" /> + <constant name="y5t_align" value="0.118670" /> + <constant name="y6t_align" value="-0.001400" /> + <constant name="y7t_align" value="0.047526" /> + <constant name="y8t_align" value="0.011511" /> + <constant name="y9t_align" value="0.000000" /> + <constant name="y10t_align" value="0.000000" /> + <constant name="z1t_align" value="0.000000" /> + <constant name="z2t_align" value="0.000000" /> + <constant name="z3t_align" value="-0.002463" /> + <constant name="z4t_align" value="-0.003986" /> + <constant name="z5t_align" value="0.003089" /> + <constant name="z6t_align" value="-0.000032" /> + <constant name="z7t_align" value="0.001236" /> + <constant name="z8t_align" value="0.000281" /> + <constant name="z9t_align" value="0.000000" /> + <constant name="z10t_align" value="0.000000" /> + <constant name="rx1t_align" value="0.000000" /> + <constant name="rx2t_align" value="-0.000000" /> + <constant name="rx3t_align" value="0.000000" /> + <constant name="rx4t_align" value="-0.000000" /> + <constant name="rx5t_align" value="0.000000" /> + <constant name="rx6t_align" value="-0.000000" /> + <constant name="rx7t_align" value="0.000000" /> + <constant name="rx8t_align" value="-0.000000" /> + <constant name="rx9t_align" value="0.000000" /> + <constant name="rx10t_align" value="-0.000000" /> + <constant name="ry1t_align" value="0.000000" /> + <constant name="ry2t_align" value="0.000000" /> + <constant name="ry3t_align" value="0.000000" /> + <constant name="ry4t_align" value="0.000000" /> + <constant name="ry5t_align" value="0.000000" /> + <constant name="ry6t_align" value="0.000000" /> + <constant name="ry7t_align" value="0.000000" /> + <constant name="ry8t_align" value="0.000000" /> + <constant name="ry9t_align" value="0.000000" /> + <constant name="ry10t_align" value="0.000000" /> + <constant name="rz1t_align" value="0.000000" /> + <constant name="rz2t_align" value="0.000000" /> + <constant name="rz3t_align" value="0.000000" /> + <constant name="rz4t_align" value="0.000000" /> + <constant name="rz5t_align" value="0.000000" /> + <constant name="rz6t_align" value="0.000000" /> + <constant name="rz7t_align" value="0.000000" /> + <constant name="rz8t_align" value="0.000000" /> + <constant name="rz9t_align" value="0.000000" /> + <constant name="rz10t_align" value="0.000000" /> + <constant name="x1b_align" value="0.000000" /> + <constant name="x2b_align" value="-0.000000" /> + <constant name="x3b_align" value="-0.068351" /> + <constant name="x4b_align" value="0.000012" /> + <constant name="x5b_align" value="-0.100385" /> + <constant name="x6b_align" value="0.000012" /> + <constant name="x7b_align" value="-0.025606" /> + <constant name="x8b_align" value="0.000007" /> + <constant name="x9b_align" value="0.000000" /> + <constant name="x10b_align" value="-0.000000" /> + <constant name="y1b_align" value="0.000000" /> + <constant name="y2b_align" value="0.000000" /> + <constant name="y3b_align" value="0.681109" /> + <constant name="y4b_align" value="0.061551" /> + <constant name="y5b_align" value="1.004204" /> + <constant name="y6b_align" value="0.037831" /> + <constant name="y7b_align" value="0.506463" /> + <constant name="y8b_align" value="0.015775" /> + <constant name="y9b_align" value="0.000000" /> + <constant name="y10b_align" value="0.000000" /> + <constant name="z1b_align" value="0.000000" /> + <constant name="z2b_align" value="0.000000" /> + <constant name="z3b_align" value="-0.013322" /> + <constant name="z4b_align" value="-0.001371" /> + <constant name="z5b_align" value="-0.019651" /> + <constant name="z6b_align" value="-0.000843" /> + <constant name="z7b_align" value="-0.010587" /> + <constant name="z8b_align" value="-0.000352" /> + <constant name="z9b_align" value="0.000000" /> + <constant name="z10b_align" value="0.000000" /> + <constant name="rx1b_align" value="0.000000" /> + <constant name="rx2b_align" value="-0.000000" /> + <constant name="rx3b_align" value="0.000000" /> + <constant name="rx4b_align" value="-0.000000" /> + <constant name="rx5b_align" value="0.000000" /> + <constant name="rx6b_align" value="-0.000000" /> + <constant name="rx7b_align" value="0.000000" /> + <constant name="rx8b_align" value="-0.000000" /> + <constant name="rx9b_align" value="0.000000" /> + <constant name="rx10b_align" value="-0.000000" /> + <constant name="ry1b_align" value="0.000000" /> + <constant name="ry2b_align" value="0.000000" /> + <constant name="ry3b_align" value="0.000000" /> + <constant name="ry4b_align" value="0.000000" /> + <constant name="ry5b_align" value="0.000000" /> + <constant name="ry6b_align" value="0.000000" /> + <constant name="ry7b_align" value="0.000000" /> + <constant name="ry8b_align" value="0.000000" /> + <constant name="ry9b_align" value="0.000000" /> + <constant name="ry10b_align" value="0.000000" /> + <constant name="rz1b_align" value="0.000000" /> + <constant name="rz2b_align" value="0.000000" /> + <constant name="rz3b_align" value="0.000000" /> + <constant name="rz4b_align" value="0.000000" /> + <constant name="rz5b_align" value="0.000000" /> + <constant name="rz6b_align" value="0.000000" /> + <constant name="rz7b_align" value="0.000000" /> + <constant name="rz8b_align" value="0.000000" /> + <constant name="rz9b_align" value="0.000000" /> + <constant name="rz10b_align" value="0.000000" /> <!-- Positions of sensor centers above/below nominal beam --> <constant name="y1t" value="36.894" /> @@ -604,134 +604,134 @@ <constant name="mod2_rx10b" value="mod_rx10b" /> <constant name="mod2_ry10b" value="mod_ry10b+y_rot_bot_pivot" /> <constant name="mod2_rz10b" value="mod_rz10b" /> - - <!-- final constants --> - <constant name="final_x1t" value="mod2_x1t+x1t_align" /> - <constant name="final_x2t" value="mod2_x2t+x2t_align" /> - <constant name="final_x3t" value="mod2_x3t+x3t_align" /> - <constant name="final_x4t" value="mod2_x4t+x4t_align" /> - <constant name="final_x5t" value="mod2_x5t+x5t_align" /> - <constant name="final_x6t" value="mod2_x6t+x6t_align" /> - <constant name="final_x7t" value="mod2_x7t+x7t_align" /> - <constant name="final_x8t" value="mod2_x8t+x8t_align" /> - <constant name="final_x9t" value="mod2_x9t+x9t_align" /> - <constant name="final_x10t" value="mod2_x10t+x10t_align" /> - <constant name="final_y1t" value="mod2_y1t+y1t_align" /> - <constant name="final_y2t" value="mod2_y2t+y2t_align" /> - <constant name="final_y3t" value="mod2_y3t+y3t_align" /> - <constant name="final_y4t" value="mod2_y4t+y4t_align" /> - <constant name="final_y5t" value="mod2_y5t+y5t_align" /> - <constant name="final_y6t" value="mod2_y6t+y6t_align" /> - <constant name="final_y7t" value="mod2_y7t+y7t_align" /> - <constant name="final_y8t" value="mod2_y8t+y8t_align" /> - <constant name="final_y9t" value="mod2_y9t+y9t_align" /> - <constant name="final_y10t" value="mod2_y10t+y10t_align" /> - <constant name="final_z1t" value="mod2_z1t+z1t_align" /> - <constant name="final_z2t" value="mod2_z2t+z2t_align" /> - <constant name="final_z3t" value="mod2_z3t+z3t_align" /> - <constant name="final_z4t" value="mod2_z4t+z4t_align" /> - <constant name="final_z5t" value="mod2_z5t+z5t_align" /> - <constant name="final_z6t" value="mod2_z6t+z6t_align" /> - <constant name="final_z7t" value="mod2_z7t+z7t_align" /> - <constant name="final_z8t" value="mod2_z8t+z8t_align" /> - <constant name="final_z9t" value="mod2_z9t+z9t_align" /> - <constant name="final_z10t" value="mod2_z10t+z10t_align" /> - <constant name="final_rx1t" value="mod2_rx1t+rx1t_align" /> - <constant name="final_rx2t" value="mod2_rx2t+rx2t_align" /> - <constant name="final_rx3t" value="mod2_rx3t+rx3t_align" /> - <constant name="final_rx4t" value="mod2_rx4t+rx4t_align" /> - <constant name="final_rx5t" value="mod2_rx5t+rx5t_align" /> - <constant name="final_rx6t" value="mod2_rx6t+rx6t_align" /> - <constant name="final_rx7t" value="mod2_rx7t+rx7t_align" /> - <constant name="final_rx8t" value="mod2_rx8t+rx8t_align" /> - <constant name="final_rx9t" value="mod2_rx9t+rx9t_align" /> - <constant name="final_rx10t" value="mod2_rx10t+rx10t_align" /> - <constant name="final_ry1t" value="mod2_ry1t+ry1t_align" /> - <constant name="final_ry2t" value="mod2_ry2t+ry2t_align" /> - <constant name="final_ry3t" value="mod2_ry3t+ry3t_align" /> - <constant name="final_ry4t" value="mod2_ry4t+ry4t_align" /> - <constant name="final_ry5t" value="mod2_ry5t+ry5t_align" /> - <constant name="final_ry6t" value="mod2_ry6t+ry6t_align" /> - <constant name="final_ry7t" value="mod2_ry7t+ry7t_align" /> - <constant name="final_ry8t" value="mod2_ry8t+ry8t_align" /> - <constant name="final_ry9t" value="mod2_ry9t+ry9t_align" /> - <constant name="final_ry10t" value="mod2_ry10t+ry10t_align" /> - <constant name="final_rz1t" value="mod2_rz1t+rz1t_align" /> - <constant name="final_rz2t" value="mod2_rz2t+rz2t_align" /> - <constant name="final_rz3t" value="mod2_rz3t+rz3t_align" /> - <constant name="final_rz4t" value="mod2_rz4t+rz4t_align" /> - <constant name="final_rz5t" value="mod2_rz5t+rz5t_align" /> - <constant name="final_rz6t" value="mod2_rz6t+rz6t_align" /> - <constant name="final_rz7t" value="mod2_rz7t+rz7t_align" /> - <constant name="final_rz8t" value="mod2_rz8t+rz8t_align" /> - <constant name="final_rz9t" value="mod2_rz9t+rz9t_align" /> - <constant name="final_rz10t" value="mod2_rz10t+rz10t_align" /> - <constant name="final_x1b" value="mod2_x1b+x1b_align" /> - <constant name="final_x2b" value="mod2_x2b+x2b_align" /> - <constant name="final_x3b" value="mod2_x3b+x3b_align" /> - <constant name="final_x4b" value="mod2_x4b+x4b_align" /> - <constant name="final_x5b" value="mod2_x5b+x5b_align" /> - <constant name="final_x6b" value="mod2_x6b+x6b_align" /> - <constant name="final_x7b" value="mod2_x7b+x7b_align" /> - <constant name="final_x8b" value="mod2_x8b+x8b_align" /> - <constant name="final_x9b" value="mod2_x9b+x9b_align" /> - <constant name="final_x10b" value="mod2_x10b+x10b_align" /> - <constant name="final_y1b" value="mod2_y1b+y1b_align" /> - <constant name="final_y2b" value="mod2_y2b+y2b_align" /> - <constant name="final_y3b" value="mod2_y3b+y3b_align" /> - <constant name="final_y4b" value="mod2_y4b+y4b_align" /> - <constant name="final_y5b" value="mod2_y5b+y5b_align" /> - <constant name="final_y6b" value="mod2_y6b+y6b_align" /> - <constant name="final_y7b" value="mod2_y7b+y7b_align" /> - <constant name="final_y8b" value="mod2_y8b+y8b_align" /> - <constant name="final_y9b" value="mod2_y9b+y9b_align" /> - <constant name="final_y10b" value="mod2_y10b+y10b_align" /> - <constant name="final_z1b" value="mod2_z1b+z1b_align" /> - <constant name="final_z2b" value="mod2_z2b+z2b_align" /> - <constant name="final_z3b" value="mod2_z3b+z3b_align" /> - <constant name="final_z4b" value="mod2_z4b+z4b_align" /> - <constant name="final_z5b" value="mod2_z5b+z5b_align" /> - <constant name="final_z6b" value="mod2_z6b+z6b_align" /> - <constant name="final_z7b" value="mod2_z7b+z7b_align" /> - <constant name="final_z8b" value="mod2_z8b+z8b_align" /> - <constant name="final_z9b" value="mod2_z9b+z9b_align" /> - <constant name="final_z10b" value="mod2_z10b+z10b_align" /> - <constant name="final_rx1b" value="mod2_rx1b+rx1b_align" /> - <constant name="final_rx2b" value="mod2_rx2b+rx2b_align" /> - <constant name="final_rx3b" value="mod2_rx3b+rx3b_align" /> - <constant name="final_rx4b" value="mod2_rx4b+rx4b_align" /> - <constant name="final_rx5b" value="mod2_rx5b+rx5b_align" /> - <constant name="final_rx6b" value="mod2_rx6b+rx6b_align" /> - <constant name="final_rx7b" value="mod2_rx7b+rx7b_align" /> - <constant name="final_rx8b" value="mod2_rx8b+rx8b_align" /> - <constant name="final_rx9b" value="mod2_rx9b+rx9b_align" /> - <constant name="final_rx10b" value="mod2_rx10b+rx10b_align" /> - <constant name="final_ry1b" value="mod2_ry1b+ry1b_align" /> - <constant name="final_ry2b" value="mod2_ry2b+ry2b_align" /> - <constant name="final_ry3b" value="mod2_ry3b+ry3b_align" /> - <constant name="final_ry4b" value="mod2_ry4b+ry4b_align" /> - <constant name="final_ry5b" value="mod2_ry5b+ry5b_align" /> - <constant name="final_ry6b" value="mod2_ry6b+ry6b_align" /> - <constant name="final_ry7b" value="mod2_ry7b+ry7b_align" /> - <constant name="final_ry8b" value="mod2_ry8b+ry8b_align" /> - <constant name="final_ry9b" value="mod2_ry9b+ry9b_align" /> - <constant name="final_ry10b" value="mod2_ry10b+ry10b_align" /> - <constant name="final_rz1b" value="mod2_rz1b+rz1b_align" /> - <constant name="final_rz2b" value="mod2_rz2b+rz2b_align" /> - <constant name="final_rz3b" value="mod2_rz3b+rz3b_align" /> - <constant name="final_rz4b" value="mod2_rz4b+rz4b_align" /> - <constant name="final_rz5b" value="mod2_rz5b+rz5b_align" /> - <constant name="final_rz6b" value="mod2_rz6b+rz6b_align" /> - <constant name="final_rz7b" value="mod2_rz7b+rz7b_align" /> - <constant name="final_rz8b" value="mod2_rz8b+rz8b_align" /> - <constant name="final_rz9b" value="mod2_rz9b+rz9b_align" /> - <constant name="final_rz10b" value="mod2_rz10b+rz10b_align" /> - - + + <!-- final constants --> + <constant name="final_x1t" value="mod2_x1t+x1t_align" /> + <constant name="final_x2t" value="mod2_x2t+x2t_align" /> + <constant name="final_x3t" value="mod2_x3t+x3t_align" /> + <constant name="final_x4t" value="mod2_x4t+x4t_align" /> + <constant name="final_x5t" value="mod2_x5t+x5t_align" /> + <constant name="final_x6t" value="mod2_x6t+x6t_align" /> + <constant name="final_x7t" value="mod2_x7t+x7t_align" /> + <constant name="final_x8t" value="mod2_x8t+x8t_align" /> + <constant name="final_x9t" value="mod2_x9t+x9t_align" /> + <constant name="final_x10t" value="mod2_x10t+x10t_align" /> + <constant name="final_y1t" value="mod2_y1t+y1t_align" /> + <constant name="final_y2t" value="mod2_y2t+y2t_align" /> + <constant name="final_y3t" value="mod2_y3t+y3t_align" /> + <constant name="final_y4t" value="mod2_y4t+y4t_align" /> + <constant name="final_y5t" value="mod2_y5t+y5t_align" /> + <constant name="final_y6t" value="mod2_y6t+y6t_align" /> + <constant name="final_y7t" value="mod2_y7t+y7t_align" /> + <constant name="final_y8t" value="mod2_y8t+y8t_align" /> + <constant name="final_y9t" value="mod2_y9t+y9t_align" /> + <constant name="final_y10t" value="mod2_y10t+y10t_align" /> + <constant name="final_z1t" value="mod2_z1t+z1t_align" /> + <constant name="final_z2t" value="mod2_z2t+z2t_align" /> + <constant name="final_z3t" value="mod2_z3t+z3t_align" /> + <constant name="final_z4t" value="mod2_z4t+z4t_align" /> + <constant name="final_z5t" value="mod2_z5t+z5t_align" /> + <constant name="final_z6t" value="mod2_z6t+z6t_align" /> + <constant name="final_z7t" value="mod2_z7t+z7t_align" /> + <constant name="final_z8t" value="mod2_z8t+z8t_align" /> + <constant name="final_z9t" value="mod2_z9t+z9t_align" /> + <constant name="final_z10t" value="mod2_z10t+z10t_align" /> + <constant name="final_rx1t" value="mod2_rx1t+rx1t_align" /> + <constant name="final_rx2t" value="mod2_rx2t+rx2t_align" /> + <constant name="final_rx3t" value="mod2_rx3t+rx3t_align" /> + <constant name="final_rx4t" value="mod2_rx4t+rx4t_align" /> + <constant name="final_rx5t" value="mod2_rx5t+rx5t_align" /> + <constant name="final_rx6t" value="mod2_rx6t+rx6t_align" /> + <constant name="final_rx7t" value="mod2_rx7t+rx7t_align" /> + <constant name="final_rx8t" value="mod2_rx8t+rx8t_align" /> + <constant name="final_rx9t" value="mod2_rx9t+rx9t_align" /> + <constant name="final_rx10t" value="mod2_rx10t+rx10t_align" /> + <constant name="final_ry1t" value="mod2_ry1t+ry1t_align" /> + <constant name="final_ry2t" value="mod2_ry2t+ry2t_align" /> + <constant name="final_ry3t" value="mod2_ry3t+ry3t_align" /> + <constant name="final_ry4t" value="mod2_ry4t+ry4t_align" /> + <constant name="final_ry5t" value="mod2_ry5t+ry5t_align" /> + <constant name="final_ry6t" value="mod2_ry6t+ry6t_align" /> + <constant name="final_ry7t" value="mod2_ry7t+ry7t_align" /> + <constant name="final_ry8t" value="mod2_ry8t+ry8t_align" /> + <constant name="final_ry9t" value="mod2_ry9t+ry9t_align" /> + <constant name="final_ry10t" value="mod2_ry10t+ry10t_align" /> + <constant name="final_rz1t" value="mod2_rz1t+rz1t_align" /> + <constant name="final_rz2t" value="mod2_rz2t+rz2t_align" /> + <constant name="final_rz3t" value="mod2_rz3t+rz3t_align" /> + <constant name="final_rz4t" value="mod2_rz4t+rz4t_align" /> + <constant name="final_rz5t" value="mod2_rz5t+rz5t_align" /> + <constant name="final_rz6t" value="mod2_rz6t+rz6t_align" /> + <constant name="final_rz7t" value="mod2_rz7t+rz7t_align" /> + <constant name="final_rz8t" value="mod2_rz8t+rz8t_align" /> + <constant name="final_rz9t" value="mod2_rz9t+rz9t_align" /> + <constant name="final_rz10t" value="mod2_rz10t+rz10t_align" /> + <constant name="final_x1b" value="mod2_x1b+x1b_align" /> + <constant name="final_x2b" value="mod2_x2b+x2b_align" /> + <constant name="final_x3b" value="mod2_x3b+x3b_align" /> + <constant name="final_x4b" value="mod2_x4b+x4b_align" /> + <constant name="final_x5b" value="mod2_x5b+x5b_align" /> + <constant name="final_x6b" value="mod2_x6b+x6b_align" /> + <constant name="final_x7b" value="mod2_x7b+x7b_align" /> + <constant name="final_x8b" value="mod2_x8b+x8b_align" /> + <constant name="final_x9b" value="mod2_x9b+x9b_align" /> + <constant name="final_x10b" value="mod2_x10b+x10b_align" /> + <constant name="final_y1b" value="mod2_y1b+y1b_align" /> + <constant name="final_y2b" value="mod2_y2b+y2b_align" /> + <constant name="final_y3b" value="mod2_y3b+y3b_align" /> + <constant name="final_y4b" value="mod2_y4b+y4b_align" /> + <constant name="final_y5b" value="mod2_y5b+y5b_align" /> + <constant name="final_y6b" value="mod2_y6b+y6b_align" /> + <constant name="final_y7b" value="mod2_y7b+y7b_align" /> + <constant name="final_y8b" value="mod2_y8b+y8b_align" /> + <constant name="final_y9b" value="mod2_y9b+y9b_align" /> + <constant name="final_y10b" value="mod2_y10b+y10b_align" /> + <constant name="final_z1b" value="mod2_z1b+z1b_align" /> + <constant name="final_z2b" value="mod2_z2b+z2b_align" /> + <constant name="final_z3b" value="mod2_z3b+z3b_align" /> + <constant name="final_z4b" value="mod2_z4b+z4b_align" /> + <constant name="final_z5b" value="mod2_z5b+z5b_align" /> + <constant name="final_z6b" value="mod2_z6b+z6b_align" /> + <constant name="final_z7b" value="mod2_z7b+z7b_align" /> + <constant name="final_z8b" value="mod2_z8b+z8b_align" /> + <constant name="final_z9b" value="mod2_z9b+z9b_align" /> + <constant name="final_z10b" value="mod2_z10b+z10b_align" /> + <constant name="final_rx1b" value="mod2_rx1b+rx1b_align" /> + <constant name="final_rx2b" value="mod2_rx2b+rx2b_align" /> + <constant name="final_rx3b" value="mod2_rx3b+rx3b_align" /> + <constant name="final_rx4b" value="mod2_rx4b+rx4b_align" /> + <constant name="final_rx5b" value="mod2_rx5b+rx5b_align" /> + <constant name="final_rx6b" value="mod2_rx6b+rx6b_align" /> + <constant name="final_rx7b" value="mod2_rx7b+rx7b_align" /> + <constant name="final_rx8b" value="mod2_rx8b+rx8b_align" /> + <constant name="final_rx9b" value="mod2_rx9b+rx9b_align" /> + <constant name="final_rx10b" value="mod2_rx10b+rx10b_align" /> + <constant name="final_ry1b" value="mod2_ry1b+ry1b_align" /> + <constant name="final_ry2b" value="mod2_ry2b+ry2b_align" /> + <constant name="final_ry3b" value="mod2_ry3b+ry3b_align" /> + <constant name="final_ry4b" value="mod2_ry4b+ry4b_align" /> + <constant name="final_ry5b" value="mod2_ry5b+ry5b_align" /> + <constant name="final_ry6b" value="mod2_ry6b+ry6b_align" /> + <constant name="final_ry7b" value="mod2_ry7b+ry7b_align" /> + <constant name="final_ry8b" value="mod2_ry8b+ry8b_align" /> + <constant name="final_ry9b" value="mod2_ry9b+ry9b_align" /> + <constant name="final_ry10b" value="mod2_ry10b+ry10b_align" /> + <constant name="final_rz1b" value="mod2_rz1b+rz1b_align" /> + <constant name="final_rz2b" value="mod2_rz2b+rz2b_align" /> + <constant name="final_rz3b" value="mod2_rz3b+rz3b_align" /> + <constant name="final_rz4b" value="mod2_rz4b+rz4b_align" /> + <constant name="final_rz5b" value="mod2_rz5b+rz5b_align" /> + <constant name="final_rz6b" value="mod2_rz6b+rz6b_align" /> + <constant name="final_rz7b" value="mod2_rz7b+rz7b_align" /> + <constant name="final_rz8b" value="mod2_rz8b+rz8b_align" /> + <constant name="final_rz9b" value="mod2_rz9b+rz9b_align" /> + <constant name="final_rz10b" value="mod2_rz10b+rz10b_align" /> + + </define> <materials> - <!-- Set the world material to vacuum. --> + <!-- Set the world material to vacuum. --> <material name="WorldMaterial"> <D type="density" unit="g/cm3" value="0.0000000000000001" /> <fraction n="1.0" ref="Vacuum" /> @@ -820,7 +820,7 @@ </layer> <layer id="2"> <module_placement name="TestRunModuleFieldDef" id="0" x="0" y="0" z="dipoleMagnetPositionZ+dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2" /> - </layer> + </layer> </detector> <detector id="13" name="Ecal" type="HPSEcal3" insideTrackingVolume="false" readout="EcalHits" vis="ECALVis"> Modified: java/trunk/detector-data/detectors/HPS-TestRun-v7/compact.xml ============================================================================= --- java/trunk/detector-data/detectors/HPS-TestRun-v7/compact.xml (original) +++ java/trunk/detector-data/detectors/HPS-TestRun-v7/compact.xml Wed Mar 9 11:43:24 2016 @@ -488,7 +488,7 @@ </define> <materials> - <!-- Set the world material to vacuum. --> + <!-- Set the world material to vacuum. --> <material name="WorldMaterial"> <D type="density" unit="g/cm3" value="0.0000000000000001"/> <fraction n="1.0" ref="Vacuum" /> @@ -577,7 +577,7 @@ </layer> <layer id="2"> <module_placement name="TestRunModuleFieldDef" id="0" x="0" y="0" z="dipoleMagnetPositionZ+dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/> - </layer> + </layer> </detector> <detector id="13" name="Ecal" type="HPSEcal3" insideTrackingVolume="false" readout="EcalHits" vis="ECALVis"> Modified: java/trunk/detector-data/detectors/HPS-TestRun-v8-4/compact.xml ============================================================================= --- java/trunk/detector-data/detectors/HPS-TestRun-v8-4/compact.xml (original) +++ java/trunk/detector-data/detectors/HPS-TestRun-v8-4/compact.xml Wed Mar 9 11:43:24 2016 @@ -3,9 +3,9 @@ <info name="HPS-TestRun-v8-4"> <comment> - HPS JLab Test Run detector with dipole field starting at z=0 - Alignment based on millepede: compact-u3-6-float-1351-v8-10k.xml - </comment> + HPS JLab Test Run detector with dipole field starting at z=0 + Alignment based on millepede: compact-u3-6-float-1351-v8-10k.xml + </comment> </info> <define> @@ -65,127 +65,127 @@ <!-- <constant name="x_off" value = "-15.0"/> --> <constant name="x_off" value="0.0" /> - <!-- alignment corrections --> - <constant name="x1t_align" value="0.000000" /> - <constant name="x2t_align" value="0.000000" /> - <constant name="x3t_align" value="0.000014" /> - <constant name="x4t_align" value="0.015024" /> - <constant name="x5t_align" value="0.000045" /> - <constant name="x6t_align" value="-0.003411" /> - <constant name="x7t_align" value="0.000000" /> - <constant name="x8t_align" value="0.000000" /> - <constant name="x9t_align" value="0.000000" /> - <constant name="x10t_align" value="0.000000" /> - <constant name="y1t_align" value="0.000000" /> - <constant name="y2t_align" value="0.000000" /> - <constant name="y3t_align" value="0.112932" /> - <constant name="y4t_align" value="0.149860" /> - <constant name="y5t_align" value="-0.082467" /> - <constant name="y6t_align" value="-0.033966" /> - <constant name="y7t_align" value="0.000000" /> - <constant name="y8t_align" value="0.000000" /> - <constant name="y9t_align" value="0.000000" /> - <constant name="y10t_align" value="0.000000" /> - <constant name="z1t_align" value="-0.000000" /> - <constant name="z2t_align" value="0.000000" /> - <constant name="z3t_align" value="0.002938" /> - <constant name="z4t_align" value="0.003424" /> - <constant name="z5t_align" value="-0.002147" /> - <constant name="z6t_align" value="-0.000776" /> - <constant name="z7t_align" value="-0.000000" /> - <constant name="z8t_align" value="0.000000" /> - <constant name="z9t_align" value="-0.000000" /> - <constant name="z10t_align" value="0.000000" /> - <constant name="rx1t_align" value="0.000000" /> - <constant name="rx2t_align" value="0.000000" /> - <constant name="rx3t_align" value="0.000000" /> - <constant name="rx4t_align" value="0.000000" /> - <constant name="rx5t_align" value="0.000000" /> - <constant name="rx6t_align" value="0.000000" /> - <constant name="rx7t_align" value="0.000000" /> - <constant name="rx8t_align" value="0.000000" /> - <constant name="rx9t_align" value="0.000000" /> - <constant name="rx10t_align" value="0.000000" /> - <constant name="ry1t_align" value="0.000000" /> - <constant name="ry2t_align" value="0.000000" /> - <constant name="ry3t_align" value="0.000000" /> - <constant name="ry4t_align" value="0.000000" /> - <constant name="ry5t_align" value="0.000000" /> - <constant name="ry6t_align" value="0.000000" /> - <constant name="ry7t_align" value="0.000000" /> - <constant name="ry8t_align" value="0.000000" /> - <constant name="ry9t_align" value="0.000000" /> - <constant name="ry10t_align" value="0.000000" /> - <constant name="rz1t_align" value="-0.000000" /> - <constant name="rz2t_align" value="0.000000" /> - <constant name="rz3t_align" value="-0.000000" /> - <constant name="rz4t_align" value="0.000000" /> - <constant name="rz5t_align" value="-0.000000" /> - <constant name="rz6t_align" value="0.000000" /> - <constant name="rz7t_align" value="-0.000000" /> - <constant name="rz8t_align" value="0.000000" /> - <constant name="rz9t_align" value="-0.000000" /> - <constant name="rz10t_align" value="0.000000" /> - <constant name="x1b_align" value="0.000000" /> - <constant name="x2b_align" value="0.000000" /> - <constant name="x3b_align" value="0.008443" /> - <constant name="x4b_align" value="-0.000012" /> - <constant name="x5b_align" value="0.004437" /> - <constant name="x6b_align" value="-0.000010" /> - <constant name="x7b_align" value="0.000000" /> - <constant name="x8b_align" value="0.000000" /> - <constant name="x9b_align" value="0.000000" /> - <constant name="x10b_align" value="0.000000" /> - <constant name="y1b_align" value="0.000000" /> - <constant name="y2b_align" value="0.000000" /> - <constant name="y3b_align" value="-0.084138" /> - <constant name="y4b_align" value="-0.061835" /> - <constant name="y5b_align" value="-0.044388" /> - <constant name="y6b_align" value="-0.032317" /> - <constant name="y7b_align" value="0.000000" /> - <constant name="y8b_align" value="0.000000" /> - <constant name="y9b_align" value="0.000000" /> - <constant name="y10b_align" value="0.000000" /> - <constant name="z1b_align" value="0.000000" /> - <constant name="z2b_align" value="0.000000" /> - <constant name="z3b_align" value="0.001646" /> - <constant name="z4b_align" value="0.001377" /> - <constant name="z5b_align" value="0.000869" /> - <constant name="z6b_align" value="0.000720" /> - <constant name="z7b_align" value="0.000000" /> - <constant name="z8b_align" value="0.000000" /> - <constant name="z9b_align" value="0.000000" /> - <constant name="z10b_align" value="0.000000" /> - <constant name="rx1b_align" value="0.000000" /> - <constant name="rx2b_align" value="0.000000" /> - <constant name="rx3b_align" value="0.000000" /> - <constant name="rx4b_align" value="0.000000" /> - <constant name="rx5b_align" value="0.000000" /> - <constant name="rx6b_align" value="0.000000" /> - <constant name="rx7b_align" value="0.000000" /> - <constant name="rx8b_align" value="0.000000" /> - <constant name="rx9b_align" value="0.000000" /> - <constant name="rx10b_align" value="0.000000" /> - <constant name="ry1b_align" value="0.000000" /> - <constant name="ry2b_align" value="0.000000" /> - <constant name="ry3b_align" value="0.000000" /> - <constant name="ry4b_align" value="0.000000" /> - <constant name="ry5b_align" value="0.000000" /> - <constant name="ry6b_align" value="0.000000" /> - <constant name="ry7b_align" value="0.000000" /> - <constant name="ry8b_align" value="0.000000" /> - <constant name="ry9b_align" value="0.000000" /> - <constant name="ry10b_align" value="0.000000" /> - <constant name="rz1b_align" value="0.000000" /> - <constant name="rz2b_align" value="0.000000" /> - <constant name="rz3b_align" value="0.000000" /> - <constant name="rz4b_align" value="0.000000" /> - <constant name="rz5b_align" value="0.000000" /> - <constant name="rz6b_align" value="0.000000" /> - <constant name="rz7b_align" value="0.000000" /> - <constant name="rz8b_align" value="0.000000" /> - <constant name="rz9b_align" value="0.000000" /> - <constant name="rz10b_align" value="0.000000" /> + <!-- alignment corrections --> + <constant name="x1t_align" value="0.000000" /> + <constant name="x2t_align" value="0.000000" /> + <constant name="x3t_align" value="0.000014" /> + <constant name="x4t_align" value="0.015024" /> + <constant name="x5t_align" value="0.000045" /> + <constant name="x6t_align" value="-0.003411" /> + <constant name="x7t_align" value="0.000000" /> + <constant name="x8t_align" value="0.000000" /> + <constant name="x9t_align" value="0.000000" /> + <constant name="x10t_align" value="0.000000" /> + <constant name="y1t_align" value="0.000000" /> + <constant name="y2t_align" value="0.000000" /> + <constant name="y3t_align" value="0.112932" /> + <constant name="y4t_align" value="0.149860" /> + <constant name="y5t_align" value="-0.082467" /> + <constant name="y6t_align" value="-0.033966" /> + <constant name="y7t_align" value="0.000000" /> + <constant name="y8t_align" value="0.000000" /> + <constant name="y9t_align" value="0.000000" /> + <constant name="y10t_align" value="0.000000" /> + <constant name="z1t_align" value="-0.000000" /> + <constant name="z2t_align" value="0.000000" /> + <constant name="z3t_align" value="0.002938" /> + <constant name="z4t_align" value="0.003424" /> + <constant name="z5t_align" value="-0.002147" /> + <constant name="z6t_align" value="-0.000776" /> + <constant name="z7t_align" value="-0.000000" /> + <constant name="z8t_align" value="0.000000" /> + <constant name="z9t_align" value="-0.000000" /> + <constant name="z10t_align" value="0.000000" /> + <constant name="rx1t_align" value="0.000000" /> + <constant name="rx2t_align" value="0.000000" /> + <constant name="rx3t_align" value="0.000000" /> + <constant name="rx4t_align" value="0.000000" /> + <constant name="rx5t_align" value="0.000000" /> + <constant name="rx6t_align" value="0.000000" /> + <constant name="rx7t_align" value="0.000000" /> + <constant name="rx8t_align" value="0.000000" /> + <constant name="rx9t_align" value="0.000000" /> + <constant name="rx10t_align" value="0.000000" /> + <constant name="ry1t_align" value="0.000000" /> + <constant name="ry2t_align" value="0.000000" /> + <constant name="ry3t_align" value="0.000000" /> + <constant name="ry4t_align" value="0.000000" /> + <constant name="ry5t_align" value="0.000000" /> + <constant name="ry6t_align" value="0.000000" /> + <constant name="ry7t_align" value="0.000000" /> + <constant name="ry8t_align" value="0.000000" /> + <constant name="ry9t_align" value="0.000000" /> + <constant name="ry10t_align" value="0.000000" /> + <constant name="rz1t_align" value="-0.000000" /> + <constant name="rz2t_align" value="0.000000" /> + <constant name="rz3t_align" value="-0.000000" /> + <constant name="rz4t_align" value="0.000000" /> + <constant name="rz5t_align" value="-0.000000" /> + <constant name="rz6t_align" value="0.000000" /> + <constant name="rz7t_align" value="-0.000000" /> + <constant name="rz8t_align" value="0.000000" /> + <constant name="rz9t_align" value="-0.000000" /> + <constant name="rz10t_align" value="0.000000" /> + <constant name="x1b_align" value="0.000000" /> + <constant name="x2b_align" value="0.000000" /> + <constant name="x3b_align" value="0.008443" /> + <constant name="x4b_align" value="-0.000012" /> + <constant name="x5b_align" value="0.004437" /> + <constant name="x6b_align" value="-0.000010" /> + <constant name="x7b_align" value="0.000000" /> + <constant name="x8b_align" value="0.000000" /> + <constant name="x9b_align" value="0.000000" /> + <constant name="x10b_align" value="0.000000" /> + <constant name="y1b_align" value="0.000000" /> + <constant name="y2b_align" value="0.000000" /> + <constant name="y3b_align" value="-0.084138" /> + <constant name="y4b_align" value="-0.061835" /> + <constant name="y5b_align" value="-0.044388" /> + <constant name="y6b_align" value="-0.032317" /> + <constant name="y7b_align" value="0.000000" /> + <constant name="y8b_align" value="0.000000" /> + <constant name="y9b_align" value="0.000000" /> + <constant name="y10b_align" value="0.000000" /> + <constant name="z1b_align" value="0.000000" /> + <constant name="z2b_align" value="0.000000" /> + <constant name="z3b_align" value="0.001646" /> + <constant name="z4b_align" value="0.001377" /> + <constant name="z5b_align" value="0.000869" /> + <constant name="z6b_align" value="0.000720" /> + <constant name="z7b_align" value="0.000000" /> + <constant name="z8b_align" value="0.000000" /> + <constant name="z9b_align" value="0.000000" /> + <constant name="z10b_align" value="0.000000" /> + <constant name="rx1b_align" value="0.000000" /> + <constant name="rx2b_align" value="0.000000" /> + <constant name="rx3b_align" value="0.000000" /> + <constant name="rx4b_align" value="0.000000" /> + <constant name="rx5b_align" value="0.000000" /> + <constant name="rx6b_align" value="0.000000" /> + <constant name="rx7b_align" value="0.000000" /> + <constant name="rx8b_align" value="0.000000" /> + <constant name="rx9b_align" value="0.000000" /> + <constant name="rx10b_align" value="0.000000" /> + <constant name="ry1b_align" value="0.000000" /> + <constant name="ry2b_align" value="0.000000" /> + <constant name="ry3b_align" value="0.000000" /> + <constant name="ry4b_align" value="0.000000" /> + <constant name="ry5b_align" value="0.000000" /> + <constant name="ry6b_align" value="0.000000" /> + <constant name="ry7b_align" value="0.000000" /> + <constant name="ry8b_align" value="0.000000" /> + <constant name="ry9b_align" value="0.000000" /> + <constant name="ry10b_align" value="0.000000" /> + <constant name="rz1b_align" value="0.000000" /> + <constant name="rz2b_align" value="0.000000" /> + <constant name="rz3b_align" value="0.000000" /> + <constant name="rz4b_align" value="0.000000" /> + <constant name="rz5b_align" value="0.000000" /> + <constant name="rz6b_align" value="0.000000" /> + <constant name="rz7b_align" value="0.000000" /> + <constant name="rz8b_align" value="0.000000" /> + <constant name="rz9b_align" value="0.000000" /> + <constant name="rz10b_align" value="0.000000" /> <!-- Positions of sensor centers above/below nominal beam --> <constant name="y1t" value="36.894" /> @@ -585,134 +585,134 @@ <constant name="mod2_rx10b" value="mod_rx10b" /> <constant name="mod2_ry10b" value="mod_ry10b+y_rot_bot_pivot" /> <constant name="mod2_rz10b" value="mod_rz10b" /> - - <!-- final constants --> - <constant name="final_x1t" value="mod2_x1t+x1t_align" /> - <constant name="final_x2t" value="mod2_x2t+x2t_align" /> - <constant name="final_x3t" value="mod2_x3t+x3t_align" /> - <constant name="final_x4t" value="mod2_x4t+x4t_align" /> - <constant name="final_x5t" value="mod2_x5t+x5t_align" /> - <constant name="final_x6t" value="mod2_x6t+x6t_align" /> - <constant name="final_x7t" value="mod2_x7t+x7t_align" /> - <constant name="final_x8t" value="mod2_x8t+x8t_align" /> - <constant name="final_x9t" value="mod2_x9t+x9t_align" /> - <constant name="final_x10t" value="mod2_x10t+x10t_align" /> - <constant name="final_y1t" value="mod2_y1t+y1t_align" /> - <constant name="final_y2t" value="mod2_y2t+y2t_align" /> - <constant name="final_y3t" value="mod2_y3t+y3t_align" /> - <constant name="final_y4t" value="mod2_y4t+y4t_align" /> - <constant name="final_y5t" value="mod2_y5t+y5t_align" /> - <constant name="final_y6t" value="mod2_y6t+y6t_align" /> - <constant name="final_y7t" value="mod2_y7t+y7t_align" /> - <constant name="final_y8t" value="mod2_y8t+y8t_align" /> - <constant name="final_y9t" value="mod2_y9t+y9t_align" /> - <constant name="final_y10t" value="mod2_y10t+y10t_align" /> - <constant name="final_z1t" value="mod2_z1t+z1t_align" /> - <constant name="final_z2t" value="mod2_z2t+z2t_align" /> - <constant name="final_z3t" value="mod2_z3t+z3t_align" /> - <constant name="final_z4t" value="mod2_z4t+z4t_align" /> - <constant name="final_z5t" value="mod2_z5t+z5t_align" /> - <constant name="final_z6t" value="mod2_z6t+z6t_align" /> - <constant name="final_z7t" value="mod2_z7t+z7t_align" /> - <constant name="final_z8t" value="mod2_z8t+z8t_align" /> - <constant name="final_z9t" value="mod2_z9t+z9t_align" /> - <constant name="final_z10t" value="mod2_z10t+z10t_align" /> - <constant name="final_rx1t" value="mod2_rx1t+rx1t_align" /> - <constant name="final_rx2t" value="mod2_rx2t+rx2t_align" /> - <constant name="final_rx3t" value="mod2_rx3t+rx3t_align" /> - <constant name="final_rx4t" value="mod2_rx4t+rx4t_align" /> - <constant name="final_rx5t" value="mod2_rx5t+rx5t_align" /> - <constant name="final_rx6t" value="mod2_rx6t+rx6t_align" /> - <constant name="final_rx7t" value="mod2_rx7t+rx7t_align" /> - <constant name="final_rx8t" value="mod2_rx8t+rx8t_align" /> - <constant name="final_rx9t" value="mod2_rx9t+rx9t_align" /> - <constant name="final_rx10t" value="mod2_rx10t+rx10t_align" /> - <constant name="final_ry1t" value="mod2_ry1t+ry1t_align" /> - <constant name="final_ry2t" value="mod2_ry2t+ry2t_align" /> - <constant name="final_ry3t" value="mod2_ry3t+ry3t_align" /> - <constant name="final_ry4t" value="mod2_ry4t+ry4t_align" /> - <constant name="final_ry5t" value="mod2_ry5t+ry5t_align" /> - <constant name="final_ry6t" value="mod2_ry6t+ry6t_align" /> - <constant name="final_ry7t" value="mod2_ry7t+ry7t_align" /> - <constant name="final_ry8t" value="mod2_ry8t+ry8t_align" /> - <constant name="final_ry9t" value="mod2_ry9t+ry9t_align" /> - <constant name="final_ry10t" value="mod2_ry10t+ry10t_align" /> - <constant name="final_rz1t" value="mod2_rz1t+rz1t_align" /> - <constant name="final_rz2t" value="mod2_rz2t+rz2t_align" /> - <constant name="final_rz3t" value="mod2_rz3t+rz3t_align" /> - <constant name="final_rz4t" value="mod2_rz4t+rz4t_align" /> - <constant name="final_rz5t" value="mod2_rz5t+rz5t_align" /> - <constant name="final_rz6t" value="mod2_rz6t+rz6t_align" /> - <constant name="final_rz7t" value="mod2_rz7t+rz7t_align" /> - <constant name="final_rz8t" value="mod2_rz8t+rz8t_align" /> - <constant name="final_rz9t" value="mod2_rz9t+rz9t_align" /> - <constant name="final_rz10t" value="mod2_rz10t+rz10t_align" /> - <constant name="final_x1b" value="mod2_x1b+x1b_align" /> - <constant name="final_x2b" value="mod2_x2b+x2b_align" /> - <constant name="final_x3b" value="mod2_x3b+x3b_align" /> - <constant name="final_x4b" value="mod2_x4b+x4b_align" /> - <constant name="final_x5b" value="mod2_x5b+x5b_align" /> - <constant name="final_x6b" value="mod2_x6b+x6b_align" /> - <constant name="final_x7b" value="mod2_x7b+x7b_align" /> - <constant name="final_x8b" value="mod2_x8b+x8b_align" /> - <constant name="final_x9b" value="mod2_x9b+x9b_align" /> - <constant name="final_x10b" value="mod2_x10b+x10b_align" /> - <constant name="final_y1b" value="mod2_y1b+y1b_align" /> - <constant name="final_y2b" value="mod2_y2b+y2b_align" /> - <constant name="final_y3b" value="mod2_y3b+y3b_align" /> - <constant name="final_y4b" value="mod2_y4b+y4b_align" /> - <constant name="final_y5b" value="mod2_y5b+y5b_align" /> - <constant name="final_y6b" value="mod2_y6b+y6b_align" /> - <constant name="final_y7b" value="mod2_y7b+y7b_align" /> - <constant name="final_y8b" value="mod2_y8b+y8b_align" /> - <constant name="final_y9b" value="mod2_y9b+y9b_align" /> - <constant name="final_y10b" value="mod2_y10b+y10b_align" /> - <constant name="final_z1b" value="mod2_z1b+z1b_align" /> - <constant name="final_z2b" value="mod2_z2b+z2b_align" /> - <constant name="final_z3b" value="mod2_z3b+z3b_align" /> - <constant name="final_z4b" value="mod2_z4b+z4b_align" /> - <constant name="final_z5b" value="mod2_z5b+z5b_align" /> - <constant name="final_z6b" value="mod2_z6b+z6b_align" /> - <constant name="final_z7b" value="mod2_z7b+z7b_align" /> - <constant name="final_z8b" value="mod2_z8b+z8b_align" /> - <constant name="final_z9b" value="mod2_z9b+z9b_align" /> - <constant name="final_z10b" value="mod2_z10b+z10b_align" /> - <constant name="final_rx1b" value="mod2_rx1b+rx1b_align" /> - <constant name="final_rx2b" value="mod2_rx2b+rx2b_align" /> - <constant name="final_rx3b" value="mod2_rx3b+rx3b_align" /> - <constant name="final_rx4b" value="mod2_rx4b+rx4b_align" /> - <constant name="final_rx5b" value="mod2_rx5b+rx5b_align" /> - <constant name="final_rx6b" value="mod2_rx6b+rx6b_align" /> - <constant name="final_rx7b" value="mod2_rx7b+rx7b_align" /> - <constant name="final_rx8b" value="mod2_rx8b+rx8b_align" /> - <constant name="final_rx9b" value="mod2_rx9b+rx9b_align" /> - <constant name="final_rx10b" value="mod2_rx10b+rx10b_align" /> - <constant name="final_ry1b" value="mod2_ry1b+ry1b_align" /> - <constant name="final_ry2b" value="mod2_ry2b+ry2b_align" /> - <constant name="final_ry3b" value="mod2_ry3b+ry3b_align" /> - <constant name="final_ry4b" value="mod2_ry4b+ry4b_align" /> - <constant name="final_ry5b" value="mod2_ry5b+ry5b_align" /> - <constant name="final_ry6b" value="mod2_ry6b+ry6b_align" /> - <constant name="final_ry7b" value="mod2_ry7b+ry7b_align" /> - <constant name="final_ry8b" value="mod2_ry8b+ry8b_align" /> - <constant name="final_ry9b" value="mod2_ry9b+ry9b_align" /> - <constant name="final_ry10b" value="mod2_ry10b+ry10b_align" /> - <constant name="final_rz1b" value="mod2_rz1b+rz1b_align" /> - <constant name="final_rz2b" value="mod2_rz2b+rz2b_align" /> - <constant name="final_rz3b" value="mod2_rz3b+rz3b_align" /> - <constant name="final_rz4b" value="mod2_rz4b+rz4b_align" /> - <constant name="final_rz5b" value="mod2_rz5b+rz5b_align" /> - <constant name="final_rz6b" value="mod2_rz6b+rz6b_align" /> - <constant name="final_rz7b" value="mod2_rz7b+rz7b_align" /> - <constant name="final_rz8b" value="mod2_rz8b+rz8b_align" /> - <constant name="final_rz9b" value="mod2_rz9b+rz9b_align" /> - <constant name="final_rz10b" value="mod2_rz10b+rz10b_align" /> - - + + <!-- final constants --> + <constant name="final_x1t" value="mod2_x1t+x1t_align" /> + <constant name="final_x2t" value="mod2_x2t+x2t_align" /> + <constant name="final_x3t" value="mod2_x3t+x3t_align" /> + <constant name="final_x4t" value="mod2_x4t+x4t_align" /> + <constant name="final_x5t" value="mod2_x5t+x5t_align" /> + <constant name="final_x6t" value="mod2_x6t+x6t_align" /> + <constant name="final_x7t" value="mod2_x7t+x7t_align" /> + <constant name="final_x8t" value="mod2_x8t+x8t_align" /> + <constant name="final_x9t" value="mod2_x9t+x9t_align" /> + <constant name="final_x10t" value="mod2_x10t+x10t_align" /> + <constant name="final_y1t" value="mod2_y1t+y1t_align" /> + <constant name="final_y2t" value="mod2_y2t+y2t_align" /> + <constant name="final_y3t" value="mod2_y3t+y3t_align" /> + <constant name="final_y4t" value="mod2_y4t+y4t_align" /> + <constant name="final_y5t" value="mod2_y5t+y5t_align" /> + <constant name="final_y6t" value="mod2_y6t+y6t_align" /> + <constant name="final_y7t" value="mod2_y7t+y7t_align" /> + <constant name="final_y8t" value="mod2_y8t+y8t_align" /> + <constant name="final_y9t" value="mod2_y9t+y9t_align" /> + <constant name="final_y10t" value="mod2_y10t+y10t_align" /> + <constant name="final_z1t" value="mod2_z1t+z1t_align" /> + <constant name="final_z2t" value="mod2_z2t+z2t_align" /> + <constant name="final_z3t" value="mod2_z3t+z3t_align" /> + <constant name="final_z4t" value="mod2_z4t+z4t_align" /> + <constant name="final_z5t" value="mod2_z5t+z5t_align" /> + <constant name="final_z6t" value="mod2_z6t+z6t_align" /> + <constant name="final_z7t" value="mod2_z7t+z7t_align" /> + <constant name="final_z8t" value="mod2_z8t+z8t_align" /> + <constant name="final_z9t" value="mod2_z9t+z9t_align" /> + <constant name="final_z10t" value="mod2_z10t+z10t_align" /> + <constant name="final_rx1t" value="mod2_rx1t+rx1t_align" /> + <constant name="final_rx2t" value="mod2_rx2t+rx2t_align" /> + <constant name="final_rx3t" value="mod2_rx3t+rx3t_align" /> + <constant name="final_rx4t" value="mod2_rx4t+rx4t_align" /> + <constant name="final_rx5t" value="mod2_rx5t+rx5t_align" /> + <constant name="final_rx6t" value="mod2_rx6t+rx6t_align" /> + <constant name="final_rx7t" value="mod2_rx7t+rx7t_align" /> + <constant name="final_rx8t" value="mod2_rx8t+rx8t_align" /> + <constant name="final_rx9t" value="mod2_rx9t+rx9t_align" /> + <constant name="final_rx10t" value="mod2_rx10t+rx10t_align" /> + <constant name="final_ry1t" value="mod2_ry1t+ry1t_align" /> + <constant name="final_ry2t" value="mod2_ry2t+ry2t_align" /> + <constant name="final_ry3t" value="mod2_ry3t+ry3t_align" /> + <constant name="final_ry4t" value="mod2_ry4t+ry4t_align" /> + <constant name="final_ry5t" value="mod2_ry5t+ry5t_align" /> + <constant name="final_ry6t" value="mod2_ry6t+ry6t_align" /> + <constant name="final_ry7t" value="mod2_ry7t+ry7t_align" /> + <constant name="final_ry8t" value="mod2_ry8t+ry8t_align" /> + <constant name="final_ry9t" value="mod2_ry9t+ry9t_align" /> + <constant name="final_ry10t" value="mod2_ry10t+ry10t_align" /> + <constant name="final_rz1t" value="mod2_rz1t+rz1t_align" /> + <constant name="final_rz2t" value="mod2_rz2t+rz2t_align" /> + <constant name="final_rz3t" value="mod2_rz3t+rz3t_align" /> + <constant name="final_rz4t" value="mod2_rz4t+rz4t_align" /> + <constant name="final_rz5t" value="mod2_rz5t+rz5t_align" /> + <constant name="final_rz6t" value="mod2_rz6t+rz6t_align" /> + <constant name="final_rz7t" value="mod2_rz7t+rz7t_align" /> + <constant name="final_rz8t" value="mod2_rz8t+rz8t_align" /> + <constant name="final_rz9t" value="mod2_rz9t+rz9t_align" /> + <constant name="final_rz10t" value="mod2_rz10t+rz10t_align" /> + <constant name="final_x1b" value="mod2_x1b+x1b_align" /> + <constant name="final_x2b" value="mod2_x2b+x2b_align" /> + <constant name="final_x3b" value="mod2_x3b+x3b_align" /> + <constant name="final_x4b" value="mod2_x4b+x4b_align" /> + <constant name="final_x5b" value="mod2_x5b+x5b_align" /> + <constant name="final_x6b" value="mod2_x6b+x6b_align" /> + <constant name="final_x7b" value="mod2_x7b+x7b_align" /> + <constant name="final_x8b" value="mod2_x8b+x8b_align" /> + <constant name="final_x9b" value="mod2_x9b+x9b_align" /> + <constant name="final_x10b" value="mod2_x10b+x10b_align" /> + <constant name="final_y1b" value="mod2_y1b+y1b_align" /> + <constant name="final_y2b" value="mod2_y2b+y2b_align" /> + <constant name="final_y3b" value="mod2_y3b+y3b_align" /> + <constant name="final_y4b" value="mod2_y4b+y4b_align" /> + <constant name="final_y5b" value="mod2_y5b+y5b_align" /> + <constant name="final_y6b" value="mod2_y6b+y6b_align" /> + <constant name="final_y7b" value="mod2_y7b+y7b_align" /> + <constant name="final_y8b" value="mod2_y8b+y8b_align" /> + <constant name="final_y9b" value="mod2_y9b+y9b_align" /> + <constant name="final_y10b" value="mod2_y10b+y10b_align" /> + <constant name="final_z1b" value="mod2_z1b+z1b_align" /> + <constant name="final_z2b" value="mod2_z2b+z2b_align" /> + <constant name="final_z3b" value="mod2_z3b+z3b_align" /> + <constant name="final_z4b" value="mod2_z4b+z4b_align" /> + <constant name="final_z5b" value="mod2_z5b+z5b_align" /> + <constant name="final_z6b" value="mod2_z6b+z6b_align" /> + <constant name="final_z7b" value="mod2_z7b+z7b_align" /> + <constant name="final_z8b" value="mod2_z8b+z8b_align" /> + <constant name="final_z9b" value="mod2_z9b+z9b_align" /> + <constant name="final_z10b" value="mod2_z10b+z10b_align" /> + <constant name="final_rx1b" value="mod2_rx1b+rx1b_align" /> + <constant name="final_rx2b" value="mod2_rx2b+rx2b_align" /> + <constant name="final_rx3b" value="mod2_rx3b+rx3b_align" /> + <constant name="final_rx4b" value="mod2_rx4b+rx4b_align" /> + <constant name="final_rx5b" value="mod2_rx5b+rx5b_align" /> + <constant name="final_rx6b" value="mod2_rx6b+rx6b_align" /> + <constant name="final_rx7b" value="mod2_rx7b+rx7b_align" /> + <constant name="final_rx8b" value="mod2_rx8b+rx8b_align" /> + <constant name="final_rx9b" value="mod2_rx9b+rx9b_align" /> + <constant name="final_rx10b" value="mod2_rx10b+rx10b_align" /> + <constant name="final_ry1b" value="mod2_ry1b+ry1b_align" /> + <constant name="final_ry2b" value="mod2_ry2b+ry2b_align" /> + <constant name="final_ry3b" value="mod2_ry3b+ry3b_align" /> + <constant name="final_ry4b" value="mod2_ry4b+ry4b_align" /> + <constant name="final_ry5b" value="mod2_ry5b+ry5b_align" /> + <constant name="final_ry6b" value="mod2_ry6b+ry6b_align" /> + <constant name="final_ry7b" value="mod2_ry7b+ry7b_align" /> + <constant name="final_ry8b" value="mod2_ry8b+ry8b_align" /> + <constant name="final_ry9b" value="mod2_ry9b+ry9b_align" /> + <constant name="final_ry10b" value="mod2_ry10b+ry10b_align" /> + <constant name="final_rz1b" value="mod2_rz1b+rz1b_align" /> + <constant name="final_rz2b" value="mod2_rz2b+rz2b_align" /> + <constant name="final_rz3b" value="mod2_rz3b+rz3b_align" /> + <constant name="final_rz4b" value="mod2_rz4b+rz4b_align" /> + <constant name="final_rz5b" value="mod2_rz5b+rz5b_align" /> + <constant name="final_rz6b" value="mod2_rz6b+rz6b_align" /> + <constant name="final_rz7b" value="mod2_rz7b+rz7b_align" /> + <constant name="final_rz8b" value="mod2_rz8b+rz8b_align" /> + <constant name="final_rz9b" value="mod2_rz9b+rz9b_align" /> + <constant name="final_rz10b" value="mod2_rz10b+rz10b_align" /> + + </define> <materials> - <!-- Set the world material to vacuum. --> + <!-- Set the world material to vacuum. --> <material name="WorldMaterial"> <D type="density" unit="g/cm3" value="0.0000000000000001" /> <fraction n="1.0" ref="Vacuum" /> @@ -801,7 +801,7 @@ </layer> <layer id="2"> <module_placement name="TestRunModuleFieldDef" id="0" x="0" y="0" z="dipoleMagnetPositionZ+dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2" /> - </layer> + </layer> </detector> <detector id="13" name="Ecal" type="HPSEcal3" insideTrackingVolume="false" readout="EcalHits" vis="ECALVis"> Modified: java/trunk/detector-data/detectors/HPS-TestRun-v8-5/compact.xml ============================================================================= --- java/trunk/detector-data/detectors/HPS-TestRun-v8-5/compact.xml (original) +++ java/trunk/detector-data/detectors/HPS-TestRun-v8-5/compact.xml Wed Mar 9 11:43:24 2016 @@ -3,9 +3,9 @@ <info name="HPS-TestRun-v8-5"> <comment> - HPS JLab Test Run detector with dipole field starting at z=0 - Based on millepede-u3-6-float-then-u7-8float-then-u3-6-float-then-u1-2-float-then-u3-6-float-then-u9-10-float-then-u7-10-float-then-u3-6-float-then-u1-4-float-then-u9-10-float-1351-v8-10k.res.txt - </comment> + HPS JLab Test Run detector with dipole field starting at z=0 + Based on millepede-u3-6-float-then-u7-8float-then-u3-6-float-then-u1-2-float-then-u3-6-float-then-u9-10-float-then-u7-10-float-then-u3-6-float-then-u1-4-float-then-u9-10-float-1351-v8-10k.res.txt + </comment> </info> <define> @@ -65,127 +65,127 @@ <!-- <constant name="x_off" value = "-15.0"/> --> <constant name="x_off" value="0.0" /> - <!-- alignment corrections --> - <constant name="x1t_align" value="0.000000" /> - <constant name="x2t_align" value="0.000338" /> - <constant name="x3t_align" value="0.000013" /> - <constant name="x4t_align" value="0.014360" /> - <constant name="x5t_align" value="0.000051" /> - <constant name="x6t_align" value="-0.004610" /> - <constant name="x7t_align" value="-0.000000" /> - <constant name="x8t_align" value="-0.000200" /> - <constant name="x9t_align" value="0.000023" /> - <constant name="x10t_align" value="0.003314" /> - <constant name="y1t_align" value="0.003643" /> - <constant name="y2t_align" value="0.003372" /> - <constant name="y3t_align" value="0.106214" /> - <constant name="y4t_align" value="0.143235" /> - <constant name="y5t_align" value="-0.094779" /> - <constant name="y6t_align" value="-0.045906" /> - <constant name="y7t_align" value="-0.004270" /> - <constant name="y8t_align" value="-0.004014" /> - <constant name="y9t_align" value="0.069062" /> - <constant name="y10t_align" value="0.066775" /> - <constant name="z1t_align" value="0.000095" /> - <constant name="z2t_align" value="0.000077" /> - <constant name="z3t_align" value="0.002763" /> - <constant name="z4t_align" value="0.003273" /> - <constant name="z5t_align" value="-0.002467" /> - <constant name="z6t_align" value="-0.001049" /> - <constant name="z7t_align" value="-0.000111" /> - <constant name="z8t_align" value="-0.000098" /> - <constant name="z9t_align" value="0.001796" /> - <constant name="z10t_align" value="0.001633" /> - <constant name="rx1t_align" value="0.000000" /> - <constant name="rx2t_align" value="0.000000" /> - <constant name="rx3t_align" value="0.000000" /> - <constant name="rx4t_align" value="0.000000" /> - <constant name="rx5t_align" value="0.000000" /> - <constant name="rx6t_align" value="0.000000" /> - <constant name="rx7t_align" value="0.000000" /> - <constant name="rx8t_align" value="0.000000" /> - <constant name="rx9t_align" value="0.000000" /> - <constant name="rx10t_align" value="0.000000" /> - <constant name="ry1t_align" value="0.000000" /> - <constant name="ry2t_align" value="0.000000" /> - <constant name="ry3t_align" value="0.000000" /> - <constant name="ry4t_align" value="0.000000" /> - <constant name="ry5t_align" value="0.000000" /> - <constant name="ry6t_align" value="0.000000" /> - <constant name="ry7t_align" value="0.000000" /> - <constant name="ry8t_align" value="0.000000" /> - <constant name="ry9t_align" value="0.000000" /> - <constant name="ry10t_align" value="0.000000" /> - <constant name="rz1t_align" value="-0.000000" /> - <constant name="rz2t_align" value="0.000000" /> - <constant name="rz3t_align" value="-0.000000" /> - <constant name="rz4t_align" value="0.000000" /> - <constant name="rz5t_align" value="-0.000000" /> - <constant name="rz6t_align" value="0.000000" /> - <constant name="rz7t_align" value="-0.000000" /> - <constant name="rz8t_align" value="0.000000" /> - <constant name="rz9t_align" value="-0.000000" /> - <constant name="rz10t_align" value="0.000000" /> - <constant name="x1b_align" value="-0.000240" /> - <constant name="x2b_align" value="0.000001" /> - <constant name="x3b_align" value="0.008881" /> - <constant name="x4b_align" value="-0.000013" /> - <constant name="x5b_align" value="0.005242" /> - <constant name="x6b_align" value="-0.000013" /> - <constant name="x7b_align" value="0.000171" /> - <constant name="x8b_align" value="-0.000002" /> - <constant name="x9b_align" value="-0.002390" /> - <constant name="x10b_align" value="0.000002" /> - <constant name="y1b_align" value="0.002386" /> - <constant name="y2b_align" value="0.002507" /> - <constant name="y3b_align" value="-0.088503" /> - <constant name="y4b_align" value="-0.066488" /> - <constant name="y5b_align" value="-0.052443" /> - <constant name="y6b_align" value="-0.040809" /> - <constant name="y7b_align" value="-0.003389" /> - <constant name="y8b_align" value="-0.003634" /> - <constant name="y9b_align" value="0.047254" /> - <constant name="y10b_align" value="0.047194" /> - <constant name="z1b_align" value="-0.000047" /> - <constant name="z2b_align" value="-0.000056" /> - <constant name="z3b_align" value="0.001731" /> - <constant name="z4b_align" value="0.001481" /> - <constant name="z5b_align" value="0.001026" /> - <constant name="z6b_align" value="0.000909" /> - <constant name="z7b_align" value="0.000071" /> - <constant name="z8b_align" value="0.000081" /> - <constant name="z9b_align" value="-0.000988" /> - <constant name="z10b_align" value="-0.001051" /> - <constant name="rx1b_align" value="0.000000" /> - <constant name="rx2b_align" value="0.000000" /> - <constant name="rx3b_align" value="0.000000" /> - <constant name="rx4b_align" value="0.000000" /> - <constant name="rx5b_align" value="0.000000" /> - <constant name="rx6b_align" value="0.000000" /> - <constant name="rx7b_align" value="0.000000" /> - <constant name="rx8b_align" value="0.000000" /> - <constant name="rx9b_align" value="0.000000" /> - <constant name="rx10b_align" value="0.000000" /> - <constant name="ry1b_align" value="0.000000" /> - <constant name="ry2b_align" value="0.000000" /> - <constant name="ry3b_align" value="0.000000" /> - <constant name="ry4b_align" value="0.000000" /> - <constant name="ry5b_align" value="0.000000" /> - <constant name="ry6b_align" value="0.000000" /> - <constant name="ry7b_align" value="0.000000" /> - <constant name="ry8b_align" value="0.000000" /> - <constant name="ry9b_align" value="0.000000" /> - <constant name="ry10b_align" value="0.000000" /> - <constant name="rz1b_align" value="0.000000" /> - <constant name="rz2b_align" value="0.000000" /> - <constant name="rz3b_align" value="0.000000" /> - <constant name="rz4b_align" value="0.000000" /> - <constant name="rz5b_align" value="0.000000" /> - <constant name="rz6b_align" value="0.000000" /> - <constant name="rz7b_align" value="0.000000" /> - <constant name="rz8b_align" value="0.000000" /> - <constant name="rz9b_align" value="0.000000" /> - <constant name="rz10b_align" value="0.000000" /> + <!-- alignment corrections --> + <constant name="x1t_align" value="0.000000" /> + <constant name="x2t_align" value="0.000338" /> + <constant name="x3t_align" value="0.000013" /> + <constant name="x4t_align" value="0.014360" /> + <constant name="x5t_align" value="0.000051" /> + <constant name="x6t_align" value="-0.004610" /> + <constant name="x7t_align" value="-0.000000" /> + <constant name="x8t_align" value="-0.000200" /> + <constant name="x9t_align" value="0.000023" /> + <constant name="x10t_align" value="0.003314" /> + <constant name="y1t_align" value="0.003643" /> + <constant name="y2t_align" value="0.003372" /> + <constant name="y3t_align" value="0.106214" /> + <constant name="y4t_align" value="0.143235" /> + <constant name="y5t_align" value="-0.094779" /> + <constant name="y6t_align" value="-0.045906" /> + <constant name="y7t_align" value="-0.004270" /> + <constant name="y8t_align" value="-0.004014" /> + <constant name="y9t_align" value="0.069062" /> + <constant name="y10t_align" value="0.066775" /> + <constant name="z1t_align" value="0.000095" /> + <constant name="z2t_align" value="0.000077" /> + <constant name="z3t_align" value="0.002763" /> + <constant name="z4t_align" value="0.003273" /> + <constant name="z5t_align" value="-0.002467" /> + <constant name="z6t_align" value="-0.001049" /> + <constant name="z7t_align" value="-0.000111" /> + <constant name="z8t_align" value="-0.000098" /> + <constant name="z9t_align" value="0.001796" /> + <constant name="z10t_align" value="0.001633" /> + <constant name="rx1t_align" value="0.000000" /> + <constant name="rx2t_align" value="0.000000" /> + <constant name="rx3t_align" value="0.000000" /> + <constant name="rx4t_align" value="0.000000" /> + <constant name="rx5t_align" value="0.000000" /> + <constant name="rx6t_align" value="0.000000" /> + <constant name="rx7t_align" value="0.000000" /> + <constant name="rx8t_align" value="0.000000" /> + <constant name="rx9t_align" value="0.000000" /> + <constant name="rx10t_align" value="0.000000" /> + <constant name="ry1t_align" value="0.000000" /> + <constant name="ry2t_align" value="0.000000" /> + <constant name="ry3t_align" value="0.000000" /> + <constant name="ry4t_align" value="0.000000" /> + <constant name="ry5t_align" value="0.000000" /> + <constant name="ry6t_align" value="0.000000" /> + <constant name="ry7t_align" value="0.000000" /> + <constant name="ry8t_align" value="0.000000" /> + <constant name="ry9t_align" value="0.000000" /> + <constant name="ry10t_align" value="0.000000" /> + <constant name="rz1t_align" value="-0.000000" /> + <constant name="rz2t_align" value="0.000000" /> + <constant name="rz3t_align" value="-0.000000" /> + <constant name="rz4t_align" value="0.000000" /> + <constant name="rz5t_align" value="-0.000000" /> + <constant name="rz6t_align" value="0.000000" /> + <constant name="rz7t_align" value="-0.000000" /> + <constant name="rz8t_align" value="0.000000" /> + <constant name="rz9t_align" value="-0.000000" /> + <constant name="rz10t_align" value="0.000000" /> + <constant name="x1b_align" value="-0.000240" /> + <constant name="x2b_align" value="0.000001" /> + <constant name="x3b_align" value="0.008881" /> + <constant name="x4b_align" value="-0.000013" /> + <constant name="x5b_align" value="0.005242" /> + <constant name="x6b_align" value="-0.000013" /> + <constant name="x7b_align" value="0.000171" /> + <constant name="x8b_align" value="-0.000002" /> + <constant name="x9b_align" value="-0.002390" /> + <constant name="x10b_align" value="0.000002" /> + <constant name="y1b_align" value="0.002386" /> + <constant name="y2b_align" value="0.002507" /> + <constant name="y3b_align" value="-0.088503" /> + <constant name="y4b_align" value="-0.066488" /> + <constant name="y5b_align" value="-0.052443" /> + <constant name="y6b_align" value="-0.040809" /> + <constant name="y7b_align" value="-0.003389" /> + <constant name="y8b_align" value="-0.003634" /> + <constant name="y9b_align" value="0.047254" /> + <constant name="y10b_align" value="0.047194" /> + <constant name="z1b_align" value="-0.000047" /> + <constant name="z2b_align" value="-0.000056" /> + <constant name="z3b_align" value="0.001731" /> + <constant name="z4b_align" value="0.001481" /> + <constant name="z5b_align" value="0.001026" /> + <constant name="z6b_align" value="0.000909" /> + <constant name="z7b_align" value="0.000071" /> + <constant name="z8b_align" value="0.000081" /> + <constant name="z9b_align" value="-0.000988" /> + <constant name="z10b_align" value="-0.001051" /> + <constant name="rx1b_align" value="0.000000" /> + <constant name="rx2b_align" value="0.000000" /> + <constant name="rx3b_align" value="0.000000" /> + <constant name="rx4b_align" value="0.000000" /> + <constant name="rx5b_align" value="0.000000" /> + <constant name="rx6b_align" value="0.000000" /> + <constant name="rx7b_align" value="0.000000" /> + <constant name="rx8b_align" value="0.000000" /> + <constant name="rx9b_align" value="0.000000" /> + <constant name="rx10b_align" value="0.000000" /> + <constant name="ry1b_align" value="0.000000" /> + <constant name="ry2b_align" value="0.000000" /> + <constant name="ry3b_align" value="0.000000" /> + <constant name="ry4b_align" value="0.000000" /> + <constant name="ry5b_align" value="0.000000" /> + <constant name="ry6b_align" value="0.000000" /> + <constant name="ry7b_align" value="0.000000" /> + <constant name="ry8b_align" value="0.000000" /> + <constant name="ry9b_align" value="0.000000" /> + <constant name="ry10b_align" value="0.000000" /> + <constant name="rz1b_align" value="0.000000" /> + <constant name="rz2b_align" value="0.000000" /> + <constant name="rz3b_align" value="0.000000" /> + <constant name="rz4b_align" value="0.000000" /> + <constant name="rz5b_align" value="0.000000" /> + <constant name="rz6b_align" value="0.000000" /> + <constant name="rz7b_align" value="0.000000" /> + <constant name="rz8b_align" value="0.000000" /> + <constant name="rz9b_align" value="0.000000" /> + <constant name="rz10b_align" value="0.000000" /> <!-- Positions of sensor centers above/below nominal beam --> <constant name="y1t" value="36.894" /> @@ -585,134 +585,134 @@ <constant name="mod2_rx10b" value="mod_rx10b" /> <constant name="mod2_ry10b" value="mod_ry10b+y_rot_bot_pivot" /> <constant name="mod2_rz10b" value="mod_rz10b" /> - - <!-- final constants --> - <constant name="final_x1t" value="mod2_x1t+x1t_align" /> - <constant name="final_x2t" value="mod2_x2t+x2t_align" /> - <constant name="final_x3t" value="mod2_x3t+x3t_align" /> - <constant name="final_x4t" value="mod2_x4t+x4t_align" /> - <constant name="final_x5t" value="mod2_x5t+x5t_align" /> - <constant name="final_x6t" value="mod2_x6t+x6t_align" /> - <constant name="final_x7t" value="mod2_x7t+x7t_align" /> - <constant name="final_x8t" value="mod2_x8t+x8t_align" /> - <constant name="final_x9t" value="mod2_x9t+x9t_align" /> - <constant name="final_x10t" value="mod2_x10t+x10t_align" /> - <constant name="final_y1t" value="mod2_y1t+y1t_align" /> - <constant name="final_y2t" value="mod2_y2t+y2t_align" /> - <constant name="final_y3t" value="mod2_y3t+y3t_align" /> - <constant name="final_y4t" value="mod2_y4t+y4t_align" /> - <constant name="final_y5t" value="mod2_y5t+y5t_align" /> - <constant name="final_y6t" value="mod2_y6t+y6t_align" /> - <constant name="final_y7t" value="mod2_y7t+y7t_align" /> - <constant name="final_y8t" value="mod2_y8t+y8t_align" /> - <constant name="final_y9t" value="mod2_y9t+y9t_align" /> - <constant name="final_y10t" value="mod2_y10t+y10t_align" /> - <constant name="final_z1t" value="mod2_z1t+z1t_align" /> - <constant name="final_z2t" value="mod2_z2t+z2t_align" /> - <constant name="final_z3t" value="mod2_z3t+z3t_align" /> - <constant name="final_z4t" value="mod2_z4t+z4t_align" /> - <constant name="final_z5t" value="mod2_z5t+z5t_align" /> - <constant name="final_z6t" value="mod2_z6t+z6t_align" /> - <constant name="final_z7t" value="mod2_z7t+z7t_align" /> - <constant name="final_z8t" value="mod2_z8t+z8t_align" /> - <constant name="final_z9t" value="mod2_z9t+z9t_align" /> - <constant name="final_z10t" value="mod2_z10t+z10t_align" /> - <constant name="final_rx1t" value="mod2_rx1t+rx1t_align" /> - <constant name="final_rx2t" value="mod2_rx2t+rx2t_align" /> - <constant name="final_rx3t" value="mod2_rx3t+rx3t_align" /> - <constant name="final_rx4t" value="mod2_rx4t+rx4t_align" /> - <constant name="final_rx5t" value="mod2_rx5t+rx5t_align" /> - <constant name="final_rx6t" value="mod2_rx6t+rx6t_align" /> - <constant name="final_rx7t" value="mod2_rx7t+rx7t_align" /> - <constant name="final_rx8t" value="mod2_rx8t+rx8t_align" /> - <constant name="final_rx9t" value="mod2_rx9t+rx9t_align" /> - <constant name="final_rx10t" value="mod2_rx10t+rx10t_align" /> - <constant name="final_ry1t" value="mod2_ry1t+ry1t_align" /> - <constant name="final_ry2t" value="mod2_ry2t+ry2t_align" /> - <constant name="final_ry3t" value="mod2_ry3t+ry3t_align" /> - <constant name="final_ry4t" value="mod2_ry4t+ry4t_align" /> - <constant name="final_ry5t" value="mod2_ry5t+ry5t_align" /> - <constant name="final_ry6t" value="mod2_ry6t+ry6t_align" /> - <constant name="final_ry7t" value="mod2_ry7t+ry7t_align" /> - <constant name="final_ry8t" value="mod2_ry8t+ry8t_align" /> - <constant name="final_ry9t" value="mod2_ry9t+ry9t_align" /> - <constant name="final_ry10t" value="mod2_ry10t+ry10t_align" /> - <constant name="final_rz1t" value="mod2_rz1t+rz1t_align" /> - <constant name="final_rz2t" value="mod2_rz2t+rz2t_align" /> - <constant name="final_rz3t" value="mod2_rz3t+rz3t_align" /> - <constant name="final_rz4t" value="mod2_rz4t+rz4t_align" /> - <constant name="final_rz5t" value="mod2_rz5t+rz5t_align" /> - <constant name="final_rz6t" value="mod2_rz6t+rz6t_align" /> - <constant name="final_rz7t" value="mod2_rz7t+rz7t_align" /> - <constant name="final_rz8t" value="mod2_rz8t+rz8t_align" /> - <constant name="final_rz9t" value="mod2_rz9t+rz9t_align" /> - <constant name="final_rz10t" value="mod2_rz10t+rz10t_align" /> - <constant name="final_x1b" value="mod2_x1b+x1b_align" /> - <constant name="final_x2b" value="mod2_x2b+x2b_align" /> - <constant name="final_x3b" value="mod2_x3b+x3b_align" /> - <constant name="final_x4b" value="mod2_x4b+x4b_align" /> - <constant name="final_x5b" value="mod2_x5b+x5b_align" /> - <constant name="final_x6b" value="mod2_x6b+x6b_align" /> - <constant name="final_x7b" value="mod2_x7b+x7b_align" /> - <constant name="final_x8b" value="mod2_x8b+x8b_align" /> - <constant name="final_x9b" value="mod2_x9b+x9b_align" /> - <constant name="final_x10b" value="mod2_x10b+x10b_align" /> - <constant name="final_y1b" value="mod2_y1b+y1b_align" /> - <constant name="final_y2b" value="mod2_y2b+y2b_align" /> - <constant name="final_y3b" value="mod2_y3b+y3b_align" /> - <constant name="final_y4b" value="mod2_y4b+y4b_align" /> - <constant name="final_y5b" value="mod2_y5b+y5b_align" /> - <constant name="final_y6b" value="mod2_y6b+y6b_align" /> - <constant name="final_y7b" value="mod2_y7b+y7b_align" /> - <constant name="final_y8b" value="mod2_y8b+y8b_align" /> - <constant name="final_y9b" value="mod2_y9b+y9b_align" /> - <constant name="final_y10b" value="mod2_y10b+y10b_align" /> - <constant name="final_z1b" value="mod2_z1b+z1b_align" /> - <constant name="final_z2b" value="mod2_z2b+z2b_align" /> - <constant name="final_z3b" value="mod2_z3b+z3b_align" /> - <constant name="final_z4b" value="mod2_z4b+z4b_align" /> - <constant name="final_z5b" value="mod2_z5b+z5b_align" /> - <constant name="final_z6b" value="mod2_z6b+z6b_align" /> - <constant name="final_z7b" value="mod2_z7b+z7b_align" /> - <constant name="final_z8b" value="mod2_z8b+z8b_align" /> - <constant name="final_z9b" value="mod2_z9b+z9b_align" /> - <constant name="final_z10b" value="mod2_z10b+z10b_align" /> - <constant name="final_rx1b" value="mod2_rx1b+rx1b_align" /> - <constant name="final_rx2b" value="mod2_rx2b+rx2b_align" /> - <constant name="final_rx3b" value="mod2_rx3b+rx3b_align" /> - <constant name="final_rx4b" value="mod2_rx4b+rx4b_align" /> - <constant name="final_rx5b" value="mod2_rx5b+rx5b_align" /> - <constant name="final_rx6b" value="mod2_rx6b+rx6b_align" /> - <constant name="final_rx7b" value="mod2_rx7b+rx7b_align" /> - <constant name="final_rx8b" value="mod2_rx8b+rx8b_align" /> - <constant name="final_rx9b" value="mod2_rx9b+rx9b_align" /> - <constant name="final_rx10b" value="mod2_rx10b+rx10b_align" /> - <constant name="final_ry1b" value="mod2_ry1b+ry1b_align" /> - <constant name="final_ry2b" value="mod2_ry2b+ry2b_align" /> - <constant name="final_ry3b" value="mod2_ry3b+ry3b_align" /> - <constant name="final_ry4b" value="mod2_ry4b+ry4b_align" /> - <constant name="final_ry5b" value="mod2_ry5b+ry5b_align" /> - <constant name="final_ry6b" value="mod2_ry6b+ry6b_align" /> - <constant name="final_ry7b" value="mod2_ry7b+ry7b_align" /> - <constant name="final_ry8b" value="mod2_ry8b+ry8b_align" /> - <constant name="final_ry9b" value="mod2_ry9b+ry9b_align" /> - <constant name="final_ry10b" value="mod2_ry10b+ry10b_align" /> - <constant name="final_rz1b" value="mod2_rz1b+rz1b_align" /> - <constant name="final_rz2b" value="mod2_rz2b+rz2b_align" /> - <constant name="final_rz3b" value="mod2_rz3b+rz3b_align" /> - <constant name="final_rz4b" value="mod2_rz4b+rz4b_align" /> - <constant name="final_rz5b" value="mod2_rz5b+rz5b_align" /> - <constant name="final_rz6b" value="mod2_rz6b+rz6b_align" /> - <constant name="final_rz7b" value="mod2_rz7b+rz7b_align" /> - <constant name="final_rz8b" value="mod2_rz8b+rz8b_align" /> - <constant name="final_rz9b" value="mod2_rz9b+rz9b_align" /> - <constant name="final_rz10b" value="mod2_rz10b+rz10b_align" /> - - + + <!-- final constants --> + <constant name="final_x1t" value="mod2_x1t+x1t_align" /> + <constant name="final_x2t" value="mod2_x2t+x2t_align" /> + <constant name="final_x3t" value="mod2_x3t+x3t_align" /> + <constant name="final_x4t" value="mod2_x4t+x4t_align" /> + <constant name="final_x5t" value="mod2_x5t+x5t_align" /> + <constant name="final_x6t" value="mod2_x6t+x6t_align" /> + <constant name="final_x7t" value="mod2_x7t+x7t_align" /> + <constant name="final_x8t" value="mod2_x8t+x8t_align" /> + <constant name="final_x9t" value="mod2_x9t+x9t_align" /> + <constant name="final_x10t" value="mod2_x10t+x10t_align" /> + <constant name="final_y1t" value="mod2_y1t+y1t_align" /> + <constant name="final_y2t" value="mod2_y2t+y2t_align" /> + <constant name="final_y3t" value="mod2_y3t+y3t_align" /> + <constant name="final_y4t" value="mod2_y4t+y4t_align" /> + <constant name="final_y5t" value="mod2_y5t+y5t_align" /> + <constant name="final_y6t" value="mod2_y6t+y6t_align" /> + <constant name="final_y7t" value="mod2_y7t+y7t_align" /> + <constant name="final_y8t" value="mod2_y8t+y8t_align" /> + <constant name="final_y9t" value="mod2_y9t+y9t_align" /> + <constant name="final_y10t" value="mod2_y10t+y10t_align" /> + <constant name="final_z1t" value="mod2_z1t+z1t_align" /> + <constant name="final_z2t" value="mod2_z2t+z2t_align" /> + <constant name="final_z3t" value="mod2_z3t+z3t_align" /> + <constant name="final_z4t" value="mod2_z4t+z4t_align" /> + <constant name="final_z5t" value="mod2_z5t+z5t_align" /> + <constant name="final_z6t" value="mod2_z6t+z6t_align" /> + <constant name="final_z7t" value="mod2_z7t+z7t_align" /> + <constant name="final_z8t" value="mod2_z8t+z8t_align" /> + <constant name="final_z9t" value="mod2_z9t+z9t_align" /> + <constant name="final_z10t" value="mod2_z10t+z10t_align" /> + <constant name="final_rx1t" value="mod2_rx1t+rx1t_align" /> + <constant name="final_rx2t" value="mod2_rx2t+rx2t_align" /> + <constant name="final_rx3t" value="mod2_rx3t+rx3t_align" /> + <constant name="final_rx4t" value="mod2_rx4t+rx4t_align" /> + <constant name="final_rx5t" value="mod2_rx5t+rx5t_align" /> + <constant name="final_rx6t" value="mod2_rx6t+rx6t_align" /> + <constant name="final_rx7t" value="mod2_rx7t+rx7t_align" /> + <constant name="final_rx8t" value="mod2_rx8t+rx8t_align" /> + <constant name="final_rx9t" value="mod2_rx9t+rx9t_align" /> + <constant name="final_rx10t" value="mod2_rx10t+rx10t_align" /> + <constant name="final_ry1t" value="mod2_ry1t+ry1t_align" /> + <constant name="final_ry2t" value="mod2_ry2t+ry2t_align" /> + <constant name="final_ry3t" value="mod2_ry3t+ry3t_align" /> + <constant name="final_ry4t" value="mod2_ry4t+ry4t_align" /> + <constant name="final_ry5t" value="mod2_ry5t+ry5t_align" /> + <constant name="final_ry6t" value="mod2_ry6t+ry6t_align" /> + <constant name="final_ry7t" value="mod2_ry7t+ry7t_align" /> + <constant name="final_ry8t" value="mod2_ry8t+ry8t_align" /> + <constant name="final_ry9t" value="mod2_ry9t+ry9t_align" /> + <constant name="final_ry10t" value="mod2_ry10t+ry10t_align" /> + <constant name="final_rz1t" value="mod2_rz1t+rz1t_align" /> + <constant name="final_rz2t" value="mod2_rz2t+rz2t_align" /> + <constant name="final_rz3t" value="mod2_rz3t+rz3t_align" /> + <constant name="final_rz4t" value="mod2_rz4t+rz4t_align" /> + <constant name="final_rz5t" value="mod2_rz5t+rz5t_align" /> + <constant name="final_rz6t" value="mod2_rz6t+rz6t_align" /> + <constant name="final_rz7t" value="mod2_rz7t+rz7t_align" /> + <constant name="final_rz8t" value="mod2_rz8t+rz8t_align" /> + <constant name="final_rz9t" value="mod2_rz9t+rz9t_align" /> + <constant name="final_rz10t" value="mod2_rz10t+rz10t_align" /> + <constant name="final_x1b" value="mod2_x1b+x1b_align" /> + <constant name="final_x2b" value="mod2_x2b+x2b_align" /> + <constant name="final_x3b" value="mod2_x3b+x3b_align" /> + <constant name="final_x4b" value="mod2_x4b+x4b_align" /> + <constant name="final_x5b" value="mod2_x5b+x5b_align" /> + <constant name="final_x6b" value="mod2_x6b+x6b_align" /> + <constant name="final_x7b" value="mod2_x7b+x7b_align" /> + <constant name="final_x8b" value="mod2_x8b+x8b_align" /> + <constant name="final_x9b" value="mod2_x9b+x9b_align" /> + <constant name="final_x10b" value="mod2_x10b+x10b_align" /> + <constant name="final_y1b" value="mod2_y1b+y1b_align" /> + <constant name="final_y2b" value="mod2_y2b+y2b_align" /> + <constant name="final_y3b" value="mod2_y3b+y3b_align" /> + <constant name="final_y4b" value="mod2_y4b+y4b_align" /> + <constant name="final_y5b" value="mod2_y5b+y5b_align" /> + <constant name="final_y6b" value="mod2_y6b+y6b_align" /> + <constant name="final_y7b" value="mod2_y7b+y7b_align" /> + <constant name="final_y8b" value="mod2_y8b+y8b_align" /> + <constant name="final_y9b" value="mod2_y9b+y9b_align" /> + <constant name="final_y10b" value="mod2_y10b+y10b_align" /> + <constant name="final_z1b" value="mod2_z1b+z1b_align" /> + <constant name="final_z2b" value="mod2_z2b+z2b_align" /> + <constant name="final_z3b" value="mod2_z3b+z3b_align" /> + <constant name="final_z4b" value="mod2_z4b+z4b_align" /> + <constant name="final_z5b" value="mod2_z5b+z5b_align" /> + <constant name="final_z6b" value="mod2_z6b+z6b_align" /> + <constant name="final_z7b" value="mod2_z7b+z7b_align" /> + <constant name="final_z8b" value="mod2_z8b+z8b_align" /> + <constant name="final_z9b" value="mod2_z9b+z9b_align" /> + <constant name="final_z10b" value="mod2_z10b+z10b_align" /> + <constant name="final_rx1b" value="mod2_rx1b+rx1b_align" /> + <constant name="final_rx2b" value="mod2_rx2b+rx2b_align" /> + <constant name="final_rx3b" value="mod2_rx3b+rx3b_align" /> + <constant name="final_rx4b" value="mod2_rx4b+rx4b_align" /> + <constant name="final_rx5b" value="mod2_rx5b+rx5b_align" /> + <constant name="final_rx6b" value="mod2_rx6b+rx6b_align" /> + <constant name="final_rx7b" value="mod2_rx7b+rx7b_align" /> + <constant name="final_rx8b" value="mod2_rx8b+rx8b_align" /> + <constant name="final_rx9b" value="mod2_rx9b+rx9b_align" /> + <constant name="final_rx10b" value="mod2_rx10b+rx10b_align" /> + <constant name="final_ry1b" value="mod2_ry1b+ry1b_align" /> + <constant name="final_ry2b" value="mod2_ry2b+ry2b_align" /> + <constant name="final_ry3b" value="mod2_ry3b+ry3b_align" /> + <constant name="final_ry4b" value="mod2_ry4b+ry4b_align" /> + <constant name="final_ry5b" value="mod2_ry5b+ry5b_align" /> + <constant name="final_ry6b" value="mod2_ry6b+ry6b_align" /> + <constant name="final_ry7b" value="mod2_ry7b+ry7b_align" /> + <constant name="final_ry8b" value="mod2_ry8b+ry8b_align" /> + <constant name="final_ry9b" value="mod2_ry9b+ry9b_align" /> + <constant name="final_ry10b" value="mod2_ry10b+ry10b_align" /> + <constant name="final_rz1b" value="mod2_rz1b+rz1b_align" /> + <constant name="final_rz2b" value="mod2_rz2b+rz2b_align" /> + <constant name="final_rz3b" value="mod2_rz3b+rz3b_align" /> + <constant name="final_rz4b" value="mod2_rz4b+rz4b_align" /> + <constant name="final_rz5b" value="mod2_rz5b+rz5b_align" /> + <constant name="final_rz6b" value="mod2_rz6b+rz6b_align" /> + <constant name="final_rz7b" value="mod2_rz7b+rz7b_align" /> + <constant name="final_rz8b" value="mod2_rz8b+rz8b_align" /> + <constant name="final_rz9b" value="mod2_rz9b+rz9b_align" /> + <constant name="final_rz10b" value="mod2_rz10b+rz10b_align" /> + + </define> <materials> - <!-- Set the world material to vacuum. --> + <!-- Set the world material to vacuum. --> <material name="WorldMaterial"> <D type="density" unit="g/cm3" value="0.0000000000000001" /> <fraction n="1.0" ref="Vacuum" /> @@ -801,7 +801,7 @@ </layer> <layer id="2"> <module_placement name="TestRunModuleFieldDef" id="0" x="0" y="0" z="dipoleMagnetPositionZ+dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2" /> - </layer> + </layer> </detector> <detector id="13" name="Ecal" type="HPSEcal3" insideTrackingVolume="false" readout="EcalHits" vis="ECALVis"> Modified: java/trunk/detector-data/detectors/HPS-TestRun-v8/compact.xml ============================================================================= --- java/trunk/detector-data/detectors/HPS-TestRun-v8/compact.xml (original) +++ java/trunk/detector-data/detectors/HPS-TestRun-v8/compact.xml Wed Mar 9 11:43:24 2016 @@ -64,127 +64,127 @@ <!-- <constant name="x_off" value = "-15.0"/> --> <constant name="x_off" value = "0.0"/> - <!-- alignment corrections --> - <constant name="x1t_align" value="0.000000"/> - <constant name="x2t_align" value="0.000000"/> - <constant name="x3t_align" value="0.000000"/> - <constant name="x4t_align" value="0.000000"/> - <constant name="x5t_align" value="0.000000"/> - <constant name="x6t_align" value="0.000000"/> - <constant name="x7t_align" value="0.000000"/> - <constant name="x8t_align" value="0.000000"/> - <constant name="x9t_align" value="0.000000"/> - <constant name="x10t_align" value="0.000000"/> - <constant name="y1t_align" value="0.000000"/> - <constant name="y2t_align" value="0.000000"/> - <constant name="y3t_align" value="0.000000"/> - <constant name="y4t_align" value="0.000000"/> - <constant name="y5t_align" value="0.000000"/> - <constant name="y6t_align" value="0.000000"/> - <constant name="y7t_align" value="0.000000"/> - <constant name="y8t_align" value="0.000000"/> - <constant name="y9t_align" value="0.000000"/> - <constant name="y10t_align" value="0.000000"/> - <constant name="z1t_align" value="0.000000"/> - <constant name="z2t_align" value="0.000000"/> - <constant name="z3t_align" value="0.000000"/> - <constant name="z4t_align" value="0.000000"/> - <constant name="z5t_align" value="0.000000"/> - <constant name="z6t_align" value="0.000000"/> - <constant name="z7t_align" value="0.000000"/> - <constant name="z8t_align" value="0.000000"/> - <constant name="z9t_align" value="0.000000"/> - <constant name="z10t_align" value="0.000000"/> - <constant name="rx1t_align" value="0.000000"/> - <constant name="rx2t_align" value="0.000000"/> - <constant name="rx3t_align" value="0.000000"/> - <constant name="rx4t_align" value="0.000000"/> - <constant name="rx5t_align" value="0.000000"/> - <constant name="rx6t_align" value="0.000000"/> - <constant name="rx7t_align" value="0.000000"/> - <constant name="rx8t_align" value="0.000000"/> - <constant name="rx9t_align" value="0.000000"/> - <constant name="rx10t_align" value="0.000000"/> - <constant name="ry1t_align" value="0.000000"/> - <constant name="ry2t_align" value="0.000000"/> - <constant name="ry3t_align" value="0.000000"/> - <constant name="ry4t_align" value="0.000000"/> - <constant name="ry5t_align" value="0.000000"/> - <constant name="ry6t_align" value="0.000000"/> - <constant name="ry7t_align" value="0.000000"/> - <constant name="ry8t_align" value="0.000000"/> - <constant name="ry9t_align" value="0.000000"/> - <constant name="ry10t_align" value="0.000000"/> - <constant name="rz1t_align" value="0.000000"/> - <constant name="rz2t_align" value="0.000000"/> - <constant name="rz3t_align" value="0.000000"/> - <constant name="rz4t_align" value="0.000000"/> - <constant name="rz5t_align" value="0.000000"/> - <constant name="rz6t_align" value="0.000000"/> - <constant name="rz7t_align" value="0.000000"/> - <constant name="rz8t_align" value="0.000000"/> - <constant name="rz9t_align" value="0.000000"/> - <constant name="rz10t_align" value="0.000000"/> - <constant name="x1b_align" value="0.000000"/> - <constant name="x2b_align" value="0.000000"/> - <constant name="x3b_align" value="0.000000"/> - <constant name="x4b_align" value="0.000000"/> - <constant name="x5b_align" value="0.000000"/> - <constant name="x6b_align" value="0.000000"/> - <constant name="x7b_align" value="0.000000"/> - <constant name="x8b_align" value="0.000000"/> - <constant name="x9b_align" value="0.000000"/> - <constant name="x10b_align" value="0.000000"/> - <constant name="y1b_align" value="0.000000"/> - <constant name="y2b_align" value="0.000000"/> - <constant name="y3b_align" value="0.000000"/> - <constant name="y4b_align" value="0.000000"/> - <constant name="y5b_align" value="0.000000"/> - <constant name="y6b_align" value="0.000000"/> - <constant name="y7b_align" value="0.000000"/> - <constant name="y8b_align" value="0.000000"/> - <constant name="y9b_align" value="0.000000"/> - <constant name="y10b_align" value="0.000000"/> - <constant name="z1b_align" value="0.000000"/> - <constant name="z2b_align" value="0.000000"/> - <constant name="z3b_align" value="0.000000"/> - <constant name="z4b_align" value="0.000000"/> - <constant name="z5b_align" value="0.000000"/> - <constant name="z6b_align" value="0.000000"/> - <constant name="z7b_align" value="0.000000"/> - <constant name="z8b_align" value="0.000000"/> - <constant name="z9b_align" value="0.000000"/> - <constant name="z10b_align" value="0.000000"/> - <constant name="rx1b_align" value="0.000000"/> - <constant name="rx2b_align" value="0.000000"/> - <constant name="rx3b_align" value="0.000000"/> - <constant name="rx4b_align" value="0.000000"/> - <constant name="rx5b_align" value="0.000000"/> - <constant name="rx6b_align" value="0.000000"/> - <constant name="rx7b_align" value="0.000000"/> - <constant name="rx8b_align" value="0.000000"/> - <constant name="rx9b_align" value="0.000000"/> - <constant name="rx10b_align" value="0.000000"/> - <constant name="ry1b_align" value="0.000000"/> - <constant name="ry2b_align" value="0.000000"/> - <constant name="ry3b_align" value="0.000000"/> - <constant name="ry4b_align" value="0.000000"/> - <constant name="ry5b_align" value="0.000000"/> - <constant name="ry6b_align" value="0.000000"/> - <constant name="ry7b_align" value="0.000000"/> - <constant name="ry8b_align" value="0.000000"/> - <constant name="ry9b_align" value="0.000000"/> - <constant name="ry10b_align" value="0.000000"/> - <constant name="rz1b_align" value="0.000000"/> - <constant name="rz2b_align" value="0.000000"/> - <constant name="rz3b_align" value="0.000000"/> - <constant name="rz4b_align" value="0.000000"/> - <constant name="rz5b_align" value="0.000000"/> - <constant name="rz6b_align" value="0.000000"/> - <constant name="rz7b_align" value="0.000000"/> - <constant name="rz8b_align" value="0.000000"/> - <constant name="rz9b_align" value="0.000000"/> - <constant name="rz10b_align" value="0.000000"/> + <!-- alignment corrections --> + <constant name="x1t_align" value="0.000000"/> + <constant name="x2t_align" value="0.000000"/> + <constant name="x3t_align" value="0.000000"/> + <constant name="x4t_align" value="0.000000"/> + <constant name="x5t_align" value="0.000000"/> + <constant name="x6t_align" value="0.000000"/> + <constant name="x7t_align" value="0.000000"/> + <constant name="x8t_align" value="0.000000"/> + <constant name="x9t_align" value="0.000000"/> + <constant name="x10t_align" value="0.000000"/> + <constant name="y1t_align" value="0.000000"/> + <constant name="y2t_align" value="0.000000"/> + <constant name="y3t_align" value="0.000000"/> + <constant name="y4t_align" value="0.000000"/> + <constant name="y5t_align" value="0.000000"/> + <constant name="y6t_align" value="0.000000"/> + <constant name="y7t_align" value="0.000000"/> + <constant name="y8t_align" value="0.000000"/> + <constant name="y9t_align" value="0.000000"/> + <constant name="y10t_align" value="0.000000"/> + <constant name="z1t_align" value="0.000000"/> + <constant name="z2t_align" value="0.000000"/> + <constant name="z3t_align" value="0.000000"/> + <constant name="z4t_align" value="0.000000"/> + <constant name="z5t_align" value="0.000000"/> + <constant name="z6t_align" value="0.000000"/> + <constant name="z7t_align" value="0.000000"/> + <constant name="z8t_align" value="0.000000"/> + <constant name="z9t_align" value="0.000000"/> + <constant name="z10t_align" value="0.000000"/> + <constant name="rx1t_align" value="0.000000"/> + <constant name="rx2t_align" value="0.000000"/> + <constant name="rx3t_align" value="0.000000"/> + <constant name="rx4t_align" value="0.000000"/> + <constant name="rx5t_align" value="0.000000"/> + <constant name="rx6t_align" value="0.000000"/> + <constant name="rx7t_align" value="0.000000"/> + <constant name="rx8t_align" value="0.000000"/> + <constant name="rx9t_align" value="0.000000"/> + <constant name="rx10t_align" value="0.000000"/> + <constant name="ry1t_align" value="0.000000"/> + <constant name="ry2t_align" value="0.000000"/> + <constant name="ry3t_align" value="0.000000"/> + <constant name="ry4t_align" value="0.000000"/> + <constant name="ry5t_align" value="0.000000"/> + <constant name="ry6t_align" value="0.000000"/> + <constant name="ry7t_align" value="0.000000"/> + <constant name="ry8t_align" value="0.000000"/> + <constant name="ry9t_align" value="0.000000"/> + <constant name="ry10t_align" value="0.000000"/> + <constant name="rz1t_align" value="0.000000"/> + <constant name="rz2t_align" value="0.000000"/> + <constant name="rz3t_align" value="0.000000"/> + <constant name="rz4t_align" value="0.000000"/> + <constant name="rz5t_align" value="0.000000"/> + <constant name="rz6t_align" value="0.000000"/> + <constant name="rz7t_align" value="0.000000"/> + <constant name="rz8t_align" value="0.000000"/> + <constant name="rz9t_align" value="0.000000"/> + <constant name="rz10t_align" value="0.000000"/> + <constant name="x1b_align" value="0.000000"/> + <constant name="x2b_align" value="0.000000"/> + <constant name="x3b_align" value="0.000000"/> + <constant name="x4b_align" value="0.000000"/> + <constant name="x5b_align" value="0.000000"/> + <constant name="x6b_align" value="0.000000"/> + <constant name="x7b_align" value="0.000000"/> + <constant name="x8b_align" value="0.000000"/> + <constant name="x9b_align" value="0.000000"/> + <constant name="x10b_align" value="0.000000"/> + <constant name="y1b_align" value="0.000000"/> + <constant name="y2b_align" value="0.000000"/> + <constant name="y3b_align" value="0.000000"/> + <constant name="y4b_align" value="0.000000"/> + <constant name="y5b_align" value="0.000000"/> + <constant name="y6b_align" value="0.000000"/> + <constant name="y7b_align" value="0.000000"/> + <constant name="y8b_align" value="0.000000"/> + <constant name="y9b_align" value="0.000000"/> + <constant name="y10b_align" value="0.000000"/> + <constant name="z1b_align" value="0.000000"/> + <constant name="z2b_align" value="0.000000"/> + <constant name="z3b_align" value="0.000000"/> + <constant name="z4b_align" value="0.000000"/> + <constant name="z5b_align" value="0.000000"/> + <constant name="z6b_align" value="0.000000"/> + <constant name="z7b_align" value="0.000000"/> + <constant name="z8b_align" value="0.000000"/> + <constant name="z9b_align" value="0.000000"/> + <constant name="z10b_align" value="0.000000"/> + <constant name="rx1b_align" value="0.000000"/> + <constant name="rx2b_align" value="0.000000"/> + <constant name="rx3b_align" value="0.000000"/> + <constant name="rx4b_align" value="0.000000"/> + <constant name="rx5b_align" value="0.000000"/> + <constant name="rx6b_align" value="0.000000"/> + <constant name="rx7b_align" value="0.000000"/> + <constant name="rx8b_align" value="0.000000"/> + <constant name="rx9b_align" value="0.000000"/> + <constant name="rx10b_align" value="0.000000"/> + <constant name="ry1b_align" value="0.000000"/> + <constant name="ry2b_align" value="0.000000"/> + <constant name="ry3b_align" value="0.000000"/> + <constant name="ry4b_align" value="0.000000"/> + <constant name="ry5b_align" value="0.000000"/> + <constant name="ry6b_align" value="0.000000"/> + <constant name="ry7b_align" value="0.000000"/> + <constant name="ry8b_align" value="0.000000"/> + <constant name="ry9b_align" value="0.000000"/> + <constant name="ry10b_align" value="0.000000"/> + <constant name="rz1b_align" value="0.000000"/> + <constant name="rz2b_align" value="0.000000"/> + <constant name="rz3b_align" value="0.000000"/> + <constant name="rz4b_align" value="0.000000"/> + <constant name="rz5b_align" value="0.000000"/> + <constant name="rz6b_align" value="0.000000"/> + <constant name="rz7b_align" value="0.000000"/> + <constant name="rz8b_align" value="0.000000"/> + <constant name="rz9b_align" value="0.000000"/> + <constant name="rz10b_align" value="0.000000"/> <!-- Positions of sensor centers above/below nominal beam --> <constant name="y1t" value="36.894" /> @@ -584,134 +584,134 @@ <constant name="mod2_rx10b" value="mod_rx10b"/> <constant name="mod2_ry10b" value="mod_ry10b+y_rot_bot_pivot"/> <constant name="mod2_rz10b" value="mod_rz10b"/> - - <!-- final constants --> - <constant name="final_x1t" value="mod2_x1t+x1t_align"/> - <constant name="final_x2t" value="mod2_x2t+x2t_align"/> - <constant name="final_x3t" value="mod2_x3t+x3t_align"/> - <constant name="final_x4t" value="mod2_x4t+x4t_align"/> - <constant name="final_x5t" value="mod2_x5t+x5t_align"/> - <constant name="final_x6t" value="mod2_x6t+x6t_align"/> - <constant name="final_x7t" value="mod2_x7t+x7t_align"/> - <constant name="final_x8t" value="mod2_x8t+x8t_align"/> - <constant name="final_x9t" value="mod2_x9t+x9t_align"/> - <constant name="final_x10t" value="mod2_x10t+x10t_align"/> - <constant name="final_y1t" value="mod2_y1t+y1t_align"/> - <constant name="final_y2t" value="mod2_y2t+y2t_align"/> - <constant name="final_y3t" value="mod2_y3t+y3t_align"/> - <constant name="final_y4t" value="mod2_y4t+y4t_align"/> - <constant name="final_y5t" value="mod2_y5t+y5t_align"/> - <constant name="final_y6t" value="mod2_y6t+y6t_align"/> - <constant name="final_y7t" value="mod2_y7t+y7t_align"/> - <constant name="final_y8t" value="mod2_y8t+y8t_align"/> - <constant name="final_y9t" value="mod2_y9t+y9t_align"/> - <constant name="final_y10t" value="mod2_y10t+y10t_align"/> - <constant name="final_z1t" value="mod2_z1t+z1t_align"/> - <constant name="final_z2t" value="mod2_z2t+z2t_align"/> - <constant name="final_z3t" value="mod2_z3t+z3t_align"/> - <constant name="final_z4t" value="mod2_z4t+z4t_align"/> - <constant name="final_z5t" value="mod2_z5t+z5t_align"/> - <constant name="final_z6t" value="mod2_z6t+z6t_align"/> - <constant name="final_z7t" value="mod2_z7t+z7t_align"/> - <constant name="final_z8t" value="mod2_z8t+z8t_align"/> - <constant name="final_z9t" value="mod2_z9t+z9t_align"/> - <constant name="final_z10t" value="mod2_z10t+z10t_align"/> - <constant name="final_rx1t" value="mod2_rx1t+rx1t_align"/> - <constant name="final_rx2t" value="mod2_rx2t+rx2t_align"/> - <constant name="final_rx3t" value="mod2_rx3t+rx3t_align"/> - <constant name="final_rx4t" value="mod2_rx4t+rx4t_align"/> - <constant name="final_rx5t" value="mod2_rx5t+rx5t_align"/> - <constant name="final_rx6t" value="mod2_rx6t+rx6t_align"/> - <constant name="final_rx7t" value="mod2_rx7t+rx7t_align"/> - <constant name="final_rx8t" value="mod2_rx8t+rx8t_align"/> - <constant name="final_rx9t" value="mod2_rx9t+rx9t_align"/> - <constant name="final_rx10t" value="mod2_rx10t+rx10t_align"/> - <constant name="final_ry1t" value="mod2_ry1t+ry1t_align"/> - <constant name="final_ry2t" value="mod2_ry2t+ry2t_align"/> - <constant name="final_ry3t" value="mod2_ry3t+ry3t_align"/> - <constant name="final_ry4t" value="mod2_ry4t+ry4t_align"/> - <constant name="final_ry5t" value="mod2_ry5t+ry5t_align"/> - <constant name="final_ry6t" value="mod2_ry6t+ry6t_align"/> - <constant name="final_ry7t" value="mod2_ry7t+ry7t_align"/> - <constant name="final_ry8t" value="mod2_ry8t+ry8t_align"/> - <constant name="final_ry9t" value="mod2_ry9t+ry9t_align"/> - <constant name="final_ry10t" value="mod2_ry10t+ry10t_align"/> - <constant name="final_rz1t" value="mod2_rz1t+rz1t_align"/> - <constant name="final_rz2t" value="mod2_rz2t+rz2t_align"/> - <constant name="final_rz3t" value="mod2_rz3t+rz3t_align"/> - <constant name="final_rz4t" value="mod2_rz4t+rz4t_align"/> - <constant name="final_rz5t" value="mod2_rz5t+rz5t_align"/> - <constant name="final_rz6t" value="mod2_rz6t+rz6t_align"/> - <constant name="final_rz7t" value="mod2_rz7t+rz7t_align"/> - <constant name="final_rz8t" value="mod2_rz8t+rz8t_align"/> - <constant name="final_rz9t" value="mod2_rz9t+rz9t_align"/> - <constant name="final_rz10t" value="mod2_rz10t+rz10t_align"/> - <constant name="final_x1b" value="mod2_x1b+x1b_align"/> - <constant name="final_x2b" value="mod2_x2b+x2b_align"/> - <constant name="final_x3b" value="mod2_x3b+x3b_align"/> - <constant name="final_x4b" value="mod2_x4b+x4b_align"/> - <constant name="final_x5b" value="mod2_x5b+x5b_align"/> - <constant name="final_x6b" value="mod2_x6b+x6b_align"/> - <constant name="final_x7b" value="mod2_x7b+x7b_align"/> - <constant name="final_x8b" value="mod2_x8b+x8b_align"/> - <constant name="final_x9b" value="mod2_x9b+x9b_align"/> - <constant name="final_x10b" value="mod2_x10b+x10b_align"/> - <constant name="final_y1b" value="mod2_y1b+y1b_align"/> - <constant name="final_y2b" value="mod2_y2b+y2b_align"/> - <constant name="final_y3b" value="mod2_y3b+y3b_align"/> - <constant name="final_y4b" value="mod2_y4b+y4b_align"/> - <constant name="final_y5b" value="mod2_y5b+y5b_align"/> - <constant name="final_y6b" value="mod2_y6b+y6b_align"/> - <constant name="final_y7b" value="mod2_y7b+y7b_align"/> - <constant name="final_y8b" value="mod2_y8b+y8b_align"/> - <constant name="final_y9b" value="mod2_y9b+y9b_align"/> - <constant name="final_y10b" value="mod2_y10b+y10b_align"/> - <constant name="final_z1b" value="mod2_z1b+z1b_align"/> - <constant name="final_z2b" value="mod2_z2b+z2b_align"/> - <constant name="final_z3b" value="mod2_z3b+z3b_align"/> - <constant name="final_z4b" value="mod2_z4b+z4b_align"/> - <constant name="final_z5b" value="mod2_z5b+z5b_align"/> - <constant name="final_z6b" value="mod2_z6b+z6b_align"/> - <constant name="final_z7b" value="mod2_z7b+z7b_align"/> - <constant name="final_z8b" value="mod2_z8b+z8b_align"/> - <constant name="final_z9b" value="mod2_z9b+z9b_align"/> - <constant name="final_z10b" value="mod2_z10b+z10b_align"/> - <constant name="final_rx1b" value="mod2_rx1b+rx1b_align"/> - <constant name="final_rx2b" value="mod2_rx2b+rx2b_align"/> - <constant name="final_rx3b" value="mod2_rx3b+rx3b_align"/> - <constant name="final_rx4b" value="mod2_rx4b+rx4b_align"/> - <constant name="final_rx5b" value="mod2_rx5b+rx5b_align"/> - <constant name="final_rx6b" value="mod2_rx6b+rx6b_align"/> - <constant name="final_rx7b" value="mod2_rx7b+rx7b_align"/> - <constant name="final_rx8b" value="mod2_rx8b+rx8b_align"/> - <constant name="final_rx9b" value="mod2_rx9b+rx9b_align"/> - <constant name="final_rx10b" value="mod2_rx10b+rx10b_align"/> - <constant name="final_ry1b" value="mod2_ry1b+ry1b_align"/> - <constant name="final_ry2b" value="mod2_ry2b+ry2b_align"/> - <constant name="final_ry3b" value="mod2_ry3b+ry3b_align"/> - <constant name="final_ry4b" value="mod2_ry4b+ry4b_align"/> - <constant name="final_ry5b" value="mod2_ry5b+ry5b_align"/> - <constant name="final_ry6b" value="mod2_ry6b+ry6b_align"/> - <constant name="final_ry7b" value="mod2_ry7b+ry7b_align"/> - <constant name="final_ry8b" value="mod2_ry8b+ry8b_align"/> - <constant name="final_ry9b" value="mod2_ry9b+ry9b_align"/> - <constant name="final_ry10b" value="mod2_ry10b+ry10b_align"/> - <constant name="final_rz1b" value="mod2_rz1b+rz1b_align"/> - <constant name="final_rz2b" value="mod2_rz2b+rz2b_align"/> - <constant name="final_rz3b" value="mod2_rz3b+rz3b_align"/> - <constant name="final_rz4b" value="mod2_rz4b+rz4b_align"/> - <constant name="final_rz5b" value="mod2_rz5b+rz5b_align"/> - <constant name="final_rz6b" value="mod2_rz6b+rz6b_align"/> - <constant name="final_rz7b" value="mod2_rz7b+rz7b_align"/> - <constant name="final_rz8b" value="mod2_rz8b+rz8b_align"/> - <constant name="final_rz9b" value="mod2_rz9b+rz9b_align"/> - <constant name="final_rz10b" value="mod2_rz10b+rz10b_align"/> - - + + <!-- final constants --> + <constant name="final_x1t" value="mod2_x1t+x1t_align"/> + <constant name="final_x2t" value="mod2_x2t+x2t_align"/> + <constant name="final_x3t" value="mod2_x3t+x3t_align"/> + <constant name="final_x4t" value="mod2_x4t+x4t_align"/> + <constant name="final_x5t" value="mod2_x5t+x5t_align"/> + <constant name="final_x6t" value="mod2_x6t+x6t_align"/> + <constant name="final_x7t" value="mod2_x7t+x7t_align"/> + <constant name="final_x8t" value="mod2_x8t+x8t_align"/> + <constant name="final_x9t" value="mod2_x9t+x9t_align"/> + <constant name="final_x10t" value="mod2_x10t+x10t_align"/> + <constant name="final_y1t" value="mod2_y1t+y1t_align"/> + <constant name="final_y2t" value="mod2_y2t+y2t_align"/> + <constant name="final_y3t" value="mod2_y3t+y3t_align"/> + <constant name="final_y4t" value="mod2_y4t+y4t_align"/> + <constant name="final_y5t" value="mod2_y5t+y5t_align"/> + <constant name="final_y6t" value="mod2_y6t+y6t_align"/> + <constant name="final_y7t" value="mod2_y7t+y7t_align"/> + <constant name="final_y8t" value="mod2_y8t+y8t_align"/> + <constant name="final_y9t" value="mod2_y9t+y9t_align"/> + <constant name="final_y10t" value="mod2_y10t+y10t_align"/> + <constant name="final_z1t" value="mod2_z1t+z1t_align"/> + <constant name="final_z2t" value="mod2_z2t+z2t_align"/> + <constant name="final_z3t" value="mod2_z3t+z3t_align"/> + <constant name="final_z4t" value="mod2_z4t+z4t_align"/> + <constant name="final_z5t" value="mod2_z5t+z5t_align"/> + <constant name="final_z6t" value="mod2_z6t+z6t_align"/> + <constant name="final_z7t" value="mod2_z7t+z7t_align"/> + <constant name="final_z8t" value="mod2_z8t+z8t_align"/> + <constant name="final_z9t" value="mod2_z9t+z9t_align"/> + <constant name="final_z10t" value="mod2_z10t+z10t_align"/> + <constant name="final_rx1t" value="mod2_rx1t+rx1t_align"/> + <constant name="final_rx2t" value="mod2_rx2t+rx2t_align"/> + <constant name="final_rx3t" value="mod2_rx3t+rx3t_align"/> + <constant name="final_rx4t" value="mod2_rx4t+rx4t_align"/> + <constant name="final_rx5t" value="mod2_rx5t+rx5t_align"/> + <constant name="final_rx6t" value="mod2_rx6t+rx6t_align"/> + <constant name="final_rx7t" value="mod2_rx7t+rx7t_align"/> + <constant name="final_rx8t" value="mod2_rx8t+rx8t_align"/> + <constant name="final_rx9t" value="mod2_rx9t+rx9t_align"/> + <constant name="final_rx10t" value="mod2_rx10t+rx10t_align"/> + <constant name="final_ry1t" value="mod2_ry1t+ry1t_align"/> + <constant name="final_ry2t" value="mod2_ry2t+ry2t_align"/> + <constant name="final_ry3t" value="mod2_ry3t+ry3t_align"/> + <constant name="final_ry4t" value="mod2_ry4t+ry4t_align"/> + <constant name="final_ry5t" value="mod2_ry5t+ry5t_align"/> + <constant name="final_ry6t" value="mod2_ry6t+ry6t_align"/> + <constant name="final_ry7t" value="mod2_ry7t+ry7t_align"/> + <constant name="final_ry8t" value="mod2_ry8t+ry8t_align"/> + <constant name="final_ry9t" value="mod2_ry9t+ry9t_align"/> + <constant name="final_ry10t" value="mod2_ry10t+ry10t_align"/> + <constant name="final_rz1t" value="mod2_rz1t+rz1t_align"/> + <constant name="final_rz2t" value="mod2_rz2t+rz2t_align"/> + <constant name="final_rz3t" value="mod2_rz3t+rz3t_align"/> + <constant name="final_rz4t" value="mod2_rz4t+rz4t_align"/> + <constant name="final_rz5t" value="mod2_rz5t+rz5t_align"/> + <constant name="final_rz6t" value="mod2_rz6t+rz6t_align"/> + <constant name="final_rz7t" value="mod2_rz7t+rz7t_align"/> + <constant name="final_rz8t" value="mod2_rz8t+rz8t_align"/> + <constant name="final_rz9t" value="mod2_rz9t+rz9t_align"/> + <constant name="final_rz10t" value="mod2_rz10t+rz10t_align"/> + <constant name="final_x1b" value="mod2_x1b+x1b_align"/> + <constant name="final_x2b" value="mod2_x2b+x2b_align"/> + <constant name="final_x3b" value="mod2_x3b+x3b_align"/> + <constant name="final_x4b" value="mod2_x4b+x4b_align"/> + <constant name="final_x5b" value="mod2_x5b+x5b_align"/> + <constant name="final_x6b" value="mod2_x6b+x6b_align"/> + <constant name="final_x7b" value="mod2_x7b+x7b_align"/> + <constant name="final_x8b" value="mod2_x8b+x8b_align"/> + <constant name="final_x9b" value="mod2_x9b+x9b_align"/> + <constant name="final_x10b" value="mod2_x10b+x10b_align"/> + <constant name="final_y1b" value="mod2_y1b+y1b_align"/> + <constant name="final_y2b" value="mod2_y2b+y2b_align"/> + <constant name="final_y3b" value="mod2_y3b+y3b_align"/> + <constant name="final_y4b" value="mod2_y4b+y4b_align"/> + <constant name="final_y5b" value="mod2_y5b+y5b_align"/> + <constant name="final_y6b" value="mod2_y6b+y6b_align"/> + <constant name="final_y7b" value="mod2_y7b+y7b_align"/> + <constant name="final_y8b" value="mod2_y8b+y8b_align"/> + <constant name="final_y9b" value="mod2_y9b+y9b_align"/> + <constant name="final_y10b" value="mod2_y10b+y10b_align"/> + <constant name="final_z1b" value="mod2_z1b+z1b_align"/> + <constant name="final_z2b" value="mod2_z2b+z2b_align"/> + <constant name="final_z3b" value="mod2_z3b+z3b_align"/> + <constant name="final_z4b" value="mod2_z4b+z4b_align"/> + <constant name="final_z5b" value="mod2_z5b+z5b_align"/> + <constant name="final_z6b" value="mod2_z6b+z6b_align"/> + <constant name="final_z7b" value="mod2_z7b+z7b_align"/> + <constant name="final_z8b" value="mod2_z8b+z8b_align"/> + <constant name="final_z9b" value="mod2_z9b+z9b_align"/> + <constant name="final_z10b" value="mod2_z10b+z10b_align"/> + <constant name="final_rx1b" value="mod2_rx1b+rx1b_align"/> + <constant name="final_rx2b" value="mod2_rx2b+rx2b_align"/> + <constant name="final_rx3b" value="mod2_rx3b+rx3b_align"/> + <constant name="final_rx4b" value="mod2_rx4b+rx4b_align"/> + <constant name="final_rx5b" value="mod2_rx5b+rx5b_align"/> + <constant name="final_rx6b" value="mod2_rx6b+rx6b_align"/> + <constant name="final_rx7b" value="mod2_rx7b+rx7b_align"/> + <constant name="final_rx8b" value="mod2_rx8b+rx8b_align"/> + <constant name="final_rx9b" value="mod2_rx9b+rx9b_align"/> + <constant name="final_rx10b" value="mod2_rx10b+rx10b_align"/> + <constant name="final_ry1b" value="mod2_ry1b+ry1b_align"/> + <constant name="final_ry2b" value="mod2_ry2b+ry2b_align"/> + <constant name="final_ry3b" value="mod2_ry3b+ry3b_align"/> + <constant name="final_ry4b" value="mod2_ry4b+ry4b_align"/> + <constant name="final_ry5b" value="mod2_ry5b+ry5b_align"/> + <constant name="final_ry6b" value="mod2_ry6b+ry6b_align"/> + <constant name="final_ry7b" value="mod2_ry7b+ry7b_align"/> + <constant name="final_ry8b" value="mod2_ry8b+ry8b_align"/> + <constant name="final_ry9b" value="mod2_ry9b+ry9b_align"/> + <constant name="final_ry10b" value="mod2_ry10b+ry10b_align"/> + <constant name="final_rz1b" value="mod2_rz1b+rz1b_align"/> + <constant name="final_rz2b" value="mod2_rz2b+rz2b_align"/> + <constant name="final_rz3b" value="mod2_rz3b+rz3b_align"/> + <constant name="final_rz4b" value="mod2_rz4b+rz4b_align"/> + <constant name="final_rz5b" value="mod2_rz5b+rz5b_align"/> + <constant name="final_rz6b" value="mod2_rz6b+rz6b_align"/> + <constant name="final_rz7b" value="mod2_rz7b+rz7b_align"/> + <constant name="final_rz8b" value="mod2_rz8b+rz8b_align"/> + <constant name="final_rz9b" value="mod2_rz9b+rz9b_align"/> + <constant name="final_rz10b" value="mod2_rz10b+rz10b_align"/> + + </define> <materials> - <!-- Set the world material to vacuum. --> + <!-- Set the world material to vacuum. --> <material name="WorldMaterial"> <D type="density" unit="g/cm3" value="0.0000000000000001"/> <fraction n="1.0" ref="Vacuum" /> @@ -800,7 +800,7 @@ </layer> <layer id="2"> <module_placement name="TestRunModuleFieldDef" id="0" x="0" y="0" z="dipoleMagnetPositionZ+dipoleMagnetLength/2" rx="0" ry="0" rz="-PI/2"/> - </layer> + </layer> </detector> <detector id="13" name="Ecal" type="HPSEcal3" insideTrackingVolume="false" readout="EcalHits" vis="ECALVis"> Modified: java/trunk/detector-data/detectors/HPSTestRunTracker2014-v0/compact.xml ============================================================================= --- java/trunk/detector-data/detectors/HPSTestRunTracker2014-v0/compact.xml (original) +++ java/trunk/detector-data/detectors/HPSTestRunTracker2014-v0/compact.xml Wed Mar 9 11:43:24 2016 @@ -7,9 +7,9 @@ </info> <define> - <!-- units --> - <constant name="mm" value="0.1*cm"/> - <constant name="inch" value="25.4*mm"/> + <!-- units --> + <constant name="mm" value="0.1*cm"/> + <constant name="inch" value="25.4*mm"/> <!-- world --> <constant name="world_side" value="500.0*cm" /> @@ -17,48 +17,48 @@ <constant name="world_y" value="world_side" /> <constant name="world_z" value="world_side" /> - <!-- tracking region --> - <constant name="tracking_region_radius" value="200.0*cm"/> + <!-- tracking region --> + <constant name="tracking_region_radius" value="200.0*cm"/> <constant name="tracking_region_min" value="5.0*cm"/> <constant name="tracking_region_zmax" value="131.8*cm"/> <!-- dipole magnet and B-field --> - <constant name="dipoleMagnetPositionZ" value="45.72*cm" /> - <constant name="dipoleMagnetHeight" value="17.78*cm" /> - <constant name="dipoleMagnetWidth" value="41.6052*cm" /> - <constant name="dipoleMagnetLength" value="dipoleMagnetPositionZ*2.0" /> - <constant name="constBFieldY" value="-0.491" /> + <constant name="dipoleMagnetPositionZ" value="45.72*cm" /> + <constant name="dipoleMagnetHeight" value="17.78*cm" /> + <constant name="dipoleMagnetWidth" value="41.6052*cm" /> + <constant name="dipoleMagnetLength" value="dipoleMagnetPositionZ*2.0" /> + <constant name="constBFieldY" value="-0.491" /> - <!-- ECAL --> + <!-- ECAL --> <constant name="ecal_front" value="13.3/2*mm" /> - <constant name="ecal_back" value="16/2*mm" /> - <constant name="ecal_z" value="160/2*mm" /> - <constant name="ecal_dx" value="41.27*mm" /> + <constant name="ecal_back" value="16/2*mm" /> + <constant name="ecal_z" value="160/2*mm" /> + <constant name="ecal_dx" value="41.27*mm" /> </define> <materials> - <!-- Set the world material to vacuum. --> + <!-- Set the world material to vacuum. --> <material name="WorldMaterial"> - <D type="density" unit="g/cm3" value="0.0000000000000001"/> - <fraction n="1.0" ref="Vacuum" /> + <D type="density" unit="g/cm3" value="0.0000000000000001"/> + <fraction n="1.0" ref="Vacuum" /> </material> <!-- Set tracking material to vacuum. --> <material name="TrackingMaterial"> <D type="density" unit="g/cm3" value="0.0000000000000001" /> <fraction n="1.0" ref="Vacuum" /> </material> - <!-- ECal crystal material. --> - <material name="LeadTungstate"> - <D value="8.28" unit="g/cm3" /> - <composite n="1" ref="Pb" /> - <composite n="1" ref="W" /> - <composite n="4" ref="O" /> - </material> + <!-- ECal crystal material. --> + <material name="LeadTungstate"> + <D value="8.28" unit="g/cm3" /> + <composite n="1" ref="Pb" /> + <composite n="1" ref="W" /> + <composite n="4" ref="O" /> + </material> </materials> <display> - + <vis name="SensorVis" alpha="1.0" r="1.0" g="0.0" b="0.0" drawingStyle="wireframe" lineStyle="unbroken" showDaughters="true" visible="true"/> <vis name="ActiveSensorVis" alpha="1.0" r="1.0" g="0.0" b="0.0" drawingStyle="solid" lineStyle="unbroken" showDaughters="true" visible="true"/> <vis name="CarbonFiberVis" alpha="1.0" r="0.88" g="0.88" b="0.88" drawingStyle="solid" lineStyle="unbroken" showDaughters="true" visible="true"/> @@ -72,14 +72,14 @@ <vis name="BasePlateVis" alpha="1.0" r="0.35" g="0.35" b="0.35" drawingStyle="solid" lineStyle="dashed" showDaughters="true" visible="true"/> <vis name="LayerVis" alpha="0.0" r="0.0" g="0.0" b="1.0" drawingStyle="wireframe" showDaughters="true" visible="false"/> <vis name="ComponentVis" alpha="0.0" r="0.0" g="0.2" b="0.4" drawingStyle="solid" showDaughters="false" visible="false"/> - <vis name="BeamPlaneVis" alpha="1.0" r="1.0" g="1.0" b="1.0" drawingStyle="solid" lineStyle="unbroken" showDaughters="false" visible="true"/> + <vis name="BeamPlaneVis" alpha="1.0" r="1.0" g="1.0" b="1.0" drawingStyle="solid" lineStyle="unbroken" showDaughters="false" visible="true"/> <vis name="ECALVis" r="0.8" g="0.5" b="0.1" /> </display> <detectors> <detector id="1" name="Tracker" type="HPSTestRunTracker2014" readout="TrackerHits"> - <millepede_constants> + <millepede_constants> <!-- top translations --> <millepede_constant name="11101" value="0.0"/> <millepede_constant name="11102" value="0.0"/> @@ -234,43 +234,43 @@ </detector> - <detector id="30" name="TrackerFieldDef" type="HPSTracker2" - readout="TrackerHitsThin"> - <comment>The Silicon Vertex Tracker</comment> - <module name="TestRunModuleFieldDef"> - <box x="dipoleMagnetWidth*4+1" y="dipoleMagnetHeight*4+1" /> - <module_component thickness="0.000000001*cm" - material="Vacuum" sensitive="true"> - <dimensions x="dipoleMagnetWidth*4" y="dipoleMagnetHeight*4" /> - </module_component> - </module> - <layer id="1"> - <module_placement name="TestRunModuleFieldDef" id="0" - x="0" y="0" z="dipoleMagnetPositionZ-dipoleMagnetLength/2" rx="0" - ry="0" rz="-PI/2" /> - </layer> - <layer id="2"> - <module_placement name="TestRunModuleFieldDef" id="0" - x="0" y="0" z="dipoleMagnetPositionZ+dipoleMagnetLength/2" rx="0" - ry="0" rz="-PI/2" /> - </layer> - </detector> - - <detector id="13" name="Ecal" type="HPSEcal3" - insideTrackingVolume="false" readout="EcalHits" vis="ECALVis"> - <comment>The crystal ECal</comment> - <material name="LeadTungstate" /> - <dimensions x1="ecal_front" y1="ecal_front" x2="ecal_back" - y2="ecal_back" z="ecal_z" /> - <!-- Measurements as found in installation by Stepan --> - <!-- Moving ecal halves out by 6.5mm from SVT ecal-track matching - Pelle --> - <!-- Moving ecal face to reflect latest survey calculation 2/17/14 - Pelle --> - <layout beamgap="43.5*mm" nx="46" ny="5" dface="147.0*cm"> - <remove ixmin="-10" ixmax="-2" iymin="-1" iymax="1" /> - <top dx="ecal_dx" dy="0." dz="0." /> - <bottom dx="ecal_dx" dy="0." dz="0." /> - </layout> - </detector> + <detector id="30" name="TrackerFieldDef" type="HPSTracker2" + readout="TrackerHitsThin"> + <comment>The Silicon Vertex Tracker</comment> + <module name="TestRunModuleFieldDef"> + <box x="dipoleMagnetWidth*4+1" y="dipoleMagnetHeight*4+1" /> + <module_component thickness="0.000000001*cm" + material="Vacuum" sensitive="true"> + <dimensions x="dipoleMagnetWidth*4" y="dipoleMagnetHeight*4" /> + </module_component> + </module> + <layer id="1"> + <module_placement name="TestRunModuleFieldDef" id="0" + x="0" y="0" z="dipoleMagnetPositionZ-dipoleMagnetLength/2" rx="0" + ry="0" rz="-PI/2" /> + </layer> + <layer id="2"> + <module_placement name="TestRunModuleFieldDef" id="0" + x="0" y="0" z="dipoleMagnetPositionZ+dipoleMagnetLength/2" rx="0" + ry="0" rz="-PI/2" /> + </layer> + </detector> + + <detector id="13" name="Ecal" type="HPSEcal3" + insideTrackingVolume="false" readout="EcalHits" vis="ECALVis"> + <comment>The crystal ECal</comment> + <material name="LeadTungstate" /> + <dimensions x1="ecal_front" y1="ecal_front" x2="ecal_back" + y2="ecal_back" z="ecal_z" /> + <!-- Measurements as found in installation by Stepan --> + <!-- Moving ecal halves out by 6.5mm from SVT ecal-track matching - Pelle --> + <!-- Moving ecal face to reflect latest survey calculation 2/17/14 - Pelle --> + <layout beamgap="43.5*mm" nx="46" ny="5" dface="147.0*cm"> + <remove ixmin="-10" ixmax="-2" iymin="-1" iymax="1" /> + <top dx="ecal_dx" dy="0." dz="0." /> + <bottom dx="ecal_dx" dy="0." dz="0." /> + </layout> + </detector> @@ -279,28 +279,28 @@ <readout name="TrackerHits"> <id>system:6,barrel:3,layer:4,module:12,sensor:1,side:32:-2,strip:12</id> </readout> - <readout name="TrackerHitsThin"> - <id>system:6,barrel:3,layer:4,module:12,sensor:1,side:32:-2,strip:12</id> - </readout> - - <readout name="EcalHits"> - <segmentation type="GridXYZ" gridSizeX="0.0" gridSizeY="0.0" - gridSizeZ="0.0" /> - <id>system:6,layer:2,ix:-8,iy:-6</id> - </readout> + <readout name="TrackerHitsThin"> + <id>system:6,barrel:3,layer:4,module:12,sensor:1,side:32:-2,strip:12</id> + </readout> + + <readout name="EcalHits"> + <segmentation type="GridXYZ" gridSizeX="0.0" gridSizeY="0.0" + gridSizeZ="0.0" /> + <id>system:6,layer:2,ix:-8,iy:-6</id> + </readout> </readouts> - <fields> - <field type="BoxDipole" name="AnalyzingDipole" x="0*cm" y="0*cm" - z="dipoleMagnetPositionZ" dx="dipoleMagnetWidth/2.0" dy="dipoleMagnetHeight/2.0" - dz="dipoleMagnetLength/2.0" bx="0.0" by="constBFieldY" bz="0.0" /> - </fields> + <fields> + <field type="BoxDipole" name="AnalyzingDipole" x="0*cm" y="0*cm" + z="dipoleMagnetPositionZ" dx="dipoleMagnetWidth/2.0" dy="dipoleMagnetHeight/2.0" + dz="dipoleMagnetLength/2.0" bx="0.0" by="constBFieldY" bz="0.0" /> + </fields> <!-- - <includes> - <gdmlFile - ref="http://www.lcsim.org/test/gdml/testRunDownstreamVacuumFlange.gdml" /> - </includes> + <includes> + <gdmlFile + ref="http://www.lcsim.org/test/gdml/testRunDownstreamVacuumFlange.gdml" /> + </includes> --> </lccdd> Modified: java/trunk/detector-model/src/main/java/org/lcsim/detector/converter/compact/HPSTestRunTracker2014Converter.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/detector/converter/compact/HPSTestRunTracker2014Converter.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/detector/converter/compact/HPSTestRunTracker2014Converter.java Wed Mar 9 11:43:24 2016 @@ -21,21 +21,21 @@ */ public class HPSTestRunTracker2014Converter extends HPSTracker2014ConverterBase { - public HPSTestRunTracker2014Converter() { - super(); - } - - /* (non-Javadoc) - * @see org.lcsim.detector.converter.compact.HPSTracker2014ConverterBase#initializeBuilder(org.jdom.Element) - */ - protected HPSTrackerJavaBuilder initializeBuilder(Element node) { - return new HPSTestRunTracker2014JavaBuilder(_debug,node); - } + public HPSTestRunTracker2014Converter() { + super(); + } - /* (non-Javadoc) - * @see org.lcsim.detector.converter.compact.AbstractSubdetectorConverter#getSubdetectorType() - */ - public Class getSubdetectorType() { + /* (non-Javadoc) + * @see org.lcsim.detector.converter.compact.HPSTracker2014ConverterBase#initializeBuilder(org.jdom.Element) + */ + protected HPSTrackerJavaBuilder initializeBuilder(Element node) { + return new HPSTestRunTracker2014JavaBuilder(_debug,node); + } + + /* (non-Javadoc) + * @see org.lcsim.detector.converter.compact.AbstractSubdetectorConverter#getSubdetectorType() + */ + public Class getSubdetectorType() { return HPSTestRunTracker2014.class; } @@ -53,5 +53,5 @@ protected int getModuleNumber(String surveyVolume) { return HPSTrackerBuilder.getHalfFromName(surveyVolume).equals("top") ? 0 : 1; } - + } Modified: java/trunk/detector-model/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014ConverterBase.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014ConverterBase.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014ConverterBase.java Wed Mar 9 11:43:24 2016 @@ -71,7 +71,7 @@ * @see org.lcsim.detector.converter.compact.AbstractSubdetectorConverter#makeIdentifierHelper(org.lcsim.geometry.compact.Subdetector, org.lcsim.detector.DetectorIdentifierHelper.SystemMap) */ public IIdentifierHelper makeIdentifierHelper(Subdetector subdetector, SystemMap systemMap) { - return new SiTrackerIdentifierHelper(subdetector.getDetectorElement(), makeIdentifierDictionary(subdetector), systemMap); + return new SiTrackerIdentifierHelper(subdetector.getDetectorElement(), makeIdentifierDictionary(subdetector), systemMap); } Modified: java/trunk/detector-model/src/main/java/org/lcsim/detector/converter/compact/HPSTrackerConverter.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/detector/converter/compact/HPSTrackerConverter.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/detector/converter/compact/HPSTrackerConverter.java Wed Mar 9 11:43:24 2016 @@ -238,7 +238,7 @@ { //double moduleX = moduleParameters.getDimension(0); //double moduleY = moduleParameters.getDimension(1); - double moduleY = moduleParameters.getDimension(0); + double moduleY = moduleParameters.getDimension(0); double moduleX = moduleParameters.getDimension(1); Box box = (Box)moduleVolume.getSolid(); double moduleZ = box.getZHalfLength() * 2; @@ -375,7 +375,7 @@ /* private void configSensor(SiSensor sensor) { - // + // Box sensorSolid = (Box) sensor.getGeometry().getLogicalVolume().getSolid(); Polygon3D pside = sensorSolid.getFacesNormalTo(new BasicHep3Vector(0, 0, 1)).get(0); Modified: java/trunk/detector-model/src/main/java/org/lcsim/detector/converter/compact/subdetector/HpsTracker2.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/detector/converter/compact/subdetector/HpsTracker2.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/detector/converter/compact/subdetector/HpsTracker2.java Wed Mar 9 11:43:24 2016 @@ -19,89 +19,89 @@ private boolean debug = false; // List of stereo layers composing the SVT - List<SvtStereoLayer> stereoPairs = new ArrayList<SvtStereoLayer>(); - - public HpsTracker2(String name, IDetectorElement parent) { - super(name, parent); - } - - /** - * Get a collection of stereo pairs ({@link SvtStereoLayer}) composing the SVT. - * - * @return List of stereo pairs - */ - public List<SvtStereoLayer> getStereoPairs(){ - return Collections.unmodifiableList(stereoPairs); - } + List<SvtStereoLayer> stereoPairs = new ArrayList<SvtStereoLayer>(); + + public HpsTracker2(String name, IDetectorElement parent) { + super(name, parent); + } + + /** + * Get a collection of stereo pairs ({@link SvtStereoLayer}) composing the SVT. + * + * @return List of stereo pairs + */ + public List<SvtStereoLayer> getStereoPairs(){ + return Collections.unmodifiableList(stereoPairs); + } - /** - * Get the collection of {@link HpsSiSensor} composing the SVT. - * - * @return List of sensors - */ - public List<HpsSiSensor> getSensors(){ - List<HpsSiSensor> list = this.findDescendants(HpsSiSensor.class); - if(debug) { - System.out.printf("%s: found %d HpsSiSensors\n",getClass().getSimpleName(), list.size()); - System.out.printf("%s: %45s %5s %5s\n",getClass().getSimpleName(), "<name>", "<layerID>", "<moduleID>"); - for(HpsSiSensor sensor : list) { - System.out.printf("%s: %45s %5d %5d\n",getClass().getSimpleName(), sensor.getName(), sensor.getLayerNumber(), sensor.getModuleNumber()); - } - } - return list; - } - - /** - * Get a {@link HpsSiSensor} by layer and module number. - * - * @param layer The SVT layer number - * @param module The SVT module number - * @return Corresponding sensor - */ - public HpsSiSensor getSensor(int layer, int module){ - for(HpsSiSensor sensor : this.getSensors()){ - if(sensor.getLayerNumber() == layer && sensor.getModuleNumber() == module) - return sensor; - } - return null; - } - - /** - * Get the maximum layer number present in the collection of {@link HpsSiSensor}. - * - * @return maximum layer number - */ - private int getMaxLayerNumber(){ - int maxLayerNumber = 0; - for(HpsSiSensor sensor : this.getSensors()){ - if(sensor.getLayerNumber() > maxLayerNumber) maxLayerNumber = sensor.getLayerNumber(); - } - return maxLayerNumber; - } + /** + * Get the collection of {@link HpsSiSensor} composing the SVT. + * + * @return List of sensors + */ + public List<HpsSiSensor> getSensors(){ + List<HpsSiSensor> list = this.findDescendants(HpsSiSensor.class); + if(debug) { + System.out.printf("%s: found %d HpsSiSensors\n",getClass().getSimpleName(), list.size()); + System.out.printf("%s: %45s %5s %5s\n",getClass().getSimpleName(), "<name>", "<layerID>", "<moduleID>"); + for(HpsSiSensor sensor : list) { + System.out.printf("%s: %45s %5d %5d\n",getClass().getSimpleName(), sensor.getName(), sensor.getLayerNumber(), sensor.getModuleNumber()); + } + } + return list; + } + + /** + * Get a {@link HpsSiSensor} by layer and module number. + * + * @param layer The SVT layer number + * @param module The SVT module number + * @return Corresponding sensor + */ + public HpsSiSensor getSensor(int layer, int module){ + for(HpsSiSensor sensor : this.getSensors()){ + if(sensor.getLayerNumber() == layer && sensor.getModuleNumber() == module) + return sensor; + } + return null; + } + + /** + * Get the maximum layer number present in the collection of {@link HpsSiSensor}. + * + * @return maximum layer number + */ + private int getMaxLayerNumber(){ + int maxLayerNumber = 0; + for(HpsSiSensor sensor : this.getSensors()){ + if(sensor.getLayerNumber() > maxLayerNumber) maxLayerNumber = sensor.getLayerNumber(); + } + return maxLayerNumber; + } - /** - * Get the maximum module number present in the collection of {@link HpsSiSensor}. - * - * @return maximum module number - */ - private int getMaxModuleNumber(){ - int maxModuleID = 0; - for(HpsSiSensor sensor : this.getSensors()){ - if(sensor.getModuleNumber() > maxModuleID) maxModuleID = sensor.getModuleNumber(); - } - return maxModuleID; - } - - /** - * Method that loops through the collection of {@link HpsSiSensor} and creates - * stereo layers. A stereo layer is composed of two adjacent sensors (stereo and axial) - * with the same module number. - */ - public void createStereoLayers(){ + /** + * Get the maximum module number present in the collection of {@link HpsSiSensor}. + * + * @return maximum module number + */ + private int getMaxModuleNumber(){ + int maxModuleID = 0; + for(HpsSiSensor sensor : this.getSensors()){ + if(sensor.getModuleNumber() > maxModuleID) maxModuleID = sensor.getModuleNumber(); + } + return maxModuleID; + } + + /** + * Method that loops through the collection of {@link HpsSiSensor} and creates + * stereo layers. A stereo layer is composed of two adjacent sensors (stereo and axial) + * with the same module number. + */ + public void createStereoLayers(){ - //System.out.printf("%s: create stereo layers\n",getClass().getSimpleName()); + //System.out.printf("%s: create stereo layers\n",getClass().getSimpleName()); - HpsSiSensor firstSensor = null; + HpsSiSensor firstSensor = null; HpsSiSensor secondSensor = null; //System.out.printf("%s: %10s %10s %42s %42s\n",getClass().getSimpleName(), "layerID/moduleID", "layerID/moduleID", "sensor1", "sensor2"); Modified: java/trunk/detector-model/src/main/java/org/lcsim/detector/converter/compact/subdetector/SvtStereoLayer.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/detector/converter/compact/subdetector/SvtStereoLayer.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/detector/converter/compact/subdetector/SvtStereoLayer.java Wed Mar 9 11:43:24 2016 @@ -9,76 +9,76 @@ */ public class SvtStereoLayer { - - // Layer number to which the stereo pair belongs to - private int stereoLayerNumber = 0; - - // The axial and stereo sensors - private HpsSiSensor axialSensor = null; - private HpsSiSensor stereoSensor = null; - - - /** - * Ctor - * - * @param layerNumber Layer number to which the stereo pair belongs to - * @param firstSensor The first sensor in the stereo layer - * @param secondSensor The second sensor in the stereo layer - */ - public SvtStereoLayer(int stereoLayerNumber, HpsSiSensor firstSensor, HpsSiSensor secondSensor){ - this.stereoLayerNumber = stereoLayerNumber; - if(firstSensor.isAxial()){ - this.axialSensor = firstSensor; - this.stereoSensor = secondSensor; - } else { - this.axialSensor = secondSensor; - this.stereoSensor = firstSensor; - } - } - - - /** - * Get the axial sensor of the stereo pair - * - * @return Axial sensor. Returns null if it hasn't been set yet. - */ - public HpsSiSensor getAxialSensor(){ - return axialSensor; - } - - /** - * Get the stereo sensor of the stereo pair - * - * @return Stereo sensor. Returns null if it hasn't been set yet. - */ - public HpsSiSensor getStereoSensor(){ - return stereoSensor; - } + + // Layer number to which the stereo pair belongs to + private int stereoLayerNumber = 0; + + // The axial and stereo sensors + private HpsSiSensor axialSensor = null; + private HpsSiSensor stereoSensor = null; + + + /** + * Ctor + * + * @param layerNumber Layer number to which the stereo pair belongs to + * @param firstSensor The first sensor in the stereo layer + * @param secondSensor The second sensor in the stereo layer + */ + public SvtStereoLayer(int stereoLayerNumber, HpsSiSensor firstSensor, HpsSiSensor secondSensor){ + this.stereoLayerNumber = stereoLayerNumber; + if(firstSensor.isAxial()){ + this.axialSensor = firstSensor; + this.stereoSensor = secondSensor; + } else { + this.axialSensor = secondSensor; + this.stereoSensor = firstSensor; + } + } + + + /** + * Get the axial sensor of the stereo pair + * + * @return Axial sensor. Returns null if it hasn't been set yet. + */ + public HpsSiSensor getAxialSensor(){ + return axialSensor; + } + + /** + * Get the stereo sensor of the stereo pair + * + * @return Stereo sensor. Returns null if it hasn't been set yet. + */ + public HpsSiSensor getStereoSensor(){ + return stereoSensor; + } - /** - * Get the layer number to which the stereo pair belongs to. - * - * @return stereo layer number - */ - public int getLayerNumber(){ - return stereoLayerNumber; - } - - /** - * Return a string describing the stereo pair - * - * @return stereo pair description - */ - @Override - public String toString(){ - StringBuffer buffer = new StringBuffer(); - buffer.append("[ Stereo Pair ]: Layer number: " + this.getLayerNumber() + "\n"); - buffer.append("\t\tAxial Sensor: "); - buffer.append(axialSensor == null ? "None" : axialSensor.getName()); - buffer.append("\tStereo Sensor: "); - buffer.append(stereoSensor == null ? "None" : stereoSensor.getName()); - return buffer.toString(); - } + /** + * Get the layer number to which the stereo pair belongs to. + * + * @return stereo layer number + */ + public int getLayerNumber(){ + return stereoLayerNumber; + } + + /** + * Return a string describing the stereo pair + * + * @return stereo pair description + */ + @Override + public String toString(){ + StringBuffer buffer = new StringBuffer(); + buffer.append("[ Stereo Pair ]: Layer number: " + this.getLayerNumber() + "\n"); + buffer.append("\t\tAxial Sensor: "); + buffer.append(axialSensor == null ? "None" : axialSensor.getName()); + buffer.append("\tStereo Sensor: "); + buffer.append(stereoSensor == null ? "None" : stereoSensor.getName()); + return buffer.toString(); + } } Modified: java/trunk/detector-model/src/main/java/org/lcsim/detector/tracker/silicon/HpsTestRunSiSensor.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/detector/tracker/silicon/HpsTestRunSiSensor.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/detector/tracker/silicon/HpsTestRunSiSensor.java Wed Mar 9 11:43:24 2016 @@ -14,85 +14,85 @@ * @author Omar Moreno <[log in to unmask]> */ public class HpsTestRunSiSensor extends HpsSiSensor { - - - protected int fpgaID; - protected int hybridID; - - - /** - * This class constructor matches the signature of <code>SiSensor</code>. - * @param sensorid The sensor ID. - * @param name The name of the sensor. - * @param parent The parent DetectorElement. - * @param support The physical support path. - * @param id The identifier of the sensor. - */ - public HpsTestRunSiSensor( + + + protected int fpgaID; + protected int hybridID; + + + /** + * This class constructor matches the signature of <code>SiSensor</code>. + * @param sensorid The sensor ID. + * @param name The name of the sensor. + * @param parent The parent DetectorElement. + * @param support The physical support path. + * @param id The identifier of the sensor. + */ + public HpsTestRunSiSensor( int sensorid, String name, IDetectorElement parent, String support, IIdentifier id) { - super(sensorid, name, parent, support, id); + super(sensorid, name, parent, support, id); } - - + + - /** - * Get the FPGA ID associated with this sensor. - * - * @return The FPGA ID - */ - public int getFpgaID() { - return fpgaID; - } + /** + * Get the FPGA ID associated with this sensor. + * + * @return The FPGA ID + */ + public int getFpgaID() { + return fpgaID; + } - /** - * Get the hybrid ID associated with this sensor. - * - * @return The hybrid ID - */ - public int getHybridID() { - return hybridID; - } + /** + * Get the hybrid ID associated with this sensor. + * + * @return The hybrid ID + */ + public int getHybridID() { + return hybridID; + } - @Override - public int getFebID(){ - throw new RuntimeException("This method is not supported for the HpsTestRunSiSensor."); - } - - @Override - public int getFebHybridID(){ - throw new RuntimeException("This method is not supported for the HpsTestRunSiSensor."); - } + @Override + public int getFebID(){ + throw new RuntimeException("This method is not supported for the HpsTestRunSiSensor."); + } + + @Override + public int getFebHybridID(){ + throw new RuntimeException("This method is not supported for the HpsTestRunSiSensor."); + } - /** - * Set the FPGA ID associated with this sensor. - * - * @param The FPGA ID - */ - public void setFpgaID(int fpgaID) { - this.fpgaID = fpgaID; - } + /** + * Set the FPGA ID associated with this sensor. + * + * @param The FPGA ID + */ + public void setFpgaID(int fpgaID) { + this.fpgaID = fpgaID; + } - /** - * Set the hybrid ID associated with this sensor. - * - * @param The hybrid ID. - */ - public void setHybridID(int hybridID) { - this.hybridID = hybridID; - } - - @Override - public void setFebID(int febID) { - throw new RuntimeException("This method is not supported for the HpsTestRunSiSensor."); - } - - @Override - public void setFebHybridID(int febHybridID) { - throw new RuntimeException("This method is not supported for the HpsTestRunSiSensor."); - } + /** + * Set the hybrid ID associated with this sensor. + * + * @param The hybrid ID. + */ + public void setHybridID(int hybridID) { + this.hybridID = hybridID; + } + + @Override + public void setFebID(int febID) { + throw new RuntimeException("This method is not supported for the HpsTestRunSiSensor."); + } + + @Override + public void setFebHybridID(int febHybridID) { + throw new RuntimeException("This method is not supported for the HpsTestRunSiSensor."); + } } Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014GeometryDefinition.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014GeometryDefinition.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014GeometryDefinition.java Wed Mar 9 11:43:24 2016 @@ -29,7 +29,7 @@ protected static final boolean use30mradRotation = true; protected static final boolean useFakeHalfModuleAxialPos = false; - // Global position references + // Global position references protected static final double target_pos_wrt_base_plate_x = 162.3; //from Marco's 3D model protected static final double target_pos_wrt_base_plate_y = 80.55; //from Tim's sketchup //68.75; //from Marco's 3D model protected static final double target_pos_wrt_base_plate_z = 926.59; //from Marco's 3D model @@ -208,7 +208,7 @@ protected void setPos() { final double ball_pos_base_x = -1.0*target_pos_wrt_base_plate_x; final double ball_pos_base_y = -1.0*target_pos_wrt_base_plate_y; - final double ball_pos_base_z = target_pos_wrt_base_plate_z; + final double ball_pos_base_z = target_pos_wrt_base_plate_z; final double vee_pos_base_x = ball_pos_base_x + BasePlate.base_plate_width; final double vee_pos_base_y = ball_pos_base_y; final double vee_pos_base_z = ball_pos_base_z; @@ -230,7 +230,7 @@ public static class BasePlate extends SurveyVolume { - // Base plate references + // Base plate references public static final double base_plate_thickness = 0.25*inch; public static final double base_plate_width = 385.00; public static final double base_plate_length = 1216.00; @@ -281,7 +281,7 @@ public CSupport(String name, SurveyVolume mother) { super(name,mother, null); init(); - } + } private void calcAndSetFlatPos() { if(use30mradRotation) { // find the rotation to place the flat point @@ -462,7 +462,7 @@ // this is referenced to the pin position of the c-support private static final double ball_pos_csup_bearings_bottom_x = 240.0 - 265.0 + 14.0; private static final double ball_pos_csup_bearings_bottom_y = (-6.0 + 22.0); - private static final double ball_pos_csup_bearings_bottom_z = 14.7; + private static final double ball_pos_csup_bearings_bottom_z = 14.7; private static final double vee_pos_csup_bearings_bottom_x = 240.0- 129.0; private static final double vee_pos_csup_bearings_bottom_y = (-6.0 + 22.0); private static final double vee_pos_csup_bearings_bottom_z = 14.7; @@ -499,12 +499,12 @@ // make vectors setBallPos(ball_pos_csup_bearings_bottom_x,ball_pos_csup_bearings_bottom_y,ball_pos_csup_bearings_bottom_z); - setVeePos(vee_pos_csup_bearings_bottom_x,vee_pos_csup_bearings_bottom_y,vee_pos_csup_bearings_bottom_z); + setVeePos(vee_pos_csup_bearings_bottom_x,vee_pos_csup_bearings_bottom_y,vee_pos_csup_bearings_bottom_z); setFlatPos(flat_pos_csup_bearings_bottom_x,flat_pos_csup_bearings_bottom_y,flat_pos_csup_bearings_bottom_z); // create the coordinate system of the c-support bearings - //HPSTestRunTracker2014GeomDef.Coord csup_bearings_bottom_coord = new HPSTestRunTracker2014GeomDef.Coord(ball_pos_csup_bearings_bottom, vee_pos_csup_bearings_bottom, flat_pos_csup_bearings_bottom); + //HPSTestRunTracker2014GeomDef.Coord csup_bearings_bottom_coord = new HPSTestRunTracker2014GeomDef.Coord(ball_pos_csup_bearings_bottom, vee_pos_csup_bearings_bottom, flat_pos_csup_bearings_bottom); // since we don't care (no volume is built) about the local position of the bearings in the pin coord system we'll get rid of it // and find the bearings position in the base coordinate system directly @@ -579,11 +579,11 @@ public SupportPlateBottom(String name, SurveyVolume mother, SurveyVolume referenceGeom, String material) { super(mother, referenceGeom, name, material); - init(); + init(); } public SupportPlateBottom(String name, SurveyVolume mother, List<SurveyVolume> referenceGeom, String material) { super(mother, referenceGeom, name, material); - init(); + init(); } protected void setPos() { if(debug) System.out.printf("%s: setPos for %s\n",this.getClass().getSimpleName(),getName()); @@ -755,11 +755,11 @@ public TestRunModule(String name, SurveyVolume mother, int layer, String half) { super(name, mother,null,layer, half); init(); - } + } public TestRunModule(String name, SurveyVolume mother, SurveyVolume ref, int layer, String half) { super(name, mother,null,ref,layer, half); init(); - } + } protected abstract double getColdBlockThickness(); protected abstract double getModuleBoxLength(); protected abstract double getModuleBoxWidth(); @@ -771,7 +771,7 @@ } protected void setCenter() { setCenter(getModuleBoxLength()/2.0-5.0, 0.0, getModuleBoxWidth()/2.0-box_extra_width/5.0); - } + } protected void setPos() { if(debug) System.out.printf("%s: setPos for %s\n",this.getClass().getSimpleName(),getName()); @@ -787,7 +787,7 @@ case 2: ballPos = new BasicHep3Vector(25.0, 561.1, SupportPlateBottom.pedestal_height_L2-SupportPlateBottom.support_plate_pocket_depth); veePos = new BasicHep3Vector(95.0, 561.1, SupportPlateBottom.pedestal_height_L2-SupportPlateBottom.support_plate_pocket_depth); - flatPos = new BasicHep3Vector(60.0, 567.10, SupportPlateBottom.pedestal_height_L2-SupportPlateBottom.support_plate_pocket_depth); + flatPos = new BasicHep3Vector(60.0, 567.10, SupportPlateBottom.pedestal_height_L2-SupportPlateBottom.support_plate_pocket_depth); break; case 3: ballPos = new BasicHep3Vector(25.0, 461.1, SupportPlateBottom.pedestal_height_L3-SupportPlateBottom.support_plate_pocket_depth); @@ -938,7 +938,7 @@ // Distance from CF edge to screw hole: 30mm // Distance from screw hole to edge of cold block: 33.75mm // Distance from edge of cold block to hole/ball position: 5mm - protected static final double dist_sensor_center_to_coldblock_hole_vdir = (180.0 - 30.0 + (33.75 - 5.0)) - Sensor.length/2.0; + protected static final double dist_sensor_center_to_coldblock_hole_vdir = (180.0 - 30.0 + (33.75 - 5.0)) - Sensor.length/2.0; protected static final double half_module_thickness = TestRunHalfModule.getHybridThickness() + TestRunHalfModule.getCFThickness() + HalfModuleLamination.thickness; protected static final double half_module_length = TestRunHalfModule.getCFLength(); protected static final double half_module_width = 6.83 + Sensor.width; @@ -1038,7 +1038,7 @@ if(useFakeHalfModuleAxialPos) { ball_pos_halfmod_local_x = ball_pos_halfmod_local_x*2.0; ball_pos_halfmod_local_y = -2.0*ball_pos_halfmod_local_y; - } + } final double ball_pos_halfmod_local_z = dist_lower_sensor_edge_to_cold_block_mounting_surface + Sensor.width/2.0; @@ -1118,7 +1118,7 @@ // final double vee_pos_halfmod_local_z = ball_pos_halfmod_local_z; // final double flat_pos_halfmod_local_x = ball_pos_halfmod_local_x; // final double flat_pos_halfmod_local_y = ball_pos_halfmod_local_y + Sensor.getSensorThickness()/2.0; -// final double flat_pos_halfmod_local_z = ball_pos_halfmod_local_z; +// final double flat_pos_halfmod_local_z = ball_pos_halfmod_local_z; // ballPos = new BasicHep3Vector(ball_pos_halfmod_local_x, ball_pos_halfmod_local_y, ball_pos_halfmod_local_z); // veePos = new BasicHep3Vector(vee_pos_halfmod_local_x, vee_pos_halfmod_local_y,vee_pos_halfmod_local_z); // flatPos = new BasicHep3Vector(flat_pos_halfmod_local_x, flat_pos_halfmod_local_y,flat_pos_halfmod_local_z); @@ -1235,7 +1235,7 @@ } - public static abstract class TestRunColdBlock extends SurveyVolume { + public static abstract class TestRunColdBlock extends SurveyVolume { private int layer; public TestRunColdBlock(String name, SurveyVolume mother, int layer) { super(name, mother, null); @@ -1284,7 +1284,7 @@ } } - public static class TestRunColdBlockL13 extends TestRunColdBlock { + public static class TestRunColdBlockL13 extends TestRunColdBlock { protected static final double coldblock_L13_length = 82.00; protected static final double coldblock_L13_width = 52.50; protected static final double coldblock_L13_thickness = 6.00; @@ -1306,7 +1306,7 @@ } } - public static class TestRunColdBlockL45 extends TestRunColdBlock { + public static class TestRunColdBlockL45 extends TestRunColdBlock { protected static final double coldblock_L45_length = 82.00; protected static final double coldblock_L45_width = 51.00; protected static final double coldblock_L45_thickness = 6.00; @@ -1358,7 +1358,7 @@ // if(useSiStripsConvention) { // setBallPos(0,0,0); // setVeePos(ballPos.x(), ballPos.y(), ballPos.z() + getSensorWidth()/2.0); -// setFlatPos(ballPos.x() + getSensorLength()/2.0,ballPos.y(), ballPos.z()); +// setFlatPos(ballPos.x() + getSensorLength()/2.0,ballPos.y(), ballPos.z()); // } else { // setBallPos(0,0,0); // setVeePos(ballPos.x() + getSensorLength()/2.0, ballPos.y(), ballPos.z()); @@ -1392,7 +1392,7 @@ } protected double getLength() { return length; - } + } } /** Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014JavaBuilder.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014JavaBuilder.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014JavaBuilder.java Wed Mar 9 11:43:24 2016 @@ -28,175 +28,175 @@ */ public class HPSTestRunTracker2014JavaBuilder extends HPSTrackerJavaBuilder { - - - /** - * Default constructor - * @param node - */ - public HPSTestRunTracker2014JavaBuilder(boolean debugFlag, Element node) { - super(debugFlag, node); - } - - - - /** - * Build the JAVA geometry objects from the geometry definition. - * @param trackingVolume - the reference volume. - */ - public void build(ILogicalVolume trackingVolume) { - - // build geometry + + + /** + * Default constructor + * @param node + */ + public HPSTestRunTracker2014JavaBuilder(boolean debugFlag, Element node) { + super(debugFlag, node); + } + + + + /** + * Build the JAVA geometry objects from the geometry definition. + * @param trackingVolume - the reference volume. + */ + public void build(ILogicalVolume trackingVolume) { + + // build geometry setBuilder(createGeometryDefinition(_debug, node)); - - if(_builder==null) throw new RuntimeException("need to set builder class before calling build!"); - - if(isDebug()) System.out.printf("%s: build the base geometry objects\n", getClass().getSimpleName()); - - _builder.build(); - - if(isDebug()) System.out.printf("%s: DONE build the base geometry objects\n", getClass().getSimpleName()); - - if(isDebug()) System.out.printf("%s: build the JAVA geometry objects\n", getClass().getSimpleName()); - - // initialize the list to store a reference to each object - javaSurveyVolumes = new ArrayList<JavaSurveyVolume>(); - - // Go through the list of volumes to build that is created in the generic builder class - JavaSurveyVolume trackingGeometry = new JavaSurveyVolume(_builder.getSurveyVolume(org.lcsim.geometry.compact.converter.HPSTrackerGeometryDefinition.TrackingVolume.class), trackingVolume); - add(trackingGeometry); - //setBaseTrackerGeometry(new GhostJavaBaseGeom(_builder.getBaseGeometry(Base.class), trackingGeometry)); + + if(_builder==null) throw new RuntimeException("need to set builder class before calling build!"); + + if(isDebug()) System.out.printf("%s: build the base geometry objects\n", getClass().getSimpleName()); + + _builder.build(); + + if(isDebug()) System.out.printf("%s: DONE build the base geometry objects\n", getClass().getSimpleName()); + + if(isDebug()) System.out.printf("%s: build the JAVA geometry objects\n", getClass().getSimpleName()); + + // initialize the list to store a reference to each object + javaSurveyVolumes = new ArrayList<JavaSurveyVolume>(); + + // Go through the list of volumes to build that is created in the generic builder class + JavaSurveyVolume trackingGeometry = new JavaSurveyVolume(_builder.getSurveyVolume(org.lcsim.geometry.compact.converter.HPSTrackerGeometryDefinition.TrackingVolume.class), trackingVolume); + add(trackingGeometry); + //setBaseTrackerGeometry(new GhostJavaBaseGeom(_builder.getBaseGeometry(Base.class), trackingGeometry)); setBaseTrackerGeometry(new JavaSurveyVolume(_builder.getSurveyVolume(TrackerEnvelope.class), trackingGeometry,1)); add(getBaseTrackerGeometry()); - JavaSurveyVolume basePlateGeometry = new JavaGhostSurveyVolume(_builder.getSurveyVolume(BasePlate.class), getBaseTrackerGeometry()); - add(basePlateGeometry); - // skip the c-support, this is purely a reference volume in the builder so should have no use here!? - //JavaBaseGeometry cSupportGeometry = new GhostJavaBaseGeom(_builder.getBaseGeometry(CSupport.class), baseTrackerGeometry); - //add(cSupportGeometry); - JavaSurveyVolume supportBottomGeometry = new JavaGhostSurveyVolume(_builder.getSurveyVolume(SupportBottom.class), getBaseTrackerGeometry()); - add(supportBottomGeometry); - JavaSurveyVolume supportPlateBottomGeometry = new JavaGhostSurveyVolume(_builder.getSurveyVolume(SupportPlateBottom.class), getBaseTrackerGeometry()); - add(supportPlateBottomGeometry); - JavaSurveyVolume supportTopGeometry = new JavaGhostSurveyVolume(_builder.getSurveyVolume(SupportTop.class), getBaseTrackerGeometry()); - add(supportTopGeometry); - JavaSurveyVolume supportPlateTopGeometry = new JavaGhostSurveyVolume(_builder.getSurveyVolume(SupportPlateTop.class), getBaseTrackerGeometry()); - add(supportPlateTopGeometry); - - // build modules - - if(isDebug()) System.out.printf("%s: build JAVA modules\n", getClass().getSimpleName()); - - // Loop over all modules created - for(BaseModuleBundle mod : _builder.modules) { - TestRunModuleBundle m = (TestRunModuleBundle) mod; - if(isDebug()) { - System.out.printf("%s: build module %s (layer %d half %s)\n", getClass().getSimpleName(),m.module.getName(),m.getLayer(),m.getHalf()); - m.print(); - } - - // Find the mother among the objects using its name, should probably have a better way... - String name_mother = m.getMother().getName(); - JavaSurveyVolume mother = null; - for(JavaSurveyVolume g : javaSurveyVolumes) { - if(g.getName().equals(name_mother)) { - mother = g; - break; - } - } - // Check that it had a mother - if(mother==null) throw new RuntimeException("Cound't find mother to module " + m.module.getName()); - - if(isDebug()) System.out.printf("%s: found mother %s to module %s\n", getClass().getSimpleName(),mother.getName(),m.module.getName()); - - // put the module in the list of objects that will be added to LCDD - addTestRunModule(m, mother); - - if(isDebug()) System.out.printf("%s: DONE build module %s\n", getClass().getSimpleName(), m.module.getName()); - - - } - - if(isDebug()) System.out.printf("%s: DONE build JAVA modules\n", getClass().getSimpleName()); - - - if(isDebug()) System.out.printf("%s: DONE building the JAVA geometry objects\n", getClass().getSimpleName()); - if(isDebug()) { - System.out.printf("%s: DONE building the JAVA geometry objects\n", getClass().getSimpleName()); - System.out.printf("%s: List of all the JAVA geometry objects built\n", this.getClass().getSimpleName()); - for(JavaSurveyVolume bg : javaSurveyVolumes) { - System.out.printf("-------\n%s\n", bg.toString()); - } - } - - - // Set visualization features - //setVis(); - - - } - - /** - * Rules for adding the JAVA module geometry. - * @param bundle - module to be added - * @param mother - mother JAVA geometry object - */ - protected void addTestRunModule(TestRunModuleBundle bundle, JavaSurveyVolume mother) { - - if(isDebug()) { - System.out.printf("%s: addModule %s containing:\n",this.getClass().getSimpleName(), bundle.module.getName()); - bundle.print(); - } - - // Create the module - JavaSurveyVolume lcddM = new JavaGhostSurveyVolume(bundle.module, mother); - add(lcddM); - - // add half modules - if(bundle.halfModuleAxial!=null) addHalfModule((TestRunHalfModuleBundle)bundle.halfModuleAxial,lcddM); + JavaSurveyVolume basePlateGeometry = new JavaGhostSurveyVolume(_builder.getSurveyVolume(BasePlate.class), getBaseTrackerGeometry()); + add(basePlateGeometry); + // skip the c-support, this is purely a reference volume in the builder so should have no use here!? + //JavaBaseGeometry cSupportGeometry = new GhostJavaBaseGeom(_builder.getBaseGeometry(CSupport.class), baseTrackerGeometry); + //add(cSupportGeometry); + JavaSurveyVolume supportBottomGeometry = new JavaGhostSurveyVolume(_builder.getSurveyVolume(SupportBottom.class), getBaseTrackerGeometry()); + add(supportBottomGeometry); + JavaSurveyVolume supportPlateBottomGeometry = new JavaGhostSurveyVolume(_builder.getSurveyVolume(SupportPlateBottom.class), getBaseTrackerGeometry()); + add(supportPlateBottomGeometry); + JavaSurveyVolume supportTopGeometry = new JavaGhostSurveyVolume(_builder.getSurveyVolume(SupportTop.class), getBaseTrackerGeometry()); + add(supportTopGeometry); + JavaSurveyVolume supportPlateTopGeometry = new JavaGhostSurveyVolume(_builder.getSurveyVolume(SupportPlateTop.class), getBaseTrackerGeometry()); + add(supportPlateTopGeometry); + + // build modules + + if(isDebug()) System.out.printf("%s: build JAVA modules\n", getClass().getSimpleName()); + + // Loop over all modules created + for(BaseModuleBundle mod : _builder.modules) { + TestRunModuleBundle m = (TestRunModuleBundle) mod; + if(isDebug()) { + System.out.printf("%s: build module %s (layer %d half %s)\n", getClass().getSimpleName(),m.module.getName(),m.getLayer(),m.getHalf()); + m.print(); + } + + // Find the mother among the objects using its name, should probably have a better way... + String name_mother = m.getMother().getName(); + JavaSurveyVolume mother = null; + for(JavaSurveyVolume g : javaSurveyVolumes) { + if(g.getName().equals(name_mother)) { + mother = g; + break; + } + } + // Check that it had a mother + if(mother==null) throw new RuntimeException("Cound't find mother to module " + m.module.getName()); + + if(isDebug()) System.out.printf("%s: found mother %s to module %s\n", getClass().getSimpleName(),mother.getName(),m.module.getName()); + + // put the module in the list of objects that will be added to LCDD + addTestRunModule(m, mother); + + if(isDebug()) System.out.printf("%s: DONE build module %s\n", getClass().getSimpleName(), m.module.getName()); + + + } + + if(isDebug()) System.out.printf("%s: DONE build JAVA modules\n", getClass().getSimpleName()); + + + if(isDebug()) System.out.printf("%s: DONE building the JAVA geometry objects\n", getClass().getSimpleName()); + if(isDebug()) { + System.out.printf("%s: DONE building the JAVA geometry objects\n", getClass().getSimpleName()); + System.out.printf("%s: List of all the JAVA geometry objects built\n", this.getClass().getSimpleName()); + for(JavaSurveyVolume bg : javaSurveyVolumes) { + System.out.printf("-------\n%s\n", bg.toString()); + } + } + + + // Set visualization features + //setVis(); + + + } + + /** + * Rules for adding the JAVA module geometry. + * @param bundle - module to be added + * @param mother - mother JAVA geometry object + */ + protected void addTestRunModule(TestRunModuleBundle bundle, JavaSurveyVolume mother) { + + if(isDebug()) { + System.out.printf("%s: addModule %s containing:\n",this.getClass().getSimpleName(), bundle.module.getName()); + bundle.print(); + } + + // Create the module + JavaSurveyVolume lcddM = new JavaGhostSurveyVolume(bundle.module, mother); + add(lcddM); + + // add half modules + if(bundle.halfModuleAxial!=null) addHalfModule((TestRunHalfModuleBundle)bundle.halfModuleAxial,lcddM); if(bundle.halfModuleStereo!=null) addHalfModule((TestRunHalfModuleBundle)bundle.halfModuleStereo,lcddM); - - - if(isDebug()) { - System.out.printf("%s: DONE addModule %s \n",this.getClass().getSimpleName(), bundle.module.getName()); - } - - } - - - /** - * Rules for adding the JAVA half module geometry. - * @param bundle - module to be added - * @param mother - mother JAVA geometry object - */ - private void addHalfModule(TestRunHalfModuleBundle bundle, JavaSurveyVolume mother) { - // Create the half-module - // This is not a ghost element but reflects the module - // concept in the old compact description - // TODO fix the layer IDs - int oldCompactModuleId = 0; - JavaSurveyVolume lcddHM = new JavaSurveyVolume(bundle.halfModule, mother,oldCompactModuleId); - add(lcddHM); - - // ComponentNumber is taken from old geometry where it is simply a counter when adding the xml daughters to the TestRunModule. - // It is simply 0 for sensor and 1 for carbon fiber in the old geometry - int componentNumber = ((Sensor)bundle.sensor).getId(); - - // create the sensor - JavaSurveyVolume lcddS = new JavaSurveyVolume(bundle.sensor, lcddHM, componentNumber); - add(lcddS); - - // create the active sensor - JavaSurveyVolume lcddAS = new JavaSurveyVolume(bundle.activeSensor, lcddS, componentNumber); - add(lcddAS); - -// if(isDebug()) { -// System.out.printf("%s: added sensor %s \n",this.getClass().getSimpleName(), lcddS.getName()); -// System.out.printf("%s: local coordinate system\n%s\n",this.getClass().getSimpleName(), bundle.sensor.getCoord().toString()); -// dsd -// } - - - } + + + if(isDebug()) { + System.out.printf("%s: DONE addModule %s \n",this.getClass().getSimpleName(), bundle.module.getName()); + } + + } + + + /** + * Rules for adding the JAVA half module geometry. + * @param bundle - module to be added + * @param mother - mother JAVA geometry object + */ + private void addHalfModule(TestRunHalfModuleBundle bundle, JavaSurveyVolume mother) { + // Create the half-module + // This is not a ghost element but reflects the module + // concept in the old compact description + // TODO fix the layer IDs + int oldCompactModuleId = 0; + JavaSurveyVolume lcddHM = new JavaSurveyVolume(bundle.halfModule, mother,oldCompactModuleId); + add(lcddHM); + + // ComponentNumber is taken from old geometry where it is simply a counter when adding the xml daughters to the TestRunModule. + // It is simply 0 for sensor and 1 for carbon fiber in the old geometry + int componentNumber = ((Sensor)bundle.sensor).getId(); + + // create the sensor + JavaSurveyVolume lcddS = new JavaSurveyVolume(bundle.sensor, lcddHM, componentNumber); + add(lcddS); + + // create the active sensor + JavaSurveyVolume lcddAS = new JavaSurveyVolume(bundle.activeSensor, lcddS, componentNumber); + add(lcddAS); + +// if(isDebug()) { +// System.out.printf("%s: added sensor %s \n",this.getClass().getSimpleName(), lcddS.getName()); +// System.out.printf("%s: local coordinate system\n%s\n",this.getClass().getSimpleName(), bundle.sensor.getCoord().toString()); +// dsd +// } + + + } @@ -206,8 +206,8 @@ } - - - + + + } Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014LCDDBuilder.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014LCDDBuilder.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014LCDDBuilder.java Wed Mar 9 11:43:24 2016 @@ -26,157 +26,157 @@ public class HPSTestRunTracker2014LCDDBuilder extends HPSTrackerLCDDBuilder { - public HPSTestRunTracker2014LCDDBuilder(boolean debugFlag, Element node, LCDD lcdd, SensitiveDetector sens) { - super(debugFlag, node, lcdd, sens); - } + public HPSTestRunTracker2014LCDDBuilder(boolean debugFlag, Element node, LCDD lcdd, SensitiveDetector sens) { + super(debugFlag, node, lcdd, sens); + } - - public void setBuilder() { - setBuilder(); - } - - public void build(Volume worldVolume) { - - // set and build geometry + + public void setBuilder() { + setBuilder(); + } + + public void build(Volume worldVolume) { + + // set and build geometry setBuilder(createGeometryDefinition(_debug, node)); - if(_builder==null) throw new RuntimeException("need to set builder class before calling build!"); + if(_builder==null) throw new RuntimeException("need to set builder class before calling build!"); - if(isDebug()) System.out.printf("%s: build the base geometry objects\n", getClass().getSimpleName()); + if(isDebug()) System.out.printf("%s: build the base geometry objects\n", getClass().getSimpleName()); - _builder.build(); + _builder.build(); - if(isDebug()) System.out.printf("%s: DONE build the base geometry objects\n", getClass().getSimpleName()); + if(isDebug()) System.out.printf("%s: DONE build the base geometry objects\n", getClass().getSimpleName()); - if(isDebug()) System.out.printf("%s: build the LCDD geometry objects\n", getClass().getSimpleName()); + if(isDebug()) System.out.printf("%s: build the LCDD geometry objects\n", getClass().getSimpleName()); - - // Go through the list of volumes to build that is created in the generic builder class - // TODO this is manual now since I don't have a way of knowing in the generic builder class what is a ghost volume at this point. - LCDDSurveyVolume trackingGeometry = new LCDDSurveyVolume(_builder.getSurveyVolume(org.lcsim.geometry.compact.converter.HPSTrackerGeometryDefinition.TrackingVolume.class), worldVolume); - add(trackingGeometry); - baseSurveyVolume = new LCDDSurveyVolume(_builder.getSurveyVolume(TrackerEnvelope.class), lcdd, trackingGeometry); - add(baseSurveyVolume); - LCDDSurveyVolume basePlateGeometry = new LCDDSurveyVolume(_builder.getSurveyVolume(BasePlate.class), lcdd, baseSurveyVolume); - add(basePlateGeometry); - // TODO I don't think this c-support has any use at all since the coordinates of it has been already used in the builder. Should remove? - LCDDSurveyVolume cSupportGeometry = new LCDDGhostSurveyVolume(_builder.getSurveyVolume(CSupport.class), baseSurveyVolume); - add(cSupportGeometry); - LCDDSurveyVolume supportBottomGeometry = new LCDDGhostSurveyVolume(_builder.getSurveyVolume(SupportBottom.class), baseSurveyVolume); - add(supportBottomGeometry); - LCDDSurveyVolume supportPlateBottomGeometry = new LCDDSurveyVolume(_builder.getSurveyVolume(SupportPlateBottom.class), lcdd, baseSurveyVolume); - add(supportPlateBottomGeometry); - LCDDSurveyVolume supportTopGeometry = new LCDDGhostSurveyVolume(_builder.getSurveyVolume(SupportTop.class), baseSurveyVolume); - add(supportTopGeometry); - LCDDSurveyVolume supportPlateTopGeometry = new LCDDSurveyVolume(_builder.getSurveyVolume(SupportPlateTop.class), lcdd, baseSurveyVolume); - add(supportPlateTopGeometry); + + // Go through the list of volumes to build that is created in the generic builder class + // TODO this is manual now since I don't have a way of knowing in the generic builder class what is a ghost volume at this point. + LCDDSurveyVolume trackingGeometry = new LCDDSurveyVolume(_builder.getSurveyVolume(org.lcsim.geometry.compact.converter.HPSTrackerGeometryDefinition.TrackingVolume.class), worldVolume); + add(trackingGeometry); + baseSurveyVolume = new LCDDSurveyVolume(_builder.getSurveyVolume(TrackerEnvelope.class), lcdd, trackingGeometry); + add(baseSurveyVolume); + LCDDSurveyVolume basePlateGeometry = new LCDDSurveyVolume(_builder.getSurveyVolume(BasePlate.class), lcdd, baseSurveyVolume); + add(basePlateGeometry); + // TODO I don't think this c-support has any use at all since the coordinates of it has been already used in the builder. Should remove? + LCDDSurveyVolume cSupportGeometry = new LCDDGhostSurveyVolume(_builder.getSurveyVolume(CSupport.class), baseSurveyVolume); + add(cSupportGeometry); + LCDDSurveyVolume supportBottomGeometry = new LCDDGhostSurveyVolume(_builder.getSurveyVolume(SupportBottom.class), baseSurveyVolume); + add(supportBottomGeometry); + LCDDSurveyVolume supportPlateBottomGeometry = new LCDDSurveyVolume(_builder.getSurveyVolume(SupportPlateBottom.class), lcdd, baseSurveyVolume); + add(supportPlateBottomGeometry); + LCDDSurveyVolume supportTopGeometry = new LCDDGhostSurveyVolume(_builder.getSurveyVolume(SupportTop.class), baseSurveyVolume); + add(supportTopGeometry); + LCDDSurveyVolume supportPlateTopGeometry = new LCDDSurveyVolume(_builder.getSurveyVolume(SupportPlateTop.class), lcdd, baseSurveyVolume); + add(supportPlateTopGeometry); - // build modules + // build modules - if(isDebug()) System.out.printf("%s: build modules\n", getClass().getSimpleName()); + if(isDebug()) System.out.printf("%s: build modules\n", getClass().getSimpleName()); - // Loop over all modules created - for(BaseModuleBundle mod : _builder.modules) { - TestRunModuleBundle m = (TestRunModuleBundle) mod; - if(isDebug()) { - System.out.printf("%s: module layer %d half %s\n", getClass().getSimpleName(),m.getLayer(),m.getHalf()); - m.print(); - } + // Loop over all modules created + for(BaseModuleBundle mod : _builder.modules) { + TestRunModuleBundle m = (TestRunModuleBundle) mod; + if(isDebug()) { + System.out.printf("%s: module layer %d half %s\n", getClass().getSimpleName(),m.getLayer(),m.getHalf()); + m.print(); + } - // Find the mother among the LCDD objects using its name, should probably have a better way... - String name_mother = m.getMother().getName(); - LCDDSurveyVolume mother = null; - for(LCDDSurveyVolume g : lcddSurveyVolumes) { - if(g.getName().equals(name_mother)) { - mother = g; - break; - } - } - // Check that it had a mother - if(mother==null) throw new RuntimeException("Cound't find mother to module layer " + m.getLayer() + " half "+ m.getHalf()); + // Find the mother among the LCDD objects using its name, should probably have a better way... + String name_mother = m.getMother().getName(); + LCDDSurveyVolume mother = null; + for(LCDDSurveyVolume g : lcddSurveyVolumes) { + if(g.getName().equals(name_mother)) { + mother = g; + break; + } + } + // Check that it had a mother + if(mother==null) throw new RuntimeException("Cound't find mother to module layer " + m.getLayer() + " half "+ m.getHalf()); - if(isDebug()) System.out.printf("%s: found mother %s for module layer %d half %s\n", getClass().getSimpleName(),mother.getName(),m.getLayer(),m.getHalf()); + if(isDebug()) System.out.printf("%s: found mother %s for module layer %d half %s\n", getClass().getSimpleName(),mother.getName(),m.getLayer(),m.getHalf()); - // add the module to the list of objects that will be added to LCDD - addTestRunModule(m, mother); + // add the module to the list of objects that will be added to LCDD + addTestRunModule(m, mother); - } + } - if(isDebug()) { - System.out.printf("%s: DONE building the LCDD geometry objects\n", getClass().getSimpleName()); - System.out.printf("%s: List of all %d LCDD geometry objects built\n", this.getClass().getSimpleName(), lcddSurveyVolumes.size()); - for(SurveyVolumeImpl bg : lcddSurveyVolumes) { - System.out.printf("-------\n%s\n", bg.toString()); - } - } + if(isDebug()) { + System.out.printf("%s: DONE building the LCDD geometry objects\n", getClass().getSimpleName()); + System.out.printf("%s: List of all %d LCDD geometry objects built\n", this.getClass().getSimpleName(), lcddSurveyVolumes.size()); + for(SurveyVolumeImpl bg : lcddSurveyVolumes) { + System.out.printf("-------\n%s\n", bg.toString()); + } + } - // Set visualization features - setVisualization(); + // Set visualization features + setVisualization(); - } + } - /** - * Rules for adding the LCDD module geometry. - * @param bundle - module to be added - * @param mother - mother LCDD geometry object - */ - protected void addTestRunModule(TestRunModuleBundle bundle, LCDDSurveyVolume mother) { - // This could perhaps be fixed if there is a relation with daughters in geometry definition? - // create the module - LCDDSurveyVolume lcddM = new LCDDSurveyVolume(bundle.module, lcdd, mother); - add(lcddM); - if(bundle.halfModuleAxial!=null) addTestRunHalfModule(bundle.halfModuleAxial,lcddM); - if(bundle.coldBlock!=null) add(new LCDDSurveyVolume(bundle.coldBlock, lcdd, lcddM)); - if(bundle.halfModuleStereo!=null) addTestRunHalfModule((TestRunHalfModuleBundle)bundle.halfModuleStereo,lcddM); + /** + * Rules for adding the LCDD module geometry. + * @param bundle - module to be added + * @param mother - mother LCDD geometry object + */ + protected void addTestRunModule(TestRunModuleBundle bundle, LCDDSurveyVolume mother) { + // This could perhaps be fixed if there is a relation with daughters in geometry definition? + // create the module + LCDDSurveyVolume lcddM = new LCDDSurveyVolume(bundle.module, lcdd, mother); + add(lcddM); + if(bundle.halfModuleAxial!=null) addTestRunHalfModule(bundle.halfModuleAxial,lcddM); + if(bundle.coldBlock!=null) add(new LCDDSurveyVolume(bundle.coldBlock, lcdd, lcddM)); + if(bundle.halfModuleStereo!=null) addTestRunHalfModule((TestRunHalfModuleBundle)bundle.halfModuleStereo,lcddM); // if(bundle.halfModuleAxial!=null) addHalfModule((TestRunHalfModuleBundle)bundle.halfModuleAxial,lcddM); // if(bundle.coldBlock!=null) add(new LCDDSurveyVolume(bundle.coldBlock, lcdd, lcddM)); // if(bundle.halfModuleStereo!=null) addHalfModule((TestRunHalfModuleBundle)bundle.halfModuleStereo,lcddM); - } + } - /** - * Rules for adding the LCDD half module geometry. - * @param bundle - module to be added - * @param mother - mother LCDD geometry object - */ - protected void addTestRunHalfModule(HalfModuleBundle bundle2, LCDDSurveyVolume mother) { - // This could perhaps be fixed if there is a relation with daughters in geometry definition? - TestRunHalfModuleBundle bundle = (TestRunHalfModuleBundle) bundle2; - - // create the half-module - LCDDSurveyVolume lcddHM = new LCDDSurveyVolume(bundle.halfModule, lcdd, mother); - add(lcddHM); - // create the sensor - LCDDSurveyVolume lcddS = new LCDDSurveyVolume(bundle.sensor, lcdd, lcddHM); - add(lcddS); - // create the active sensor - LCDDSurveyVolume lcddAS = new LCDDSurveyVolume(bundle.activeSensor, lcdd, lcddS); - add(lcddAS); - // create the lamination - LCDDSurveyVolume lcddL = new LCDDSurveyVolume(bundle.lamination, lcdd, lcddHM); - add(lcddL); - // create the carbon fiber frame - LCDDSurveyVolume lcddCF = new LCDDSurveyVolume(bundle.carbonFiber, lcdd, lcddHM); - add(lcddCF); - // create the hybrid frame - LCDDSurveyVolume lcddH = new LCDDSurveyVolume(bundle.hybrid, lcdd, lcddHM); - add(lcddH); + /** + * Rules for adding the LCDD half module geometry. + * @param bundle - module to be added + * @param mother - mother LCDD geometry object + */ + protected void addTestRunHalfModule(HalfModuleBundle bundle2, LCDDSurveyVolume mother) { + // This could perhaps be fixed if there is a relation with daughters in geometry definition? + TestRunHalfModuleBundle bundle = (TestRunHalfModuleBundle) bundle2; + + // create the half-module + LCDDSurveyVolume lcddHM = new LCDDSurveyVolume(bundle.halfModule, lcdd, mother); + add(lcddHM); + // create the sensor + LCDDSurveyVolume lcddS = new LCDDSurveyVolume(bundle.sensor, lcdd, lcddHM); + add(lcddS); + // create the active sensor + LCDDSurveyVolume lcddAS = new LCDDSurveyVolume(bundle.activeSensor, lcdd, lcddS); + add(lcddAS); + // create the lamination + LCDDSurveyVolume lcddL = new LCDDSurveyVolume(bundle.lamination, lcdd, lcddHM); + add(lcddL); + // create the carbon fiber frame + LCDDSurveyVolume lcddCF = new LCDDSurveyVolume(bundle.carbonFiber, lcdd, lcddHM); + add(lcddCF); + // create the hybrid frame + LCDDSurveyVolume lcddH = new LCDDSurveyVolume(bundle.hybrid, lcdd, lcddHM); + add(lcddH); - } + } @Override public HPSTrackerGeometryDefinition createGeometryDefinition(boolean debug, Element node) { return new HPSTestRunTracker2014GeometryDefinition(_debug, node); - } + } } Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014JavaBuilder.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014JavaBuilder.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014JavaBuilder.java Wed Mar 9 11:43:24 2016 @@ -28,122 +28,122 @@ */ public class HPSTracker2014JavaBuilder extends HPSTestRunTracker2014JavaBuilder { - - - /** - * Default constructor - * @param node - */ - public HPSTracker2014JavaBuilder(boolean debugFlag, Element node) { - super(debugFlag, node); - } - - - - - /** - * Build the JAVA geometry objects from the geometry definition. - * @param trackingVolume - the reference volume. - */ - public void build(ILogicalVolume trackingVolume) { - - // build geometry + + + /** + * Default constructor + * @param node + */ + public HPSTracker2014JavaBuilder(boolean debugFlag, Element node) { + super(debugFlag, node); + } + + + + + /** + * Build the JAVA geometry objects from the geometry definition. + * @param trackingVolume - the reference volume. + */ + public void build(ILogicalVolume trackingVolume) { + + // build geometry setBuilder(createGeometryDefinition(this._debug, node)); - - if(_builder==null) throw new RuntimeException("need to set builder class before calling build!"); - - if(isDebug()) System.out.printf("%s: build the base geometry objects\n", getClass().getSimpleName()); - - _builder.build(); - - if(isDebug()) System.out.printf("%s: DONE build the base geometry objects\n", getClass().getSimpleName()); - - if(isDebug()) System.out.printf("%s: build the JAVA geometry objects\n", getClass().getSimpleName()); - - // initialize the list to store a reference to each object - javaSurveyVolumes = new ArrayList<JavaSurveyVolume>(); - - // Go through the list of volumes to build that is created in the generic builder class - JavaSurveyVolume tracking = new JavaSurveyVolume(_builder.getSurveyVolume(TrackingVolume.class), trackingVolume); - add(tracking); - JavaSurveyVolume chamber = new JavaGhostSurveyVolume(_builder.getSurveyVolume(PSVacuumChamber.class), tracking); - add(chamber); - setBaseTrackerGeometry(new JavaSurveyVolume(_builder.getSurveyVolume(SvtBox.class), chamber,1)); - add(getBaseTrackerGeometry()); - JavaSurveyVolume svtBoxBasePlate = new JavaGhostSurveyVolume(_builder.getSurveyVolume(SvtBoxBasePlate.class), getBaseTrackerGeometry()); - add(svtBoxBasePlate); - - - // build modules - - if(isDebug()) System.out.printf("%s: build JAVA modules\n", getClass().getSimpleName()); - - // Loop over all modules created - for(BaseModuleBundle mod : _builder.modules) { - BaseModuleBundle m = mod; - if(isDebug()) { - System.out.printf("%s: build module %s (layer %d half %s)\n", getClass().getSimpleName(),m.module.getName(),m.getLayer(),m.getHalf()); - m.print(); - } - - // Find the mother among the objects using its name, should probably have a better way... - String name_mother = m.getMother().getName(); - JavaSurveyVolume mother = null; - for(JavaSurveyVolume g : javaSurveyVolumes) { - if(g.getName().equals(name_mother)) { - mother = g; - break; - } - } - // Check that it had a mother - if(mother==null) throw new RuntimeException("Cound't find mother to module " + m.module.getName()); - - if(isDebug()) System.out.printf("%s: found mother %s to module %s\n", getClass().getSimpleName(),mother.getName(),m.module.getName()); - - // put the module in the list of objects that will be added to LCDD - addModule(m, mother); - - if(isDebug()) System.out.printf("%s: DONE build module %s\n", getClass().getSimpleName(), m.module.getName()); - - - } - - if(isDebug()) System.out.printf("%s: DONE build JAVA modules\n", getClass().getSimpleName()); - - - //System.out.printf("%s: Built %d JAVA geometry objects\n", getClass().getSimpleName(),javaSurveyVolumes.size()); - - if(isDebug()) { - System.out.printf("%s: DONE building the JAVA geometry objects\n", getClass().getSimpleName()); - System.out.printf("%s: List of all the JAVA geometry objects built\n", this.getClass().getSimpleName()); - for(JavaSurveyVolume bg : javaSurveyVolumes) { - System.out.printf("-------\n%s\n", bg.toString()); - } - } - - - // Set visualization features - //setVis(); - - - } - - /** - * Rules for adding the JAVA module geometry. - * @param bundle - module to be added - * @param mother - mother JAVA geometry object - */ - private void addModule(BaseModuleBundle bundle, JavaSurveyVolume mother) { - if(bundle instanceof TestRunModuleBundle) { - addTestRunModule((TestRunModuleBundle) bundle, mother); - } else if(bundle instanceof LongModuleBundle) { - addLongModule((LongModuleBundle) bundle, mother); - } else { - throw new RuntimeException("The bundle is of unknown class type!"); - } - } - - /** + + if(_builder==null) throw new RuntimeException("need to set builder class before calling build!"); + + if(isDebug()) System.out.printf("%s: build the base geometry objects\n", getClass().getSimpleName()); + + _builder.build(); + + if(isDebug()) System.out.printf("%s: DONE build the base geometry objects\n", getClass().getSimpleName()); + + if(isDebug()) System.out.printf("%s: build the JAVA geometry objects\n", getClass().getSimpleName()); + + // initialize the list to store a reference to each object + javaSurveyVolumes = new ArrayList<JavaSurveyVolume>(); + + // Go through the list of volumes to build that is created in the generic builder class + JavaSurveyVolume tracking = new JavaSurveyVolume(_builder.getSurveyVolume(TrackingVolume.class), trackingVolume); + add(tracking); + JavaSurveyVolume chamber = new JavaGhostSurveyVolume(_builder.getSurveyVolume(PSVacuumChamber.class), tracking); + add(chamber); + setBaseTrackerGeometry(new JavaSurveyVolume(_builder.getSurveyVolume(SvtBox.class), chamber,1)); + add(getBaseTrackerGeometry()); + JavaSurveyVolume svtBoxBasePlate = new JavaGhostSurveyVolume(_builder.getSurveyVolume(SvtBoxBasePlate.class), getBaseTrackerGeometry()); + add(svtBoxBasePlate); + + + // build modules + + if(isDebug()) System.out.printf("%s: build JAVA modules\n", getClass().getSimpleName()); + + // Loop over all modules created + for(BaseModuleBundle mod : _builder.modules) { + BaseModuleBundle m = mod; + if(isDebug()) { + System.out.printf("%s: build module %s (layer %d half %s)\n", getClass().getSimpleName(),m.module.getName(),m.getLayer(),m.getHalf()); + m.print(); + } + + // Find the mother among the objects using its name, should probably have a better way... + String name_mother = m.getMother().getName(); + JavaSurveyVolume mother = null; + for(JavaSurveyVolume g : javaSurveyVolumes) { + if(g.getName().equals(name_mother)) { + mother = g; + break; + } + } + // Check that it had a mother + if(mother==null) throw new RuntimeException("Cound't find mother to module " + m.module.getName()); + + if(isDebug()) System.out.printf("%s: found mother %s to module %s\n", getClass().getSimpleName(),mother.getName(),m.module.getName()); + + // put the module in the list of objects that will be added to LCDD + addModule(m, mother); + + if(isDebug()) System.out.printf("%s: DONE build module %s\n", getClass().getSimpleName(), m.module.getName()); + + + } + + if(isDebug()) System.out.printf("%s: DONE build JAVA modules\n", getClass().getSimpleName()); + + + //System.out.printf("%s: Built %d JAVA geometry objects\n", getClass().getSimpleName(),javaSurveyVolumes.size()); + + if(isDebug()) { + System.out.printf("%s: DONE building the JAVA geometry objects\n", getClass().getSimpleName()); + System.out.printf("%s: List of all the JAVA geometry objects built\n", this.getClass().getSimpleName()); + for(JavaSurveyVolume bg : javaSurveyVolumes) { + System.out.printf("-------\n%s\n", bg.toString()); + } + } + + + // Set visualization features + //setVis(); + + + } + + /** + * Rules for adding the JAVA module geometry. + * @param bundle - module to be added + * @param mother - mother JAVA geometry object + */ + private void addModule(BaseModuleBundle bundle, JavaSurveyVolume mother) { + if(bundle instanceof TestRunModuleBundle) { + addTestRunModule((TestRunModuleBundle) bundle, mother); + } else if(bundle instanceof LongModuleBundle) { + addLongModule((LongModuleBundle) bundle, mother); + } else { + throw new RuntimeException("The bundle is of unknown class type!"); + } + } + + /** * Rules for adding the LCDD module geometry. * @param bundle - module to be added * @param mother - mother LCDD geometry object @@ -191,12 +191,12 @@ } - + @Override public HPSTrackerGeometryDefinition createGeometryDefinition(boolean debug, Element node) { return new HPSTracker2014GeometryDefinition(debug, node); } - - + + } Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerGeometryDefinition.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerGeometryDefinition.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerGeometryDefinition.java Wed Mar 9 11:43:24 2016 @@ -41,7 +41,7 @@ protected static final boolean use30mradRotation = true; protected static final boolean useFakeHalfModuleAxialPos = false; - // Global position references + // Global position references protected static final double target_pos_wrt_base_plate_x = 162.3; //from Marco's 3D model protected static final double target_pos_wrt_base_plate_y = 80.55; //from Tim's sketchup //68.75; //from Marco's 3D model protected static final double target_pos_wrt_base_plate_z = 926.59; //from Marco's 3D model Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerJavaBuilder.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerJavaBuilder.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerJavaBuilder.java Wed Mar 9 11:43:24 2016 @@ -15,158 +15,158 @@ public abstract class HPSTrackerJavaBuilder implements IHPSTrackerJavaBuilder { - protected boolean _debug = false; - private JavaSurveyVolume baseSurveyVolume; - protected List<JavaSurveyVolume> javaSurveyVolumes = new ArrayList<JavaSurveyVolume>(); - protected DetectorIdentifierHelper detectorIdentifierHelper; - protected IIdentifierDictionary identifierDictionary; - protected Subdetector subdet; - protected List<IDetectorElement> layerDetectorElements = new ArrayList<IDetectorElement>(); - protected List<IDetectorElement> moduleDetectorElements = new ArrayList<IDetectorElement>(); - protected IDetectorElement baseDetectorElement = null; - public HPSTrackerBuilder _builder = null; + protected boolean _debug = false; + private JavaSurveyVolume baseSurveyVolume; + protected List<JavaSurveyVolume> javaSurveyVolumes = new ArrayList<JavaSurveyVolume>(); + protected DetectorIdentifierHelper detectorIdentifierHelper; + protected IIdentifierDictionary identifierDictionary; + protected Subdetector subdet; + protected List<IDetectorElement> layerDetectorElements = new ArrayList<IDetectorElement>(); + protected List<IDetectorElement> moduleDetectorElements = new ArrayList<IDetectorElement>(); + protected IDetectorElement baseDetectorElement = null; + public HPSTrackerBuilder _builder = null; protected Element node = null; - - public HPSTrackerJavaBuilder(boolean debugFlag, Element node) { - this._debug=debugFlag; - this.node = node; - } - - public abstract void build(ILogicalVolume trackingVolume); - public abstract HPSTrackerGeometryDefinition createGeometryDefinition(boolean debug, Element node); + + public HPSTrackerJavaBuilder(boolean debugFlag, Element node) { + this._debug=debugFlag; + this.node = node; + } + + public abstract void build(ILogicalVolume trackingVolume); + public abstract HPSTrackerGeometryDefinition createGeometryDefinition(boolean debug, Element node); - - /** - * Add to list of objects. - * @param geom - object to add. - */ - public void add(JavaSurveyVolume geom) { - javaSurveyVolumes.add(geom); - } - - public void setBuilder(HPSTrackerBuilder b) { - _builder = b; - } - - public void build() { - _builder.build(); - } - - public void setDebug(boolean debug) { - _debug = debug; - } - - public boolean isDebug() { - return _debug; - } + + /** + * Add to list of objects. + * @param geom - object to add. + */ + public void add(JavaSurveyVolume geom) { + javaSurveyVolumes.add(geom); + } + + public void setBuilder(HPSTrackerBuilder b) { + _builder = b; + } + + public void build() { + _builder.build(); + } + + public void setDebug(boolean debug) { + _debug = debug; + } + + public boolean isDebug() { + return _debug; + } - public DetectorIdentifierHelper getDetectorIdentifierHelper() { - return detectorIdentifierHelper; - } + public DetectorIdentifierHelper getDetectorIdentifierHelper() { + return detectorIdentifierHelper; + } - public void setDetectorIdentifierHelper( - DetectorIdentifierHelper detectorIdentifierHelper) { - this.detectorIdentifierHelper = detectorIdentifierHelper; - } + public void setDetectorIdentifierHelper( + DetectorIdentifierHelper detectorIdentifierHelper) { + this.detectorIdentifierHelper = detectorIdentifierHelper; + } - public IIdentifierDictionary getIdentifierDictionary() { - return identifierDictionary; - } + public IIdentifierDictionary getIdentifierDictionary() { + return identifierDictionary; + } - public void setIdentifierDictionary( - IIdentifierDictionary identifierDictionary) { - this.identifierDictionary = identifierDictionary; - } + public void setIdentifierDictionary( + IIdentifierDictionary identifierDictionary) { + this.identifierDictionary = identifierDictionary; + } - public void setSubdetector(Subdetector subdet) { - this.subdet = subdet; - } + public void setSubdetector(Subdetector subdet) { + this.subdet = subdet; + } - public Subdetector getSubdetector() { - return this.subdet; - } + public Subdetector getSubdetector() { + return this.subdet; + } - + - + - // This finds specific type. I would like to use the ID for this but can't, I think. - // TODO there must be a factory instance to do this - public SiTrackerModule getModuleDetectorElement(SiTrackerModule testElement) { - if(isDebug()) System.out.printf("%s: getModuleDetectorElement for module %s path: \"%s\"\n", this.getClass().getSimpleName(),testElement.getName(),testElement.getGeometry().getPathString()); - SiTrackerModule element = null; - for(IDetectorElement e : moduleDetectorElements) { - SiTrackerModule m = (SiTrackerModule) e; - if(isDebug()) System.out.printf("%s: compare with module %s path: %s\"%s\" \n", this.getClass().getSimpleName(),m.getName(),m.getGeometry().getPathString()); - if(m.getGeometry().getPathString().equals(testElement.getGeometry().getPathString())) { - if(element!=null) throw new RuntimeException("two DE sharing extended ID?"); - if(isDebug()) System.out.printf("%s: found it\n", this.getClass().getSimpleName()); - element = m; - } - } - return element; - } + // This finds specific type. I would like to use the ID for this but can't, I think. + // TODO there must be a factory instance to do this + public SiTrackerModule getModuleDetectorElement(SiTrackerModule testElement) { + if(isDebug()) System.out.printf("%s: getModuleDetectorElement for module %s path: \"%s\"\n", this.getClass().getSimpleName(),testElement.getName(),testElement.getGeometry().getPathString()); + SiTrackerModule element = null; + for(IDetectorElement e : moduleDetectorElements) { + SiTrackerModule m = (SiTrackerModule) e; + if(isDebug()) System.out.printf("%s: compare with module %s path: %s\"%s\" \n", this.getClass().getSimpleName(),m.getName(),m.getGeometry().getPathString()); + if(m.getGeometry().getPathString().equals(testElement.getGeometry().getPathString())) { + if(element!=null) throw new RuntimeException("two DE sharing extended ID?"); + if(isDebug()) System.out.printf("%s: found it\n", this.getClass().getSimpleName()); + element = m; + } + } + return element; + } - - // Find detector elements - // TODO This should be using some global geometry code like DetectorElementStore? - public IDetectorElement getLayerDetectorElement(IExpandedIdentifier expId) { - IDetectorElement element = null; - if(isDebug()) System.out.printf("%s: search among %d layer DEs\n", this.getClass().getSimpleName(), layerDetectorElements.size()); - for(IDetectorElement e : layerDetectorElements) { - if(isDebug()) System.out.printf("%s: test %s\n", this.getClass().getSimpleName(),e.getName()); - ExpandedIdentifier eId = (ExpandedIdentifier) e.getExpandedIdentifier(); - if(eId.equals(expId)) { // TODO order matters as expId is an interface without that function!? - //check that only one was found - if(element!=null) throw new RuntimeException("two DE sharing extended ID?"); - if(isDebug()) System.out.printf("%s: found it\n", this.getClass().getSimpleName()); - element = e; - } + + // Find detector elements + // TODO This should be using some global geometry code like DetectorElementStore? + public IDetectorElement getLayerDetectorElement(IExpandedIdentifier expId) { + IDetectorElement element = null; + if(isDebug()) System.out.printf("%s: search among %d layer DEs\n", this.getClass().getSimpleName(), layerDetectorElements.size()); + for(IDetectorElement e : layerDetectorElements) { + if(isDebug()) System.out.printf("%s: test %s\n", this.getClass().getSimpleName(),e.getName()); + ExpandedIdentifier eId = (ExpandedIdentifier) e.getExpandedIdentifier(); + if(eId.equals(expId)) { // TODO order matters as expId is an interface without that function!? + //check that only one was found + if(element!=null) throw new RuntimeException("two DE sharing extended ID?"); + if(isDebug()) System.out.printf("%s: found it\n", this.getClass().getSimpleName()); + element = e; + } - } - return element; - } + } + return element; + } - public void addLayerDetectorElement(IDetectorElement e) { - IExpandedIdentifier expId = e.getExpandedIdentifier(); - if(getLayerDetectorElement(expId) != null) - throw new RuntimeException("Trying to add an existing layer detector element."); - layerDetectorElements.add(e); - } + public void addLayerDetectorElement(IDetectorElement e) { + IExpandedIdentifier expId = e.getExpandedIdentifier(); + if(getLayerDetectorElement(expId) != null) + throw new RuntimeException("Trying to add an existing layer detector element."); + layerDetectorElements.add(e); + } - public void addBaseDetectorElement(IDetectorElement e) { - baseDetectorElement = e; - } + public void addBaseDetectorElement(IDetectorElement e) { + baseDetectorElement = e; + } - public IDetectorElement getBaseDetectorElement() { - return baseDetectorElement; - } + public IDetectorElement getBaseDetectorElement() { + return baseDetectorElement; + } - public void addModuleDetectorElement(IDetectorElement e) { - if(!(e instanceof SiTrackerModule)) - throw new RuntimeException("Trying to add an existing module of wrong type."); - if(getModuleDetectorElement((SiTrackerModule) e) != null) - throw new RuntimeException("Trying to add an already existing module detector element."); - layerDetectorElements.add(e); - } - + public void addModuleDetectorElement(IDetectorElement e) { + if(!(e instanceof SiTrackerModule)) + throw new RuntimeException("Trying to add an existing module of wrong type."); + if(getModuleDetectorElement((SiTrackerModule) e) != null) + throw new RuntimeException("Trying to add an already existing module detector element."); + layerDetectorElements.add(e); + } + - /** - * @return the baseTrackerGeometry - */ - public JavaSurveyVolume getBaseTrackerGeometry() { - return baseSurveyVolume; - } + /** + * @return the baseTrackerGeometry + */ + public JavaSurveyVolume getBaseTrackerGeometry() { + return baseSurveyVolume; + } - /** - * @param baseTrackerGeometry the baseTrackerGeometry to set - */ - public void setBaseTrackerGeometry(JavaSurveyVolume baseTrackerGeometry) { - this.baseSurveyVolume = baseTrackerGeometry; - } + /** + * @param baseTrackerGeometry the baseTrackerGeometry to set + */ + public void setBaseTrackerGeometry(JavaSurveyVolume baseTrackerGeometry) { + this.baseSurveyVolume = baseTrackerGeometry; + } } Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerLCDDBuilder.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerLCDDBuilder.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerLCDDBuilder.java Wed Mar 9 11:43:24 2016 @@ -10,24 +10,24 @@ public abstract class HPSTrackerLCDDBuilder implements IHPSTrackerLCDDBuilder { - public boolean _debug = false; - protected LCDD lcdd = null; - protected LCDDSurveyVolume baseSurveyVolume; - protected List<LCDDSurveyVolume> lcddSurveyVolumes = new ArrayList<LCDDSurveyVolume>(); - private SensitiveDetector sensitiveDetector; - public HPSTrackerBuilder _builder = null; + public boolean _debug = false; + protected LCDD lcdd = null; + protected LCDDSurveyVolume baseSurveyVolume; + protected List<LCDDSurveyVolume> lcddSurveyVolumes = new ArrayList<LCDDSurveyVolume>(); + private SensitiveDetector sensitiveDetector; + public HPSTrackerBuilder _builder = null; protected Element node; - - - public HPSTrackerLCDDBuilder(boolean debugFlag, Element node, LCDD lcdd2, SensitiveDetector sens) { - setDebug(debugFlag); - setLCDD(lcdd2); - setSensitiveDetector(sens); - setNode(node); - } - - /** + + + public HPSTrackerLCDDBuilder(boolean debugFlag, Element node, LCDD lcdd2, SensitiveDetector sens) { + setDebug(debugFlag); + setLCDD(lcdd2); + setSensitiveDetector(sens); + setNode(node); + } + + /** * Build the LCDD geometry objects. * @param worldVolume - the reference volume. */ @@ -37,93 +37,93 @@ public abstract void setBuilder(); public abstract HPSTrackerGeometryDefinition createGeometryDefinition(boolean debug, Element node); - + - public void setNode(Element node) { + public void setNode(Element node) { this.node = node; - } - + } + public void setSensitiveDetector(SensitiveDetector sens) { - this.sensitiveDetector = sens; - } + this.sensitiveDetector = sens; + } - public SensitiveDetector getSensitiveDetector() { - return this.sensitiveDetector; - } + public SensitiveDetector getSensitiveDetector() { + return this.sensitiveDetector; + } - public void setBuilder(HPSTrackerBuilder b) { - _builder = b; - } - - public HPSTrackerBuilder getBuilder() { - return _builder; - } - - public void build() { - _builder.build(); - } - - public void setDebug(boolean debug) { - _debug = debug; - } - - public boolean isDebug() { - return _debug; - } - - /** - * Add to list of objects. - * @param geom - object to add. - */ - public void add(LCDDSurveyVolume geom) { - lcddSurveyVolumes.add(geom); - } + public void setBuilder(HPSTrackerBuilder b) { + _builder = b; + } + + public HPSTrackerBuilder getBuilder() { + return _builder; + } + + public void build() { + _builder.build(); + } + + public void setDebug(boolean debug) { + _debug = debug; + } + + public boolean isDebug() { + return _debug; + } + + /** + * Add to list of objects. + * @param geom - object to add. + */ + public void add(LCDDSurveyVolume geom) { + lcddSurveyVolumes.add(geom); + } - - + + - public void setLCDD(LCDD lcdd) { - this.lcdd = lcdd; - } + public void setLCDD(LCDD lcdd) { + this.lcdd = lcdd; + } - public LCDD getLCDD() { - return lcdd; - } + public LCDD getLCDD() { + return lcdd; + } - public LCDDSurveyVolume getBaseLCDD() { - return baseSurveyVolume; - } + public LCDDSurveyVolume getBaseLCDD() { + return baseSurveyVolume; + } - public void setVisualization() { - - if(isDebug()) System.out.printf("%s: Set LCDD visualization for %d LCDD geometry objects \n", getClass().getSimpleName(), lcddSurveyVolumes.size()); - for(SurveyVolumeImpl g : lcddSurveyVolumes) { - String name = g.getName(); - if(isDebug()) System.out.printf("%s: Set LCDD vis for %s \n", getClass().getSimpleName(), name); - if(name.contains("base_plate")) g.setVisName("BasePlateVis"); + public void setVisualization() { + + if(isDebug()) System.out.printf("%s: Set LCDD visualization for %d LCDD geometry objects \n", getClass().getSimpleName(), lcddSurveyVolumes.size()); + for(SurveyVolumeImpl g : lcddSurveyVolumes) { + String name = g.getName(); + if(isDebug()) System.out.printf("%s: Set LCDD vis for %s \n", getClass().getSimpleName(), name); + if(name.contains("base_plate")) g.setVisName("BasePlateVis"); else if(name.equals("base")) g.setVisName("SvtBoxVis"); - else if(name.contains("chamber")) g.setVisName("ChamberVis"); - else if(name.contains("support_bottom") || name.contains("support_top")) g.setVisName("SupportVolumeVis"); - else if(name.contains("support_plate")) g.setVisName("SupportPlateVis"); - else if(name.startsWith("module_")) { - if(name.endsWith("halfmodule_axial") || name.endsWith("halfmodule_stereo")) g.setVisName("HalfModuleVis"); - else if(name.endsWith("cold")) g.setVisName("ColdBlockVis"); - else if(name.endsWith("lamination")) g.setVisName("KaptonVis"); - else if(name.endsWith("sensor")) g.setVisName("SensorVis"); - else if(name.endsWith("sensor_active")) g.setVisName("SensorVis"); - else if(name.endsWith("cf")) g.setVisName("CarbonFiberVis"); - else if(name.endsWith("hybrid")) g.setVisName("HybridVis"); - else { - //this must be a module then? - g.setVisName("ModuleVis"); - } - } - else { - if(isDebug()) System.out.printf("%s: No LCDD vis for %s \n", getClass().getSimpleName(), name); - } - } - if(isDebug()) System.out.printf("%s: DONE Set LCDD vis \n", getClass().getSimpleName()); - } - + else if(name.contains("chamber")) g.setVisName("ChamberVis"); + else if(name.contains("support_bottom") || name.contains("support_top")) g.setVisName("SupportVolumeVis"); + else if(name.contains("support_plate")) g.setVisName("SupportPlateVis"); + else if(name.startsWith("module_")) { + if(name.endsWith("halfmodule_axial") || name.endsWith("halfmodule_stereo")) g.setVisName("HalfModuleVis"); + else if(name.endsWith("cold")) g.setVisName("ColdBlockVis"); + else if(name.endsWith("lamination")) g.setVisName("KaptonVis"); + else if(name.endsWith("sensor")) g.setVisName("SensorVis"); + else if(name.endsWith("sensor_active")) g.setVisName("SensorVis"); + else if(name.endsWith("cf")) g.setVisName("CarbonFiberVis"); + else if(name.endsWith("hybrid")) g.setVisName("HybridVis"); + else { + //this must be a module then? + g.setVisName("ModuleVis"); + } + } + else { + if(isDebug()) System.out.printf("%s: No LCDD vis for %s \n", getClass().getSimpleName(), name); + } + } + if(isDebug()) System.out.printf("%s: DONE Set LCDD vis \n", getClass().getSimpleName()); + } + } Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/IHPSTrackerJavaBuilder.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/IHPSTrackerJavaBuilder.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/IHPSTrackerJavaBuilder.java Wed Mar 9 11:43:24 2016 @@ -7,25 +7,25 @@ public interface IHPSTrackerJavaBuilder { - /** - * Build the JAVA geometry objects from the geometry definition. - * @param trackingVolume - the reference volume. - */ - public void build(ILogicalVolume trackingVolume); - - public DetectorIdentifierHelper getDetectorIdentifierHelper(); + /** + * Build the JAVA geometry objects from the geometry definition. + * @param trackingVolume - the reference volume. + */ + public void build(ILogicalVolume trackingVolume); + + public DetectorIdentifierHelper getDetectorIdentifierHelper(); - public void setDetectorIdentifierHelper( - DetectorIdentifierHelper detectorIdentifierHelper); + public void setDetectorIdentifierHelper( + DetectorIdentifierHelper detectorIdentifierHelper); - public IIdentifierDictionary getIdentifierDictionary(); + public IIdentifierDictionary getIdentifierDictionary(); - public void setIdentifierDictionary( - IIdentifierDictionary identifierDictionary); + public void setIdentifierDictionary( + IIdentifierDictionary identifierDictionary); - public void setSubdetector(Subdetector subdet); + public void setSubdetector(Subdetector subdet); - public Subdetector getSubdetector(); - + public Subdetector getSubdetector(); + } Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/IHPSTrackerLCDDBuilder.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/IHPSTrackerLCDDBuilder.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/IHPSTrackerLCDDBuilder.java Wed Mar 9 11:43:24 2016 @@ -5,11 +5,11 @@ public interface IHPSTrackerLCDDBuilder { - public void setSensitiveDetector(SensitiveDetector sens); + public void setSensitiveDetector(SensitiveDetector sens); - public SensitiveDetector getSensitiveDetector(); - - public void build(Volume worldVolume); + public SensitiveDetector getSensitiveDetector(); + + public void build(Volume worldVolume); - public void setVisualization(); + public void setVisualization(); } Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/JavaGhostSurveyVolume.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/JavaGhostSurveyVolume.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/JavaGhostSurveyVolume.java Wed Mar 9 11:43:24 2016 @@ -7,22 +7,22 @@ * @author Per Hansson Adrian <[log in to unmask]> */ public class JavaGhostSurveyVolume extends JavaSurveyVolume { - - /** - * Initialize with base and mother. This is typically for a reference geometry object - * that is used for referencing coordinate systems but that doesn't have a volume itself. - * @param surveyVolume - object used to get geometry definitions - * @param mother - mother object - */ - public JavaGhostSurveyVolume(SurveyVolume surveyVolume, JavaSurveyVolume mother) { - super(surveyVolume); - if(isDebug()) System.out.printf("%s: constructing JAVA ghost object %s with mother %s\n", this.getClass().getSimpleName(),surveyVolume.getName(),mother==null?"null":mother.getName()); - setMother(mother); - mother.addDaughter(this); - setPositionAndRotation(surveyVolume); - if(isDebug()) System.out.printf("%s: DONE constructing JAVA object %s\n", this.getClass().getSimpleName(),surveyVolume.getName()); - } - + + /** + * Initialize with base and mother. This is typically for a reference geometry object + * that is used for referencing coordinate systems but that doesn't have a volume itself. + * @param surveyVolume - object used to get geometry definitions + * @param mother - mother object + */ + public JavaGhostSurveyVolume(SurveyVolume surveyVolume, JavaSurveyVolume mother) { + super(surveyVolume); + if(isDebug()) System.out.printf("%s: constructing JAVA ghost object %s with mother %s\n", this.getClass().getSimpleName(),surveyVolume.getName(),mother==null?"null":mother.getName()); + setMother(mother); + mother.addDaughter(this); + setPositionAndRotation(surveyVolume); + if(isDebug()) System.out.printf("%s: DONE constructing JAVA object %s\n", this.getClass().getSimpleName(),surveyVolume.getName()); + } + } Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/JavaSurveyVolume.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/JavaSurveyVolume.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/JavaSurveyVolume.java Wed Mar 9 11:43:24 2016 @@ -26,120 +26,120 @@ * @author Per Hansson Adrian <[log in to unmask]> */ public class JavaSurveyVolume extends SurveyVolumeImpl { - private Box box= null; - private ILogicalVolume volume = null; - private ITranslation3D pos = null; - private IRotation3D rot = null; - private IPhysicalVolume physVolume = null; - private JavaSurveyVolume mother = null; - public List<JavaSurveyVolume> daughters = new ArrayList<JavaSurveyVolume>(); - private int componentId = -1; - - /** - * Default constructor - */ - public JavaSurveyVolume(SurveyVolume surveyVolume) { - super(surveyVolume); - } - - /** - * Construct a JAVA geometry object from its geometry definition and an already built logical volume. - * This is typically used by the tracking volume. - * @param surveyVolume - input geometry definition - * @param vol - logical volume - */ - public JavaSurveyVolume(SurveyVolume surveyVolume, ILogicalVolume vol) { - super(surveyVolume); - if(isDebug()) System.out.printf("%s: JavaBaseGeometry %s (given logical volume %s)\n", this.getClass().getSimpleName(),surveyVolume.getName(),vol.getName()); - // this must be tracking volume. May change in the future and is probably weird to make this requirement here. - if(!surveyVolume.getName().contains("tracking")) throw new RuntimeException("this constructor is only used with the tracking volume!?"); - setVolume(vol); - // since it's tracking volume, set the pos and rotation trivially - Hep3Vector lcdd_rot_angles = TransformationUtils.getCardanAngles(surveyVolume.getCoord().v(), surveyVolume.getCoord().w(), new BasicHep3Vector(0,1,0),new BasicHep3Vector(0,0,1)); - setPos(new Translation3D(0,0,0)); - setRot(new RotationGeant(lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z())); - if(isDebug()) System.out.printf("%s: DONE JavaBaseGeometry %s\n", this.getClass().getSimpleName(),surveyVolume.getName()); - } - - /** - * Construct a JAVA geometry object from its geometry definition. - * @param surveyVolume - input geometry definition - * @param mother - reference to mother JAVA definition - * @param volumeId - component id number - */ - public JavaSurveyVolume(SurveyVolume surveyVolume, JavaSurveyVolume mother, int volumeId) { - super(surveyVolume); + private Box box= null; + private ILogicalVolume volume = null; + private ITranslation3D pos = null; + private IRotation3D rot = null; + private IPhysicalVolume physVolume = null; + private JavaSurveyVolume mother = null; + public List<JavaSurveyVolume> daughters = new ArrayList<JavaSurveyVolume>(); + private int componentId = -1; + + /** + * Default constructor + */ + public JavaSurveyVolume(SurveyVolume surveyVolume) { + super(surveyVolume); + } + + /** + * Construct a JAVA geometry object from its geometry definition and an already built logical volume. + * This is typically used by the tracking volume. + * @param surveyVolume - input geometry definition + * @param vol - logical volume + */ + public JavaSurveyVolume(SurveyVolume surveyVolume, ILogicalVolume vol) { + super(surveyVolume); + if(isDebug()) System.out.printf("%s: JavaBaseGeometry %s (given logical volume %s)\n", this.getClass().getSimpleName(),surveyVolume.getName(),vol.getName()); + // this must be tracking volume. May change in the future and is probably weird to make this requirement here. + if(!surveyVolume.getName().contains("tracking")) throw new RuntimeException("this constructor is only used with the tracking volume!?"); + setVolume(vol); + // since it's tracking volume, set the pos and rotation trivially + Hep3Vector lcdd_rot_angles = TransformationUtils.getCardanAngles(surveyVolume.getCoord().v(), surveyVolume.getCoord().w(), new BasicHep3Vector(0,1,0),new BasicHep3Vector(0,0,1)); + setPos(new Translation3D(0,0,0)); + setRot(new RotationGeant(lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z())); + if(isDebug()) System.out.printf("%s: DONE JavaBaseGeometry %s\n", this.getClass().getSimpleName(),surveyVolume.getName()); + } + + /** + * Construct a JAVA geometry object from its geometry definition. + * @param surveyVolume - input geometry definition + * @param mother - reference to mother JAVA definition + * @param volumeId - component id number + */ + public JavaSurveyVolume(SurveyVolume surveyVolume, JavaSurveyVolume mother, int volumeId) { + super(surveyVolume); if(isDebug()) System.out.printf("%s: JavaBaseGeometry %s (volumeID %d, mother %s)\n", this.getClass().getSimpleName(),surveyVolume.getName(),volumeId,mother==null?"null":mother.getName()); - setComponentId(volumeId); - setMother(mother); - mother.addDaughter(this); - buildBox(); - buildVolume(); - setPositionAndRotation(surveyVolume); - if(isDebug()) System.out.printf("%s: DONE JavaBaseGeometry %s\n", this.getClass().getSimpleName(),surveyVolume.getName()); - } - - protected boolean hasCoordinateSystemInfo() { - return pos!=null && rot!=null; - } - - - public void buildPhysVolume() { - if(isDebug()) System.out.printf("%s: build phys volume for %s with mother %s and physical mother %s\n", this.getClass().getSimpleName(),getName(),getMother().getName(),getPhysMother().getName()); - JavaSurveyVolume physMother = getPhysMother(); - setPhysVolume(new PhysicalVolume(new Transform3D(getPos(), getRot()), getName(), volume, physMother.getVolume(),getComponentId())); - } - - public void buildBox() { - Hep3Vector b = VecOp.mult(0.5,getBoxDim()); - if(isDebug()) System.out.printf("%s: build box for %s with dimensions %s \n", this.getClass().getSimpleName(),getName(), b); - setBox(new Box(getName() + "Box", b.x(), b.y(), b.z())); - } - public void buildVolume() { - if(isDebug()) System.out.printf("%s: build volume for %s with material %s\n", this.getClass().getSimpleName(),getName(), MaterialStore.getInstance().get(getMaterial())); - setVolume(new LogicalVolume(getName() + "_volume", box, MaterialStore.getInstance().get(getMaterial()))); - - } - public void setPositionAndRotation(SurveyVolume base) { - if(isDebug()) System.out.printf("%s: set position and rotation for volume %s\n", this.getClass().getSimpleName(),getName()); - - // no mother, this must be the world/tracking volume!? - if(base.getMother()==null) throw new RuntimeException("trying to set coordinates w/o mother defined for "+base.getName()); - - // Vector from origin to center of box locally - Hep3Vector box_center_base_local = base.getCenter(); - - // find the physical mother i.e. not a ghost volume and compound transformations to it - JavaSurveyVolume physMother = getPhysMother(); - if(isDebug()) System.out.printf("%s: physical mother to transform to is %s; find the transform to it\n", this.getClass().getSimpleName(),physMother.getName()); - Transform3D trf = HPSTrackerBuilder.getTransform(base.getCoord().getTransformation(),base.getMother(),physMother.getName()); - if(isDebug()) System.out.printf("%s: found transform to physical mother \n%s\n\n", this.getClass().getSimpleName(),trf.toString()); - - // find the position of the center in the physical mother coord - Hep3Vector box_center_base = trf.transformed(box_center_base_local); - - // find the position of the center of the box in the mother coordinate system, make sure to use the physical mother coordinates - if(isDebug()) System.out.printf("%s: find center of box in physical mother coord %s \n", this.getClass().getSimpleName(),physMother.getName()); - // hack since my getTransform function needs a mother TODO Fix this! - SurveyVolume gm = base; - if(isDebug()) System.out.printf("%s: look for physical mother %s starting from mother %s \n", this.getClass().getSimpleName(),physMother.getName(),gm.getMother()!=null?gm.getMother().getName():"-- no mother --"); - while((gm=gm.getMother()).getName()!=physMother.getName()) { - if(isDebug()) System.out.printf("%s: gm is %s \n", this.getClass().getSimpleName(),gm.getName()); - //gm = gm.getMother(); - } - if(isDebug()) System.out.printf("%s: found physical mother %s with center at %s \n", this.getClass().getSimpleName(),gm.getName(), gm.getCenter()); - - Hep3Vector mother_center = gm.getCenter(); - - // now calculate the position of this box center in the mother LCDD coordinates - Hep3Vector box_center = VecOp.sub(box_center_base, mother_center); - - //Find LCDD Euler rotation angles from coordinate system unit vectors - //Note that this has to be rotation wrt to physical mother and not just mother as normally is the case - //Use apache lib to get angles, but in principle I should already have it from the trf above - //Hep3Vector lcdd_rot_angles = HPSTestRunTracker2014.getEulerAngles(base.getCoord().v(), base.getCoord().w(), new BasicHep3Vector(0,1,0),new BasicHep3Vector(0,0,1)); - if(isDebug()) System.out.printf("%s: find LCDD Cardan rotation angles - need to find mother to physical mother transform \n", this.getClass().getSimpleName(),physMother.getName()); - Hep3Vector base_u = base.getCoord().u(); + setComponentId(volumeId); + setMother(mother); + mother.addDaughter(this); + buildBox(); + buildVolume(); + setPositionAndRotation(surveyVolume); + if(isDebug()) System.out.printf("%s: DONE JavaBaseGeometry %s\n", this.getClass().getSimpleName(),surveyVolume.getName()); + } + + protected boolean hasCoordinateSystemInfo() { + return pos!=null && rot!=null; + } + + + public void buildPhysVolume() { + if(isDebug()) System.out.printf("%s: build phys volume for %s with mother %s and physical mother %s\n", this.getClass().getSimpleName(),getName(),getMother().getName(),getPhysMother().getName()); + JavaSurveyVolume physMother = getPhysMother(); + setPhysVolume(new PhysicalVolume(new Transform3D(getPos(), getRot()), getName(), volume, physMother.getVolume(),getComponentId())); + } + + public void buildBox() { + Hep3Vector b = VecOp.mult(0.5,getBoxDim()); + if(isDebug()) System.out.printf("%s: build box for %s with dimensions %s \n", this.getClass().getSimpleName(),getName(), b); + setBox(new Box(getName() + "Box", b.x(), b.y(), b.z())); + } + public void buildVolume() { + if(isDebug()) System.out.printf("%s: build volume for %s with material %s\n", this.getClass().getSimpleName(),getName(), MaterialStore.getInstance().get(getMaterial())); + setVolume(new LogicalVolume(getName() + "_volume", box, MaterialStore.getInstance().get(getMaterial()))); + + } + public void setPositionAndRotation(SurveyVolume base) { + if(isDebug()) System.out.printf("%s: set position and rotation for volume %s\n", this.getClass().getSimpleName(),getName()); + + // no mother, this must be the world/tracking volume!? + if(base.getMother()==null) throw new RuntimeException("trying to set coordinates w/o mother defined for "+base.getName()); + + // Vector from origin to center of box locally + Hep3Vector box_center_base_local = base.getCenter(); + + // find the physical mother i.e. not a ghost volume and compound transformations to it + JavaSurveyVolume physMother = getPhysMother(); + if(isDebug()) System.out.printf("%s: physical mother to transform to is %s; find the transform to it\n", this.getClass().getSimpleName(),physMother.getName()); + Transform3D trf = HPSTrackerBuilder.getTransform(base.getCoord().getTransformation(),base.getMother(),physMother.getName()); + if(isDebug()) System.out.printf("%s: found transform to physical mother \n%s\n\n", this.getClass().getSimpleName(),trf.toString()); + + // find the position of the center in the physical mother coord + Hep3Vector box_center_base = trf.transformed(box_center_base_local); + + // find the position of the center of the box in the mother coordinate system, make sure to use the physical mother coordinates + if(isDebug()) System.out.printf("%s: find center of box in physical mother coord %s \n", this.getClass().getSimpleName(),physMother.getName()); + // hack since my getTransform function needs a mother TODO Fix this! + SurveyVolume gm = base; + if(isDebug()) System.out.printf("%s: look for physical mother %s starting from mother %s \n", this.getClass().getSimpleName(),physMother.getName(),gm.getMother()!=null?gm.getMother().getName():"-- no mother --"); + while((gm=gm.getMother()).getName()!=physMother.getName()) { + if(isDebug()) System.out.printf("%s: gm is %s \n", this.getClass().getSimpleName(),gm.getName()); + //gm = gm.getMother(); + } + if(isDebug()) System.out.printf("%s: found physical mother %s with center at %s \n", this.getClass().getSimpleName(),gm.getName(), gm.getCenter()); + + Hep3Vector mother_center = gm.getCenter(); + + // now calculate the position of this box center in the mother LCDD coordinates + Hep3Vector box_center = VecOp.sub(box_center_base, mother_center); + + //Find LCDD Euler rotation angles from coordinate system unit vectors + //Note that this has to be rotation wrt to physical mother and not just mother as normally is the case + //Use apache lib to get angles, but in principle I should already have it from the trf above + //Hep3Vector lcdd_rot_angles = HPSTestRunTracker2014.getEulerAngles(base.getCoord().v(), base.getCoord().w(), new BasicHep3Vector(0,1,0),new BasicHep3Vector(0,0,1)); + if(isDebug()) System.out.printf("%s: find LCDD Cardan rotation angles - need to find mother to physical mother transform \n", this.getClass().getSimpleName(),physMother.getName()); + Hep3Vector base_u = base.getCoord().u(); Hep3Vector base_v = base.getCoord().v(); Hep3Vector base_w = base.getCoord().w(); if(isDebug()) System.out.printf("%s: unit vectors in mother coord: %s, %s, %s\n", this.getClass().getSimpleName(),base_u.toString(),base_v.toString(),base_w.toString()); @@ -169,22 +169,22 @@ //System.out.printf("%s: unit vectors u %s v %s w %s\n", this.getClass().getSimpleName(),base.getCoord().u().toString(),base.getCoord().v().toString(),base.getCoord().w().toString()); } - Hep3Vector lcdd_rot_angles = TransformationUtils.getCardanAngles(base_u, base_v, base_w, unit_u, unit_v, unit_w); - - - // Create the LCDD position - setPos(new Translation3D(box_center.x(), box_center.y(), box_center.z())); - setRot(new RotationGeant(lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z())); - - if(isDebug()) { - - System.out.printf("%s: SurveyVolume information for %s:\n", this.getClass().getSimpleName(), base.getName()); + Hep3Vector lcdd_rot_angles = TransformationUtils.getCardanAngles(base_u, base_v, base_w, unit_u, unit_v, unit_w); + + + // Create the LCDD position + setPos(new Translation3D(box_center.x(), box_center.y(), box_center.z())); + setRot(new RotationGeant(lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z())); + + if(isDebug()) { + + System.out.printf("%s: SurveyVolume information for %s:\n", this.getClass().getSimpleName(), base.getName()); System.out.printf("%s: box_center_base_local %s\n", this.getClass().getSimpleName(), box_center_base_local.toString()); - System.out.printf("%s: box_center_base %s\n", this.getClass().getSimpleName(), box_center_base.toString()); - System.out.printf("%s: mother center %s\n", this.getClass().getSimpleName(), base.getMother()==null?" <no mother> ":mother_center.toString()); - System.out.printf("%s: box_center %s\n", this.getClass().getSimpleName(), box_center.toString()); - System.out.printf("%s: pos %s\n", this.getClass().getSimpleName(), getPos().toString()); - Hep3Vector box_center_tracking_xcheck = HPSTrackerBuilder.transformToTracking(box_center_base_local, base); + System.out.printf("%s: box_center_base %s\n", this.getClass().getSimpleName(), box_center_base.toString()); + System.out.printf("%s: mother center %s\n", this.getClass().getSimpleName(), base.getMother()==null?" <no mother> ":mother_center.toString()); + System.out.printf("%s: box_center %s\n", this.getClass().getSimpleName(), box_center.toString()); + System.out.printf("%s: pos %s\n", this.getClass().getSimpleName(), getPos().toString()); + Hep3Vector box_center_tracking_xcheck = HPSTrackerBuilder.transformToTracking(box_center_base_local, base); System.out.printf("%s: box_center_tracking_xcheck %s (for %s)\n", this.getClass().getSimpleName(), box_center_tracking_xcheck==null ? " <null> " : box_center_tracking_xcheck.toString(),base.getName()); Hep3Vector box_center_envelope_xcheck2 = HPSTrackerBuilder.transformToParent(box_center_base_local, base, "base"); System.out.printf("%s: box_center_base_xcheck2 %s (for %s)\n", this.getClass().getSimpleName(), box_center_envelope_xcheck2==null ? " <null> " : box_center_envelope_xcheck2.toString(),base.getName()); @@ -203,90 +203,90 @@ System.out.printf("%s: origin_base_in %s\n", this.getClass().getSimpleName(), origin_base_in==null ? " <null> " : origin_base_in.toString()); } System.out.printf("%s: euler %s\n", this.getClass().getSimpleName(), lcdd_rot_angles.toString()); - System.out.printf("%s: rot %s\n", this.getClass().getSimpleName(), getRot().toString()); - - } - - } - - /** - * Find the first non-ghost volume among parents. - * @return mother object - */ - public JavaSurveyVolume getPhysMother() { - //if(isDebug()) System.out.printf("%s: finding physical mother to %s\n", this.getClass().getSimpleName(), getName()); - if(mother==null) throw new RuntimeException("Trying to get phys mother but there is no mother!"); - if(mother instanceof JavaGhostSurveyVolume) { - return mother.getPhysMother(); - } else { - //if(isDebug()) System.out.printf("%s: found a non-ghost volume: %s\n", this.getClass().getSimpleName(), mother.getName()); - return mother; - } - } - - - public ILogicalVolume getVolume() { - return volume; - } - protected void setVolume(ILogicalVolume volume) { - this.volume = volume; - } - protected Box getBox() { - return box; - } - protected void setBox(Box b) { - box = b; - } - protected ITranslation3D getPos() { - return pos; - } - protected void setPos(ITranslation3D iTranslation3D) { - this.pos = iTranslation3D; - } - protected IRotation3D getRot() { - return rot; - } - protected void setRot(IRotation3D iRotation3D) { - this.rot = iRotation3D; - } - public JavaSurveyVolume getMother() { - return mother; - } - protected void setMother(JavaSurveyVolume mother) { - this.mother = mother; - } - public IPhysicalVolume getPhysVolume() { - return physVolume; - } - protected void setPhysVolume(PhysicalVolume physVolume) { - this.physVolume = physVolume; - } - - public List<JavaSurveyVolume> getDaughters() { - return daughters; - } - - protected void addDaughter(JavaSurveyVolume o) { - getDaughters().add(o); - } - - public int getComponentId() { - return componentId; - } - - public void setComponentId(int componentId) { - this.componentId = componentId; - } - - public String toString() { - String s = "JavaBaseGeometry " + getName() + "\n"; - if(getPos()!=null && getRot()!=null) { - s += "Position: " + getPos().toString() + "\n"; - s += "Rotation: " + getRot().toString() + "\n"; - } else { - s+= " - no position/rotation info -\n"; - } - return s; - } + System.out.printf("%s: rot %s\n", this.getClass().getSimpleName(), getRot().toString()); + + } + + } + + /** + * Find the first non-ghost volume among parents. + * @return mother object + */ + public JavaSurveyVolume getPhysMother() { + //if(isDebug()) System.out.printf("%s: finding physical mother to %s\n", this.getClass().getSimpleName(), getName()); + if(mother==null) throw new RuntimeException("Trying to get phys mother but there is no mother!"); + if(mother instanceof JavaGhostSurveyVolume) { + return mother.getPhysMother(); + } else { + //if(isDebug()) System.out.printf("%s: found a non-ghost volume: %s\n", this.getClass().getSimpleName(), mother.getName()); + return mother; + } + } + + + public ILogicalVolume getVolume() { + return volume; + } + protected void setVolume(ILogicalVolume volume) { + this.volume = volume; + } + protected Box getBox() { + return box; + } + protected void setBox(Box b) { + box = b; + } + protected ITranslation3D getPos() { + return pos; + } + protected void setPos(ITranslation3D iTranslation3D) { + this.pos = iTranslation3D; + } + protected IRotation3D getRot() { + return rot; + } + protected void setRot(IRotation3D iRotation3D) { + this.rot = iRotation3D; + } + public JavaSurveyVolume getMother() { + return mother; + } + protected void setMother(JavaSurveyVolume mother) { + this.mother = mother; + } + public IPhysicalVolume getPhysVolume() { + return physVolume; + } + protected void setPhysVolume(PhysicalVolume physVolume) { + this.physVolume = physVolume; + } + + public List<JavaSurveyVolume> getDaughters() { + return daughters; + } + + protected void addDaughter(JavaSurveyVolume o) { + getDaughters().add(o); + } + + public int getComponentId() { + return componentId; + } + + public void setComponentId(int componentId) { + this.componentId = componentId; + } + + public String toString() { + String s = "JavaBaseGeometry " + getName() + "\n"; + if(getPos()!=null && getRot()!=null) { + s += "Position: " + getPos().toString() + "\n"; + s += "Rotation: " + getRot().toString() + "\n"; + } else { + s+= " - no position/rotation info -\n"; + } + return s; + } } Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/LCDDGhostSurveyVolume.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/LCDDGhostSurveyVolume.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/LCDDGhostSurveyVolume.java Wed Mar 9 11:43:24 2016 @@ -10,20 +10,20 @@ */ public class LCDDGhostSurveyVolume extends LCDDSurveyVolume { - - - /** - * Initialize with base and mother. This is typically for a reference geometry object - * that is used for referencing coordinate systems but that doesn't have a volume itself. - * @param base - object used to get geometry definitions - * @param mother - mother LCDD object - */ - public LCDDGhostSurveyVolume(SurveyVolume base, LCDDSurveyVolume mother) { - super(base); - if(isDebug()) System.out.printf("%s: constructing LCDD ghost object %s with mother %s\n", this.getClass().getSimpleName(),base.getName(),mother==null?"null":mother.getName()); - setMother(mother); - mother.addDaughter(this); - if(isDebug()) System.out.printf("%s: DONE constructing LCDD object %s\n", this.getClass().getSimpleName(),base.getName()); - } - + + + /** + * Initialize with base and mother. This is typically for a reference geometry object + * that is used for referencing coordinate systems but that doesn't have a volume itself. + * @param base - object used to get geometry definitions + * @param mother - mother LCDD object + */ + public LCDDGhostSurveyVolume(SurveyVolume base, LCDDSurveyVolume mother) { + super(base); + if(isDebug()) System.out.printf("%s: constructing LCDD ghost object %s with mother %s\n", this.getClass().getSimpleName(),base.getName(),mother==null?"null":mother.getName()); + setMother(mother); + mother.addDaughter(this); + if(isDebug()) System.out.printf("%s: DONE constructing LCDD object %s\n", this.getClass().getSimpleName(),base.getName()); + } + } Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/LCDDSurveyVolume.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/LCDDSurveyVolume.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/LCDDSurveyVolume.java Wed Mar 9 11:43:24 2016 @@ -25,233 +25,233 @@ * @author Per Hansson Adrian <[log in to unmask]> */ public class LCDDSurveyVolume extends SurveyVolumeImpl { - Box box= null; - Volume volume = null; - private Position pos = null; - private Rotation rot = null; - private PhysVol physVolume = null; - LCDD lcdd = null; - private LCDDSurveyVolume mother = null; - protected Map<String,Integer> physVolId = null; - public List<LCDDSurveyVolume> daughters = new ArrayList<LCDDSurveyVolume>(); - /** - * Default constructor - * @param surveyVolume - core geometry definitions - */ - public LCDDSurveyVolume(SurveyVolume surveyVolume) { - super(surveyVolume); - } - - /** - * Initialize this object with a known volume and no mother. Typically the world volume would use this. - * @param surveyVolume - core geometry definitions - * @param vol - given volume - */ - public LCDDSurveyVolume(SurveyVolume surveyVolume, Volume volume) { - super(surveyVolume); - if(isDebug()) System.out.printf("%s: constructing LCDD object %s with volume name %s\n", this.getClass().getSimpleName(),surveyVolume.getName(),volume.getName()); - setVolume(volume); - if(isDebug()) System.out.printf("%s: DONE constructing LCDD object %s\n", this.getClass().getSimpleName(),surveyVolume.getName()); - Hep3Vector lcdd_rot_angles = TransformationUtils.getCardanAngles(surveyVolume.getCoord().v(), surveyVolume.getCoord().w(), new BasicHep3Vector(0,1,0),new BasicHep3Vector(0,0,1)); - setPos(new Position(getName() + "_position", 0, 0, 0)); - setRot(new Rotation(getName() + "_rotation",lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z())); - if(isDebug()) System.out.printf("%s: DONE %s\n", this.getClass().getSimpleName(),surveyVolume.getName()); - } - - /** - * Interface to the LCDD converter geometry for the geometry definition. - * @param surveyVolume - core geometry definition - * @param lcdd - lcdd file - * @param mother - reference to mother LCDD definition - */ - public LCDDSurveyVolume(SurveyVolume surveyVolume, LCDD lcdd, LCDDSurveyVolume mother) { - super(surveyVolume); - if(isDebug()) System.out.printf("%s: constructing LCDD object %s with mother %s\n", this.getClass().getSimpleName(),surveyVolume.getName(),mother==null?"null":mother.getName()); - this.lcdd = lcdd; - setMother(mother); - mother.addDaughter(this); - buildBox(); - buildVolume(); - setPositionAndRotation(surveyVolume); - //buildPhysVolume(mother); - if(isDebug()) System.out.printf("%s: DONE constructing LCDD object %s\n", this.getClass().getSimpleName(),surveyVolume.getName()); - } - - - public void buildPhysVolume() { - - if(isDebug()) System.out.printf("%s: build phys volume for %s with mother %s and physical mother %s\n", this.getClass().getSimpleName(),getName(),getMother().getName(),getPhysMother().getName()); - LCDDSurveyVolume physMother = getPhysMother(); - setPhysVolume(new PhysVol(volume, physMother.getVolume(), getPos(), getRot())); - //if(isDebug()) System.out.printf("%s: build phys volume for %s\n", this.getClass().getSimpleName(),getName()); - //setPhysVolume(new PhysVol(volume, getMother().getVolume(), getPos(), getRot())); - } - public void buildBox() { - if(isDebug()) System.out.printf("%s: build box for %s\n", getClass().getSimpleName(),getName()); - setBox(new Box(getName() + "Box", getBoxDim().x(), getBoxDim().y(), getBoxDim().z())); - } - public void buildVolume() { - if(isDebug()) System.out.printf("%s: build volume for %s with material %s\n", this.getClass().getSimpleName(),getName(),getMaterial()); - try { - Material mat = lcdd.getMaterial(getMaterial()); - setVolume(new Volume(getName() + "_volume", box, mat)); - } catch (JDOMException e) { - e.printStackTrace(); - } - } - - - public void setPositionAndRotation(SurveyVolume base) { - if(isDebug()) System.out.printf("%s: set position and rotation for volume %s\n", this.getClass().getSimpleName(),getName()); - - // NOTE: - // This sets position and reference w.r.t. mother coordinate system. - // If I'm not building that volume this will be wrong. - // TODO Similar to in the JAVA converter this should be something like the physical mother. - - if(base.getMother()==null) throw new RuntimeException("trying to set coordinates w/o mother defined for "+base.getName()); - - // Vector from origin to center of box locally - Hep3Vector box_center_base_local = base.getCenter(); - - //translate to the mother coordinate system - LCDDSurveyVolume physMother = getPhysMother(); - if(isDebug()) System.out.printf("%s: physical mother to transform to is %s; find the transform to it\n", this.getClass().getSimpleName(),physMother.getName()); - Transform3D trf = HPSTrackerBuilder.getTransform(base.getCoord().getTransformation(),base.getMother(),physMother.getName()); - if(isDebug()) System.out.printf("%s: found transform to physical mother \n%s\n\n", this.getClass().getSimpleName(),trf.toString()); - - // find the position of the center in the physical mother coord - Hep3Vector box_center_base = trf.transformed(box_center_base_local); - - // find the position of the center of the box in the mother coordinate system, make sure to use the physical mother coordinates - if(isDebug()) System.out.printf("%s: find center of box in physical mother coord %s \n", this.getClass().getSimpleName(),physMother.getName()); - // hack since my getTransform function needs a mother TODO Fix this! - SurveyVolume gm = base; - if(isDebug()) System.out.printf("%s: look for physical mother %s starting from mother %s \n", this.getClass().getSimpleName(),physMother.getName(),gm.getMother()!=null?gm.getMother().getName():"-- no mother --"); - while((gm=gm.getMother()).getName()!=physMother.getName()) { - if(isDebug()) System.out.printf("%s: gm is %s \n", this.getClass().getSimpleName(),gm.getName()); - //gm = gm.getMother(); - } - if(isDebug()) System.out.printf("%s: found physical mother %s with center at %s \n", this.getClass().getSimpleName(),gm.getName(), gm.getCenter()); - - Hep3Vector mother_center = gm.getCenter(); - - // find the position of the center in the mother coord - Hep3Vector box_center = VecOp.sub(box_center_base, mother_center); - - //Find LCDD Euler rotation angles from coordinate system unit vectors - //Note that this has to be rotation wrt to physical mother and not just mother as normally is the case - if(isDebug()) System.out.printf("%s: find LCDD Cardan rotation angles - need to find mother to physical mother transform \n", this.getClass().getSimpleName(),physMother.getName()); - Hep3Vector base_u = base.getCoord().u(); - Hep3Vector base_v = base.getCoord().v(); - Hep3Vector base_w = base.getCoord().w(); + Box box= null; + Volume volume = null; + private Position pos = null; + private Rotation rot = null; + private PhysVol physVolume = null; + LCDD lcdd = null; + private LCDDSurveyVolume mother = null; + protected Map<String,Integer> physVolId = null; + public List<LCDDSurveyVolume> daughters = new ArrayList<LCDDSurveyVolume>(); + /** + * Default constructor + * @param surveyVolume - core geometry definitions + */ + public LCDDSurveyVolume(SurveyVolume surveyVolume) { + super(surveyVolume); + } + + /** + * Initialize this object with a known volume and no mother. Typically the world volume would use this. + * @param surveyVolume - core geometry definitions + * @param vol - given volume + */ + public LCDDSurveyVolume(SurveyVolume surveyVolume, Volume volume) { + super(surveyVolume); + if(isDebug()) System.out.printf("%s: constructing LCDD object %s with volume name %s\n", this.getClass().getSimpleName(),surveyVolume.getName(),volume.getName()); + setVolume(volume); + if(isDebug()) System.out.printf("%s: DONE constructing LCDD object %s\n", this.getClass().getSimpleName(),surveyVolume.getName()); + Hep3Vector lcdd_rot_angles = TransformationUtils.getCardanAngles(surveyVolume.getCoord().v(), surveyVolume.getCoord().w(), new BasicHep3Vector(0,1,0),new BasicHep3Vector(0,0,1)); + setPos(new Position(getName() + "_position", 0, 0, 0)); + setRot(new Rotation(getName() + "_rotation",lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z())); + if(isDebug()) System.out.printf("%s: DONE %s\n", this.getClass().getSimpleName(),surveyVolume.getName()); + } + + /** + * Interface to the LCDD converter geometry for the geometry definition. + * @param surveyVolume - core geometry definition + * @param lcdd - lcdd file + * @param mother - reference to mother LCDD definition + */ + public LCDDSurveyVolume(SurveyVolume surveyVolume, LCDD lcdd, LCDDSurveyVolume mother) { + super(surveyVolume); + if(isDebug()) System.out.printf("%s: constructing LCDD object %s with mother %s\n", this.getClass().getSimpleName(),surveyVolume.getName(),mother==null?"null":mother.getName()); + this.lcdd = lcdd; + setMother(mother); + mother.addDaughter(this); + buildBox(); + buildVolume(); + setPositionAndRotation(surveyVolume); + //buildPhysVolume(mother); + if(isDebug()) System.out.printf("%s: DONE constructing LCDD object %s\n", this.getClass().getSimpleName(),surveyVolume.getName()); + } + + + public void buildPhysVolume() { + + if(isDebug()) System.out.printf("%s: build phys volume for %s with mother %s and physical mother %s\n", this.getClass().getSimpleName(),getName(),getMother().getName(),getPhysMother().getName()); + LCDDSurveyVolume physMother = getPhysMother(); + setPhysVolume(new PhysVol(volume, physMother.getVolume(), getPos(), getRot())); + //if(isDebug()) System.out.printf("%s: build phys volume for %s\n", this.getClass().getSimpleName(),getName()); + //setPhysVolume(new PhysVol(volume, getMother().getVolume(), getPos(), getRot())); + } + public void buildBox() { + if(isDebug()) System.out.printf("%s: build box for %s\n", getClass().getSimpleName(),getName()); + setBox(new Box(getName() + "Box", getBoxDim().x(), getBoxDim().y(), getBoxDim().z())); + } + public void buildVolume() { + if(isDebug()) System.out.printf("%s: build volume for %s with material %s\n", this.getClass().getSimpleName(),getName(),getMaterial()); + try { + Material mat = lcdd.getMaterial(getMaterial()); + setVolume(new Volume(getName() + "_volume", box, mat)); + } catch (JDOMException e) { + e.printStackTrace(); + } + } + + + public void setPositionAndRotation(SurveyVolume base) { + if(isDebug()) System.out.printf("%s: set position and rotation for volume %s\n", this.getClass().getSimpleName(),getName()); + + // NOTE: + // This sets position and reference w.r.t. mother coordinate system. + // If I'm not building that volume this will be wrong. + // TODO Similar to in the JAVA converter this should be something like the physical mother. + + if(base.getMother()==null) throw new RuntimeException("trying to set coordinates w/o mother defined for "+base.getName()); + + // Vector from origin to center of box locally + Hep3Vector box_center_base_local = base.getCenter(); + + //translate to the mother coordinate system + LCDDSurveyVolume physMother = getPhysMother(); + if(isDebug()) System.out.printf("%s: physical mother to transform to is %s; find the transform to it\n", this.getClass().getSimpleName(),physMother.getName()); + Transform3D trf = HPSTrackerBuilder.getTransform(base.getCoord().getTransformation(),base.getMother(),physMother.getName()); + if(isDebug()) System.out.printf("%s: found transform to physical mother \n%s\n\n", this.getClass().getSimpleName(),trf.toString()); + + // find the position of the center in the physical mother coord + Hep3Vector box_center_base = trf.transformed(box_center_base_local); + + // find the position of the center of the box in the mother coordinate system, make sure to use the physical mother coordinates + if(isDebug()) System.out.printf("%s: find center of box in physical mother coord %s \n", this.getClass().getSimpleName(),physMother.getName()); + // hack since my getTransform function needs a mother TODO Fix this! + SurveyVolume gm = base; + if(isDebug()) System.out.printf("%s: look for physical mother %s starting from mother %s \n", this.getClass().getSimpleName(),physMother.getName(),gm.getMother()!=null?gm.getMother().getName():"-- no mother --"); + while((gm=gm.getMother()).getName()!=physMother.getName()) { + if(isDebug()) System.out.printf("%s: gm is %s \n", this.getClass().getSimpleName(),gm.getName()); + //gm = gm.getMother(); + } + if(isDebug()) System.out.printf("%s: found physical mother %s with center at %s \n", this.getClass().getSimpleName(),gm.getName(), gm.getCenter()); + + Hep3Vector mother_center = gm.getCenter(); + + // find the position of the center in the mother coord + Hep3Vector box_center = VecOp.sub(box_center_base, mother_center); + + //Find LCDD Euler rotation angles from coordinate system unit vectors + //Note that this has to be rotation wrt to physical mother and not just mother as normally is the case + if(isDebug()) System.out.printf("%s: find LCDD Cardan rotation angles - need to find mother to physical mother transform \n", this.getClass().getSimpleName(),physMother.getName()); + Hep3Vector base_u = base.getCoord().u(); + Hep3Vector base_v = base.getCoord().v(); + Hep3Vector base_w = base.getCoord().w(); if(isDebug()) System.out.printf("%s: unit vectors in mother coord: %s, %s, %s\n", this.getClass().getSimpleName(),base_u.toString(),base_v.toString(),base_w.toString()); - Hep3Vector unit_u = new BasicHep3Vector(1,0,0); - Hep3Vector unit_v = new BasicHep3Vector(0,1,0); - Hep3Vector unit_w = new BasicHep3Vector(0,0,1); - if(!base.getMother().getName().equals(physMother.getName())) { - if(isDebug()) System.out.printf("%s: Need to get unit vectors in physical mother %s coord system\n", this.getClass().getSimpleName(),physMother.getName()); + Hep3Vector unit_u = new BasicHep3Vector(1,0,0); + Hep3Vector unit_v = new BasicHep3Vector(0,1,0); + Hep3Vector unit_w = new BasicHep3Vector(0,0,1); + if(!base.getMother().getName().equals(physMother.getName())) { + if(isDebug()) System.out.printf("%s: Need to get unit vectors in physical mother %s coord system\n", this.getClass().getSimpleName(),physMother.getName()); Transform3D trf_mother = HPSTrackerBuilder.getTransform(base.getMother().getCoord().getTransformation(),base.getMother().getMother(),physMother.getName()); if(isDebug()) System.out.printf("%s: found transform from mother to physical mother \n%s\n", this.getClass().getSimpleName(),trf_mother.toString()); - //unit_u = VecOp.unit(trf_mother.rotated(unit_u)); - //unit_v = VecOp.unit(trf_mother.rotated(unit_v)); - //unit_w = VecOp.unit(trf_mother.rotated(unit_w)); - base_u = VecOp.unit(trf_mother.rotated(base_u)); + //unit_u = VecOp.unit(trf_mother.rotated(unit_u)); + //unit_v = VecOp.unit(trf_mother.rotated(unit_v)); + //unit_w = VecOp.unit(trf_mother.rotated(unit_w)); + base_u = VecOp.unit(trf_mother.rotated(base_u)); base_v = VecOp.unit(trf_mother.rotated(base_v)); base_w = VecOp.unit(trf_mother.rotated(base_w)); - } else { - if(isDebug()) System.out.printf("%s: mother and physical mother is the same so unit vectors didn't change\n",getClass().getSimpleName()); - } - - if(isDebug()) { - if(isDebug()) System.out.printf("%s: final unit vectors to get Cardan angles from : \n%s, %s, %s -> %s, %s, %s \n", - this.getClass().getSimpleName(), - base_u.toString(),base_v.toString(),base_w.toString(), - unit_u.toString(),unit_v.toString(),unit_w.toString()); - //System.out.printf("%s: unit vectors u %s v %s w %s\n", this.getClass().getSimpleName(),base.getCoord().u().toString(),base.getCoord().v().toString(),base.getCoord().w().toString()); - } + } else { + if(isDebug()) System.out.printf("%s: mother and physical mother is the same so unit vectors didn't change\n",getClass().getSimpleName()); + } + + if(isDebug()) { + if(isDebug()) System.out.printf("%s: final unit vectors to get Cardan angles from : \n%s, %s, %s -> %s, %s, %s \n", + this.getClass().getSimpleName(), + base_u.toString(),base_v.toString(),base_w.toString(), + unit_u.toString(),unit_v.toString(),unit_w.toString()); + //System.out.printf("%s: unit vectors u %s v %s w %s\n", this.getClass().getSimpleName(),base.getCoord().u().toString(),base.getCoord().v().toString(),base.getCoord().w().toString()); + } Hep3Vector lcdd_rot_angles = TransformationUtils.getCardanAngles(base_u, base_v, base_w, unit_u, unit_v, unit_w); - - // Create the LCDD position and rotation - setPos(new Position(getName() + "_position",box_center.x(), box_center.y(), box_center.z())); - setRot(new Rotation(getName() + "_rotation",lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z())); - - if(isDebug()) { - System.out.printf("%s: SurveyVolume information for %s:\n", this.getClass().getSimpleName(), base.getName()); + + // Create the LCDD position and rotation + setPos(new Position(getName() + "_position",box_center.x(), box_center.y(), box_center.z())); + setRot(new Rotation(getName() + "_rotation",lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z())); + + if(isDebug()) { + System.out.printf("%s: SurveyVolume information for %s:\n", this.getClass().getSimpleName(), base.getName()); System.out.printf("%s: box_center_base_local %s\n", this.getClass().getSimpleName(), box_center_base_local.toString()); - System.out.printf("%s: box_center_base %s\n", this.getClass().getSimpleName(), box_center_base.toString()); - System.out.printf("%s: mother center %s\n", this.getClass().getSimpleName(), mother_center.toString()); - System.out.printf("%s: box_center %s\n", this.getClass().getSimpleName(), box_center.toString()); - System.out.printf("%s: pos %s\n", this.getClass().getSimpleName(), getPos().toString()); - System.out.printf("%s: euler %s\n", this.getClass().getSimpleName(), lcdd_rot_angles.toString()); + System.out.printf("%s: box_center_base %s\n", this.getClass().getSimpleName(), box_center_base.toString()); + System.out.printf("%s: mother center %s\n", this.getClass().getSimpleName(), mother_center.toString()); + System.out.printf("%s: box_center %s\n", this.getClass().getSimpleName(), box_center.toString()); + System.out.printf("%s: pos %s\n", this.getClass().getSimpleName(), getPos().toString()); + System.out.printf("%s: euler %s\n", this.getClass().getSimpleName(), lcdd_rot_angles.toString()); System.out.printf("%s: rot %s\n", this.getClass().getSimpleName(), getRot().toString()); - - //calculate the position in tracking volume separately as a xcheck - Hep3Vector box_center_tracking_xcheck = HPSTrackerBuilder.transformToTracking(box_center_base_local, base); - System.out.printf("%s: box_center_tracking_xcheck %s (for %s)\n", this.getClass().getSimpleName(), box_center_tracking_xcheck.toString(), base.getName()); - } - - } - /** - * Find the first non-ghost volume among parents. - * @return mother object - */ - public LCDDSurveyVolume getPhysMother() { - //if(isDebug()) System.out.printf("%s: finding physical mother to %s\n", this.getClass().getSimpleName(), getName()); - if(mother==null) throw new RuntimeException("Trying to get phys mother but there is no mother!"); - if(mother instanceof LCDDGhostSurveyVolume) { - return mother.getPhysMother(); - } else { - //if(isDebug()) System.out.printf("%s: found a non-ghost volume: %s\n", this.getClass().getSimpleName(), mother.getName()); - return mother; - } - } - - public Volume getVolume() { - return volume; - } - public void setVolume(Volume volume) { - this.volume = volume; - } - public Box getBox() { - return box; - } - public void setBox(Box b) { - box = b; - } - public Position getPos() { - return pos; - } - public void setPos(Position pos) { - this.pos = pos; - } - public Rotation getRot() { - return rot; - } - public void setRot(Rotation rot) { - this.rot = rot; - } - public LCDDSurveyVolume getMother() { - return mother; - } - public void setMother(LCDDSurveyVolume mother) { - this.mother = mother; - } - public PhysVol getPhysVolume() { - return physVolume; - } - public void setPhysVolume(PhysVol physVolume) { - this.physVolume = physVolume; - } - public List<LCDDSurveyVolume> getDaughters() { - return daughters; - } - public void addDaughter(LCDDSurveyVolume o) { - getDaughters().add(o); - } - public String toString() { + + //calculate the position in tracking volume separately as a xcheck + Hep3Vector box_center_tracking_xcheck = HPSTrackerBuilder.transformToTracking(box_center_base_local, base); + System.out.printf("%s: box_center_tracking_xcheck %s (for %s)\n", this.getClass().getSimpleName(), box_center_tracking_xcheck.toString(), base.getName()); + } + + } + /** + * Find the first non-ghost volume among parents. + * @return mother object + */ + public LCDDSurveyVolume getPhysMother() { + //if(isDebug()) System.out.printf("%s: finding physical mother to %s\n", this.getClass().getSimpleName(), getName()); + if(mother==null) throw new RuntimeException("Trying to get phys mother but there is no mother!"); + if(mother instanceof LCDDGhostSurveyVolume) { + return mother.getPhysMother(); + } else { + //if(isDebug()) System.out.printf("%s: found a non-ghost volume: %s\n", this.getClass().getSimpleName(), mother.getName()); + return mother; + } + } + + public Volume getVolume() { + return volume; + } + public void setVolume(Volume volume) { + this.volume = volume; + } + public Box getBox() { + return box; + } + public void setBox(Box b) { + box = b; + } + public Position getPos() { + return pos; + } + public void setPos(Position pos) { + this.pos = pos; + } + public Rotation getRot() { + return rot; + } + public void setRot(Rotation rot) { + this.rot = rot; + } + public LCDDSurveyVolume getMother() { + return mother; + } + public void setMother(LCDDSurveyVolume mother) { + this.mother = mother; + } + public PhysVol getPhysVolume() { + return physVolume; + } + public void setPhysVolume(PhysVol physVolume) { + this.physVolume = physVolume; + } + public List<LCDDSurveyVolume> getDaughters() { + return daughters; + } + public void addDaughter(LCDDSurveyVolume o) { + getDaughters().add(o); + } + public String toString() { String s = getClass().getSimpleName() +": " + getName() + "\n"; if(getPos()!=null && getRot()!=null) { double x = Double.valueOf(getPos().getAttributeValue("x")); Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/MilleParameter.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/MilleParameter.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/MilleParameter.java Wed Mar 9 11:43:24 2016 @@ -9,113 +9,113 @@ public class MilleParameter { private static double corrScaleFactor = -1.; - private int id; - private double value; - private double presigma; - private static final Map<Integer,String> dMap; - private static final Map<Integer,String> tMap; - private static final Map<Integer,String> hMap; - static { - dMap = new HashMap<Integer,String>(); - dMap.put(1, "x");dMap.put(2, "y"); dMap.put(3, "z"); - tMap = new HashMap<Integer,String>(); - tMap.put(1, "");tMap.put(2, "r"); - hMap = new HashMap<Integer,String>(); - hMap.put(1, "t");hMap.put(2, "b"); - } - public static final int half_offset = 10000; - public static final int type_offset = 1000; - public static final int dimension_offset = 100; - public static enum Type { - TRANSLATION(1), ROTATION(2); - private int value; - private Type(int value) {this.value = value;} - public int getType() {return this.value;} - }; - - public MilleParameter(String line) { - String[] vals = StringUtils.split(line);// line.split("\\s+"); - if(vals.length <3) { - System.out.println("this line is ill-formatted (" + vals.length + ")"); - System.out.println(line); - System.exit(1); - } - try { - //for(String v : vals) System.out.println("\"" + v + "\""); - setId(Integer.parseInt(vals[0])); - setValue( corrScaleFactor * Double.parseDouble(vals[1]) ); - setPresigma(Double.parseDouble(vals[2])); - - } catch (NumberFormatException e) { - System.out.println(vals[0] + " " + vals[1] + " " + vals[2]); - throw new RuntimeException("problem parsing string ", e); - } - } - - public MilleParameter(int id, double value, double presigma) { - setId(id); - setValue(value); - setPresigma(presigma); - } - - public String getXMLName() { - String d = dMap.get(getDim()); - String t = tMap.get(getType()); - String h = hMap.get(getHalf()); - int s = getSensor(); - return String.format("%s%s%d%s_align", t,d,s,h); - - } + private int id; + private double value; + private double presigma; + private static final Map<Integer,String> dMap; + private static final Map<Integer,String> tMap; + private static final Map<Integer,String> hMap; + static { + dMap = new HashMap<Integer,String>(); + dMap.put(1, "x");dMap.put(2, "y"); dMap.put(3, "z"); + tMap = new HashMap<Integer,String>(); + tMap.put(1, "");tMap.put(2, "r"); + hMap = new HashMap<Integer,String>(); + hMap.put(1, "t");hMap.put(2, "b"); + } + public static final int half_offset = 10000; + public static final int type_offset = 1000; + public static final int dimension_offset = 100; + public static enum Type { + TRANSLATION(1), ROTATION(2); + private int value; + private Type(int value) {this.value = value;} + public int getType() {return this.value;} + }; + + public MilleParameter(String line) { + String[] vals = StringUtils.split(line);// line.split("\\s+"); + if(vals.length <3) { + System.out.println("this line is ill-formatted (" + vals.length + ")"); + System.out.println(line); + System.exit(1); + } + try { + //for(String v : vals) System.out.println("\"" + v + "\""); + setId(Integer.parseInt(vals[0])); + setValue( corrScaleFactor * Double.parseDouble(vals[1]) ); + setPresigma(Double.parseDouble(vals[2])); + + } catch (NumberFormatException e) { + System.out.println(vals[0] + " " + vals[1] + " " + vals[2]); + throw new RuntimeException("problem parsing string ", e); + } + } + + public MilleParameter(int id, double value, double presigma) { + setId(id); + setValue(value); + setPresigma(presigma); + } + + public String getXMLName() { + String d = dMap.get(getDim()); + String t = tMap.get(getType()); + String h = hMap.get(getHalf()); + int s = getSensor(); + return String.format("%s%s%d%s_align", t,d,s,h); + + } - public int getDim() { - int h = (int) (getHalf() * half_offset); - int t = (int) (getType() * type_offset); - return (int) Math.floor((id- h -t)/(double)dimension_offset); - } - - public int getSensor() { - int h = (int) (getHalf() * half_offset); - int t = (int) (getType() * type_offset); - int d = (int) (getDim() * dimension_offset); - return (id - h - t -d); - } + public int getDim() { + int h = (int) (getHalf() * half_offset); + int t = (int) (getType() * type_offset); + return (int) Math.floor((id- h -t)/(double)dimension_offset); + } + + public int getSensor() { + int h = (int) (getHalf() * half_offset); + int t = (int) (getType() * type_offset); + int d = (int) (getDim() * dimension_offset); + return (id - h - t -d); + } - public int getType() { - int h = (int) (getHalf() * half_offset); - return (int) Math.floor((id -h)/(double)type_offset); - } + public int getType() { + int h = (int) (getHalf() * half_offset); + return (int) Math.floor((id -h)/(double)type_offset); + } - public int getHalf() { - return (int)Math.floor(id/(double)half_offset); - } + public int getHalf() { + return (int)Math.floor(id/(double)half_offset); + } - public int getId() { - return id; - } + public int getId() { + return id; + } - public void setId(int id) { - this.id = id; - } + public void setId(int id) { + this.id = id; + } - public double getValue() { - return value; - } + public double getValue() { + return value; + } - public void setValue(double value) { - this.value = value; - } + public void setValue(double value) { + this.value = value; + } - public double getPresigma() { - return presigma; - } + public double getPresigma() { + return presigma; + } - public void setPresigma(double presigma) { - this.presigma = presigma; - } - - public String toString() { - return String.format("Milleparameter id=%d half=%d type=%d dim=%d sensor=%d value=%f", this.getId(), this.getHalf(), this.getType(), this.getDim(), this.getSensor(), this.getValue()); - } + public void setPresigma(double presigma) { + this.presigma = presigma; + } + + public String toString() { + return String.format("Milleparameter id=%d half=%d type=%d dim=%d sensor=%d value=%f", this.getId(), this.getHalf(), this.getType(), this.getDim(), this.getSensor(), this.getValue()); + } } Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyCoordinateSystem.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyCoordinateSystem.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyCoordinateSystem.java Wed Mar 9 11:43:24 2016 @@ -13,26 +13,26 @@ import org.lcsim.detector.Translation3D; /** - * Class describing a simple coordinate system used to define the {@link SurveyVolume}. - * - * @author Per Hansson Adrian <[log in to unmask]> - */ - public class SurveyCoordinateSystem { - private final boolean debug = false; - private Hep3Vector origin; - private Hep3Vector u; - private Hep3Vector v; - private Hep3Vector w; + * Class describing a simple coordinate system used to define the {@link SurveyVolume}. + * + * @author Per Hansson Adrian <[log in to unmask]> + */ + public class SurveyCoordinateSystem { + private final boolean debug = false; + private Hep3Vector origin; + private Hep3Vector u; + private Hep3Vector v; + private Hep3Vector w; -// public SurveyCoordinateSystem(Hep3Vector org, Hep3Vector unit_x, Hep3Vector unit_y, Hep3Vector unit_z) { -// origin = org; -// u = unit_x; -// v = unit_y; -// w = unit_z; -// } +// public SurveyCoordinateSystem(Hep3Vector org, Hep3Vector unit_x, Hep3Vector unit_y, Hep3Vector unit_z) { +// origin = org; +// u = unit_x; +// v = unit_y; +// w = unit_z; +// } - - public SurveyCoordinateSystem(Hep3Vector ball, Hep3Vector vee, Hep3Vector flat) { + + public SurveyCoordinateSystem(Hep3Vector ball, Hep3Vector vee, Hep3Vector flat) { origin = ball; Hep3Vector ball_to_vee = VecOp.sub(vee, ball); u = VecOp.unit(ball_to_vee); @@ -41,61 +41,61 @@ v = VecOp.cross(w, u); check(); } - - private void check() { - checkUnitLength(); - checkAngles(); - } + + private void check() { + checkUnitLength(); + checkAngles(); + } - private void checkUnitLength() { - if(u.magnitude()-1>0.00001 || v.magnitude()-1>0.00001 || v.magnitude()-1>0.00001) { - throw new RuntimeException("Error: the unit vectors of the coordinate system is ill-defined " + toString()); - } - } + private void checkUnitLength() { + if(u.magnitude()-1>0.00001 || v.magnitude()-1>0.00001 || v.magnitude()-1>0.00001) { + throw new RuntimeException("Error: the unit vectors of the coordinate system is ill-defined " + toString()); + } + } - private void checkAngles() { - if( (VecOp.dot(u, v)-1)>0.00001 || (VecOp.dot(u, w)-1)>0.00001 || (VecOp.dot(v, w)-1)>0.00001 ) { - throw new RuntimeException("Error: the angles in coordinate system is ill-defined " + toString()); - } - } - - - /** - * Transform this coordinate system to another one. - * @param t - */ - public void transform(Transform3D t) { - Transform3D t_this = getTransformation(); - Hep3Vector v = t_this.getTranslation().getTranslationVector(); - Hep3Vector vrot = t.rotated(v); - Hep3Vector vrottrans = t.translated(vrot); - origin = vrottrans; + private void checkAngles() { + if( (VecOp.dot(u, v)-1)>0.00001 || (VecOp.dot(u, w)-1)>0.00001 || (VecOp.dot(v, w)-1)>0.00001 ) { + throw new RuntimeException("Error: the angles in coordinate system is ill-defined " + toString()); + } + } + + + /** + * Transform this coordinate system to another one. + * @param t + */ + public void transform(Transform3D t) { + Transform3D t_this = getTransformation(); + Hep3Vector v = t_this.getTranslation().getTranslationVector(); + Hep3Vector vrot = t.rotated(v); + Hep3Vector vrottrans = t.translated(vrot); + origin = vrottrans; rotate(t.getRotation()); //System.out.printf("monkey transform\n"); //System.out.printf("v %s\n",v.toString()); //System.out.printf("vrot %s\n",vrot.toString()); //System.out.printf("vrottrans %s\n",vrottrans.toString()); - check(); - } - - public void rotate(IRotation3D r) { - r.rotate(u); - r.rotate(v); - r.rotate(w); - } + check(); + } + + public void rotate(IRotation3D r) { + r.rotate(u); + r.rotate(v); + r.rotate(w); + } - public void translate(Hep3Vector translation) { - // update origin with local translation in u,v,w - //origin = VecOp.add(origin, translation); - translate(new Translation3D(translation)); - } + public void translate(Hep3Vector translation) { + // update origin with local translation in u,v,w + //origin = VecOp.add(origin, translation); + translate(new Translation3D(translation)); + } - public void translate(Translation3D t) { - origin = t.translated(getTransformation().getTranslation().getTranslationVector()); - } + public void translate(Translation3D t) { + origin = t.translated(getTransformation().getTranslation().getTranslationVector()); + } - - public void rotateApache(Rotation r) { + + public void rotateApache(Rotation r) { if(debug) System.out.printf("%s: apply apache rotation to this coord system\n%s\n", getClass().getSimpleName(),toString()); this.u = new BasicHep3Vector(r.applyTo(new Vector3D(u.v())).toArray()); this.v = new BasicHep3Vector(r.applyTo(new Vector3D(v.v())).toArray()); @@ -104,52 +104,52 @@ } public Hep3Vector origin() { - return origin; - } - public Hep3Vector u() { - return u; - } - public Hep3Vector v() { - return v; - } - public Hep3Vector w() { - return w; - } - public void u(Hep3Vector vec) { + return origin; + } + public Hep3Vector u() { + return u; + } + public Hep3Vector v() { + return v; + } + public Hep3Vector w() { + return w; + } + public void u(Hep3Vector vec) { u = vec; - } + } public void v(Hep3Vector vec) { v = vec; } public void w(Hep3Vector vec) { w = vec; } - + public String toString() { - String str = "origin " + origin.toString() + "\nu " + u.toString() + "\nv " + v.toString() + "\nw " + w.toString(); - return str; + String str = "origin " + origin.toString() + "\nu " + u.toString() + "\nv " + v.toString() + "\nw " + w.toString(); + return str; } - - - /** - * Find @ITransform3D to the coordinate system defined by the input. - * @return resulting 3D transform - */ - public Transform3D getTransformation() { - // Find the transform between the two frames - use transform classes here (not really needed) - Translation3D translation = new Translation3D(origin.x(), origin.y(), origin.z()); - //RotationGeant trackingToEnvelopeRotation = new RotationGeant(0, 0, 0); - Rotation3D rotation = new Rotation3D( - new BasicHep3Matrix( - u.x(),v.x(),w.x(), - u.y(),v.y(),w.y(), - u.z(),v.z(),w.z() - )); - Transform3D envelopeToSupportTransform = new Transform3D(translation, rotation); - return envelopeToSupportTransform; - } - - - - - } + + + /** + * Find @ITransform3D to the coordinate system defined by the input. + * @return resulting 3D transform + */ + public Transform3D getTransformation() { + // Find the transform between the two frames - use transform classes here (not really needed) + Translation3D translation = new Translation3D(origin.x(), origin.y(), origin.z()); + //RotationGeant trackingToEnvelopeRotation = new RotationGeant(0, 0, 0); + Rotation3D rotation = new Rotation3D( + new BasicHep3Matrix( + u.x(),v.x(),w.x(), + u.y(),v.y(),w.y(), + u.z(),v.z(),w.z() + )); + Transform3D envelopeToSupportTransform = new Transform3D(translation, rotation); + return envelopeToSupportTransform; + } + + + + + } Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolume.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolume.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolume.java Wed Mar 9 11:43:24 2016 @@ -20,66 +20,66 @@ * */ public abstract class SurveyVolume { - protected boolean debug = false; - private String name; - private String material = "Vacuum"; - private SurveyVolume mother = null; - protected List<SurveyVolume> referenceGeom = null; - private SurveyCoordinateSystem coord; - protected Hep3Vector ballPos; - protected Hep3Vector veePos; - protected Hep3Vector flatPos; - private Hep3Vector center; - private Hep3Vector boxDim; - private AlignmentCorrection alignmentCorrections; - - public SurveyVolume(String name, SurveyVolume m, AlignmentCorrection alignmentCorrection) { - setName(name); - setMother(m); - setAlignmentCorrection(alignmentCorrection); - } - - public SurveyVolume(String name, SurveyVolume m, AlignmentCorrection alignmentCorrection, SurveyVolume ref) { - setName(name); - setMother(m); - setAlignmentCorrection(alignmentCorrection); - addReferenceGeom(ref); - } - - public SurveyVolume(String name, SurveyVolume m, AlignmentCorrection alignmentCorrection, List<SurveyVolume> ref) { - setName(name); - setMother(m); - setAlignmentCorrection(alignmentCorrection); - addReferenceGeom(ref); - } - - protected abstract void setPos(); - protected abstract void setCenter(); - protected abstract void setBoxDim(); - - /** - * - * Initialize the volume. - * This needs to be called at the top level implementation of the {@link SurveyVolume} to properly setup - * the coordinate systems. It takes care of applying user supplied custom transformations and alignment corrections - * in the order given in the function below. That order must be preserved to get a uniform behavior. - * - */ - protected void init() { - if(debug) System.out.printf("%s: init SurveyVolume %s\n",this.getClass().getSimpleName(),getName()); + protected boolean debug = false; + private String name; + private String material = "Vacuum"; + private SurveyVolume mother = null; + protected List<SurveyVolume> referenceGeom = null; + private SurveyCoordinateSystem coord; + protected Hep3Vector ballPos; + protected Hep3Vector veePos; + protected Hep3Vector flatPos; + private Hep3Vector center; + private Hep3Vector boxDim; + private AlignmentCorrection alignmentCorrections; + + public SurveyVolume(String name, SurveyVolume m, AlignmentCorrection alignmentCorrection) { + setName(name); + setMother(m); + setAlignmentCorrection(alignmentCorrection); + } + + public SurveyVolume(String name, SurveyVolume m, AlignmentCorrection alignmentCorrection, SurveyVolume ref) { + setName(name); + setMother(m); + setAlignmentCorrection(alignmentCorrection); + addReferenceGeom(ref); + } + + public SurveyVolume(String name, SurveyVolume m, AlignmentCorrection alignmentCorrection, List<SurveyVolume> ref) { + setName(name); + setMother(m); + setAlignmentCorrection(alignmentCorrection); + addReferenceGeom(ref); + } + + protected abstract void setPos(); + protected abstract void setCenter(); + protected abstract void setBoxDim(); + + /** + * + * Initialize the volume. + * This needs to be called at the top level implementation of the {@link SurveyVolume} to properly setup + * the coordinate systems. It takes care of applying user supplied custom transformations and alignment corrections + * in the order given in the function below. That order must be preserved to get a uniform behavior. + * + */ + protected void init() { + if(debug) System.out.printf("%s: init SurveyVolume %s\n",this.getClass().getSimpleName(),getName()); setPos(); - setCoord(); - applyReferenceTransformation(); - setCenter(); - setBoxDim(); - applyGenericCoordinateSystemCorrections(); - applyLocalAlignmentCorrections(); - if(debug) { - //printCoordInfo(); - System.out.printf("%s: init of SurveyVolume %s DONE\n",this.getClass().getSimpleName(),getName()); - } - } - + setCoord(); + applyReferenceTransformation(); + setCenter(); + setBoxDim(); + applyGenericCoordinateSystemCorrections(); + applyLocalAlignmentCorrections(); + if(debug) { + //printCoordInfo(); + System.out.printf("%s: init of SurveyVolume %s DONE\n",this.getClass().getSimpleName(),getName()); + } + } + private void applySurvey(Element node) { @@ -378,254 +378,254 @@ * Apply a generic correction to the coordinate system of this volume. */ protected void applyGenericCoordinateSystemCorrections() { - //do nothing here unless overridden - - } - - /** - * Applies a user supplied reference transformation to the module. - * This is convenient as it allows for intermediary "virtual" mother volumes to be used - * in referencing a volume to it's physcial mother volume. - */ - protected void applyReferenceTransformation() { - - - if(referenceGeom!=null) { - - if(debug) System.out.printf("%s: apply reference transformation for %s\n",this.getClass().getSimpleName(),getName()); - - - if(debug) System.out.printf("%s: coord system before %d ref transformations:\n%s\n",this.getClass().getSimpleName(),referenceGeom.size(),getCoord().toString()); - - for(SurveyVolume ref : referenceGeom) { - - if(debug) { - System.out.printf("%s: coord system before ref %s transform:\n%s\n",this.getClass().getSimpleName(),ref.getName(),getCoord().toString()); - System.out.printf("%s: Ref %s coord\n%s\n",this.getClass().getSimpleName(), ref.getName(),ref.getCoord().toString()); - } - - getCoord().transform(ref.getCoord().getTransformation()); - - if(debug) System.out.printf("%s: coord system after ref %s transform:\n%s\n",this.getClass().getSimpleName(),ref.getName(),getCoord().toString()); - - } - - if(debug) System.out.printf("%s: coord system after ref transformations:\n%s\n",this.getClass().getSimpleName(),getCoord().toString()); - - } else { - - if(debug) System.out.printf("%s: no reference transformation exists for %s\n",this.getClass().getSimpleName(),getName()); - - } - - } - - /** - * Apply @link AlignmentCorrection to the volume if they are supplied. - * - */ - private void applyLocalAlignmentCorrections() { - - // Apply alignment corrections to local coordinate system that is already built - boolean debug_local = false; - if(this.coord==null) - throw new RuntimeException("no coordinate system was set before trying to apply alignment corrections."); - - if(alignmentCorrections!=null) { - - - if(alignmentCorrections.getNode()!=null) { - - if(debug_local || debug) System.out.printf("%s: Apply survey results to %s\n",this.getClass().getSimpleName(),this.getName()); - - applySurvey(alignmentCorrections.getNode()); - - if(debug_local || debug) System.out.printf("%s: DONE Apply survey results to %s\n",this.getClass().getSimpleName(),this.getName()); - - } - - - - - - if(debug_local || debug) System.out.printf("%s: Apply alignment corrections to %s\n",this.getClass().getSimpleName(),this.getName()); - - // translate - if(alignmentCorrections.getTranslation()!=null) { - - if(debug_local || debug) System.out.printf("%s: Apply local translation %s\n", this.getClass().getSimpleName(),alignmentCorrections.getTranslation().toString()); - - // rotate into mother coordinate system - Hep3Vector translation_mother = getCoord().getTransformation().rotated(alignmentCorrections.getTranslation()); - - if(debug_local || debug) System.out.printf("%s: after rotation apply translation %s to coordinate system\n", this.getClass().getSimpleName(),translation_mother.toString()); - - //apply translation - getCoord().translate(translation_mother); - - } else { - if(debug_local || debug) System.out.printf("%s: No translation to coordinate system\n", this.getClass().getSimpleName()); - } - - // rotate - if(alignmentCorrections.getRotation()!=null) { - + //do nothing here unless overridden + + } + + /** + * Applies a user supplied reference transformation to the module. + * This is convenient as it allows for intermediary "virtual" mother volumes to be used + * in referencing a volume to it's physcial mother volume. + */ + protected void applyReferenceTransformation() { + + + if(referenceGeom!=null) { + + if(debug) System.out.printf("%s: apply reference transformation for %s\n",this.getClass().getSimpleName(),getName()); + + + if(debug) System.out.printf("%s: coord system before %d ref transformations:\n%s\n",this.getClass().getSimpleName(),referenceGeom.size(),getCoord().toString()); + + for(SurveyVolume ref : referenceGeom) { + + if(debug) { + System.out.printf("%s: coord system before ref %s transform:\n%s\n",this.getClass().getSimpleName(),ref.getName(),getCoord().toString()); + System.out.printf("%s: Ref %s coord\n%s\n",this.getClass().getSimpleName(), ref.getName(),ref.getCoord().toString()); + } + + getCoord().transform(ref.getCoord().getTransformation()); + + if(debug) System.out.printf("%s: coord system after ref %s transform:\n%s\n",this.getClass().getSimpleName(),ref.getName(),getCoord().toString()); + + } + + if(debug) System.out.printf("%s: coord system after ref transformations:\n%s\n",this.getClass().getSimpleName(),getCoord().toString()); + + } else { + + if(debug) System.out.printf("%s: no reference transformation exists for %s\n",this.getClass().getSimpleName(),getName()); + + } + + } + + /** + * Apply @link AlignmentCorrection to the volume if they are supplied. + * + */ + private void applyLocalAlignmentCorrections() { + + // Apply alignment corrections to local coordinate system that is already built + boolean debug_local = false; + if(this.coord==null) + throw new RuntimeException("no coordinate system was set before trying to apply alignment corrections."); + + if(alignmentCorrections!=null) { + + + if(alignmentCorrections.getNode()!=null) { + + if(debug_local || debug) System.out.printf("%s: Apply survey results to %s\n",this.getClass().getSimpleName(),this.getName()); + + applySurvey(alignmentCorrections.getNode()); + + if(debug_local || debug) System.out.printf("%s: DONE Apply survey results to %s\n",this.getClass().getSimpleName(),this.getName()); + + } + + + + + + if(debug_local || debug) System.out.printf("%s: Apply alignment corrections to %s\n",this.getClass().getSimpleName(),this.getName()); + + // translate + if(alignmentCorrections.getTranslation()!=null) { + + if(debug_local || debug) System.out.printf("%s: Apply local translation %s\n", this.getClass().getSimpleName(),alignmentCorrections.getTranslation().toString()); + + // rotate into mother coordinate system + Hep3Vector translation_mother = getCoord().getTransformation().rotated(alignmentCorrections.getTranslation()); + + if(debug_local || debug) System.out.printf("%s: after rotation apply translation %s to coordinate system\n", this.getClass().getSimpleName(),translation_mother.toString()); + + //apply translation + getCoord().translate(translation_mother); + + } else { + if(debug_local || debug) System.out.printf("%s: No translation to coordinate system\n", this.getClass().getSimpleName()); + } + + // rotate + if(alignmentCorrections.getRotation()!=null) { + if(debug_local || debug) { System.out.printf("%s: Apply rotation matrix:\n", this.getClass().getSimpleName()); TransformationUtils.printMatrix(alignmentCorrections.getRotation().getMatrix()); System.out.printf("%s: coord system before:\n%s\n", this.getClass().getSimpleName(),getCoord().toString()); } - - // correct rotation of the local unit vectors - Vector3D u_rot_local = alignmentCorrections.getRotation().applyTo(new Vector3D(1,0,0)); - Vector3D v_rot_local = alignmentCorrections.getRotation().applyTo(new Vector3D(0,1,0)); - Vector3D w_rot_local = alignmentCorrections.getRotation().applyTo(new Vector3D(0,0,1)); - - // rotate the local unit vectors to the mother coordinates - - Hep3Vector u_rot = getCoord().getTransformation().getRotation().rotated(new BasicHep3Vector(u_rot_local.toArray())); - Hep3Vector v_rot = getCoord().getTransformation().getRotation().rotated(new BasicHep3Vector(v_rot_local.toArray())); - Hep3Vector w_rot = getCoord().getTransformation().getRotation().rotated(new BasicHep3Vector(w_rot_local.toArray())); + + // correct rotation of the local unit vectors + Vector3D u_rot_local = alignmentCorrections.getRotation().applyTo(new Vector3D(1,0,0)); + Vector3D v_rot_local = alignmentCorrections.getRotation().applyTo(new Vector3D(0,1,0)); + Vector3D w_rot_local = alignmentCorrections.getRotation().applyTo(new Vector3D(0,0,1)); + + // rotate the local unit vectors to the mother coordinates + + Hep3Vector u_rot = getCoord().getTransformation().getRotation().rotated(new BasicHep3Vector(u_rot_local.toArray())); + Hep3Vector v_rot = getCoord().getTransformation().getRotation().rotated(new BasicHep3Vector(v_rot_local.toArray())); + Hep3Vector w_rot = getCoord().getTransformation().getRotation().rotated(new BasicHep3Vector(w_rot_local.toArray())); - getCoord().u(u_rot); - getCoord().v(v_rot); - getCoord().w(w_rot); + getCoord().u(u_rot); + getCoord().v(v_rot); + getCoord().w(w_rot); if(debug_local || debug) { System.out.printf("%s: coord system after:\n%s\n", this.getClass().getSimpleName(),getCoord().toString()); } - - - - } else { - if(debug_local || debug) System.out.printf("%s: No rotation to coordinate system\n", this.getClass().getSimpleName()); - } - - if(debug_local || debug) System.out.printf("%s: coordinate system after alignment corrections:\n%s\n",this.getClass().getSimpleName(),getCoord().toString()); - - } else { + + + + } else { + if(debug_local || debug) System.out.printf("%s: No rotation to coordinate system\n", this.getClass().getSimpleName()); + } + + if(debug_local || debug) System.out.printf("%s: coordinate system after alignment corrections:\n%s\n",this.getClass().getSimpleName(),getCoord().toString()); + + } else { if(debug_local || debug) System.out.printf("%s: no alignment corrections exist for %s\n",this.getClass().getSimpleName(),this.getName()); - } - - } - - private void setAlignmentCorrection(AlignmentCorrection alignmentCorrection) { + } + + } + + private void setAlignmentCorrection(AlignmentCorrection alignmentCorrection) { this.alignmentCorrections = alignmentCorrection; } public void setBallPos(double x, double y, double z) { - ballPos = new BasicHep3Vector(x,y,z); - } - public void setVeePos(double x, double y, double z) { - veePos = new BasicHep3Vector(x,y,z); - } - public void setFlatPos(double x, double y, double z) { - flatPos = new BasicHep3Vector(x,y,z); - } - public Hep3Vector getBallPos() { - return ballPos; - } - public Hep3Vector getVeePos() { - return veePos; - } - public Hep3Vector getFlatPos() { - return flatPos; - } - public void setCoord() { - if(ballPos==null || veePos==null || flatPos==null) { - throw new RuntimeException("Need to set ball, vee and flat before building coord system!"); - } - - coord = new SurveyCoordinateSystem(ballPos, veePos, flatPos); - - if(this.debug) { - System.out.printf("%s: setCoord \n%s\n", this.getClass().getSimpleName(), coord.toString()); - } - } - public SurveyCoordinateSystem getCoord() { - if(coord == null) { - throw new RuntimeException("Need to setCoord!"); - } - return coord; - } - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public Hep3Vector getCenter() { - return center; - } - public void setCenter(Hep3Vector center) { - this.center = center; - } - public void setCenter(double x, double y, double z) { - this.center = new BasicHep3Vector(x,y,z); - } - public Hep3Vector getBoxDim() { - return boxDim; - } - public void setBoxDim(double x, double y, double z) { - this.boxDim = new BasicHep3Vector(x,y,z); - } - public SurveyVolume getMother() { - return mother; - } - public void setMother(SurveyVolume mother) { - this.mother = mother; - } - public void addReferenceGeom(SurveyVolume refGeom) { - if(refGeom!=null) { // check that it's not a dummy call - if(referenceGeom == null) { - referenceGeom = new ArrayList<SurveyVolume>(); - } - referenceGeom.add(refGeom); - } - } - public void addReferenceGeom(List<SurveyVolume> refGeomList) { - if(referenceGeom == null) { - referenceGeom = new ArrayList<SurveyVolume>(); - } - referenceGeom.addAll(refGeomList); - } - public void printSurveyPos() { - if(debug) { - System.out.printf("%s: Survey pos for %s:\n",getClass().getSimpleName(),getName()); - System.out.printf("%s: ballPos %s\n",getClass().getSimpleName(), ballPos.toString()); - System.out.printf("%s: veePos %s\n",getClass().getSimpleName(), veePos.toString()); - System.out.printf("%s: flatPos %s\n",getClass().getSimpleName(), flatPos.toString()); - } - } - public String getMaterial() { - return material; - } - public void setMaterial(String material) { - this.material = material; - } - public String toString() { - String s = "==\n" + getName() + " with mother " + (getMother()==null?"<no mother>":getMother().getName()) + ":\n"; - if( getCenter()!=null) s += "Center of box: " + getCenter().toString() + "\n"; + ballPos = new BasicHep3Vector(x,y,z); + } + public void setVeePos(double x, double y, double z) { + veePos = new BasicHep3Vector(x,y,z); + } + public void setFlatPos(double x, double y, double z) { + flatPos = new BasicHep3Vector(x,y,z); + } + public Hep3Vector getBallPos() { + return ballPos; + } + public Hep3Vector getVeePos() { + return veePos; + } + public Hep3Vector getFlatPos() { + return flatPos; + } + public void setCoord() { + if(ballPos==null || veePos==null || flatPos==null) { + throw new RuntimeException("Need to set ball, vee and flat before building coord system!"); + } + + coord = new SurveyCoordinateSystem(ballPos, veePos, flatPos); + + if(this.debug) { + System.out.printf("%s: setCoord \n%s\n", this.getClass().getSimpleName(), coord.toString()); + } + } + public SurveyCoordinateSystem getCoord() { + if(coord == null) { + throw new RuntimeException("Need to setCoord!"); + } + return coord; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public Hep3Vector getCenter() { + return center; + } + public void setCenter(Hep3Vector center) { + this.center = center; + } + public void setCenter(double x, double y, double z) { + this.center = new BasicHep3Vector(x,y,z); + } + public Hep3Vector getBoxDim() { + return boxDim; + } + public void setBoxDim(double x, double y, double z) { + this.boxDim = new BasicHep3Vector(x,y,z); + } + public SurveyVolume getMother() { + return mother; + } + public void setMother(SurveyVolume mother) { + this.mother = mother; + } + public void addReferenceGeom(SurveyVolume refGeom) { + if(refGeom!=null) { // check that it's not a dummy call + if(referenceGeom == null) { + referenceGeom = new ArrayList<SurveyVolume>(); + } + referenceGeom.add(refGeom); + } + } + public void addReferenceGeom(List<SurveyVolume> refGeomList) { + if(referenceGeom == null) { + referenceGeom = new ArrayList<SurveyVolume>(); + } + referenceGeom.addAll(refGeomList); + } + public void printSurveyPos() { + if(debug) { + System.out.printf("%s: Survey pos for %s:\n",getClass().getSimpleName(),getName()); + System.out.printf("%s: ballPos %s\n",getClass().getSimpleName(), ballPos.toString()); + System.out.printf("%s: veePos %s\n",getClass().getSimpleName(), veePos.toString()); + System.out.printf("%s: flatPos %s\n",getClass().getSimpleName(), flatPos.toString()); + } + } + public String getMaterial() { + return material; + } + public void setMaterial(String material) { + this.material = material; + } + public String toString() { + String s = "==\n" + getName() + " with mother " + (getMother()==null?"<no mother>":getMother().getName()) + ":\n"; + if( getCenter()!=null) s += "Center of box: " + getCenter().toString() + "\n"; if( getBoxDim()!=null) s += "Box dimensions: " + getBoxDim().toString() + "\n"; - if(this.coord==null) s += " No coord system \n"; - else { - s += getName() + " origin " + getCoord().origin() + " u " + getCoord().u()+ " v " + getCoord().v()+ " w " + getCoord().w(); - } + if(this.coord==null) s += " No coord system \n"; + else { + s += getName() + " origin " + getCoord().origin() + " u " + getCoord().u()+ " v " + getCoord().v()+ " w " + getCoord().w(); + } s += "AlignmentCorrections: \n"; - if(this.alignmentCorrections!=null) { - s += "Milleparameters: "; - if(this.alignmentCorrections.getMilleParameters()!=null) { - for(MilleParameter mp : this.alignmentCorrections.getMilleParameters()) s += mp.getId() + " "; - } else { - s += "no MP params associated."; - } - s += "(" + this.getName() + ")" + " \n"; - } else { - s+= " no alignment corrections associated.\n"; - } - SurveyVolume m = getMother(); - while(m!=null) { + if(this.alignmentCorrections!=null) { + s += "Milleparameters: "; + if(this.alignmentCorrections.getMilleParameters()!=null) { + for(MilleParameter mp : this.alignmentCorrections.getMilleParameters()) s += mp.getId() + " "; + } else { + s += "no MP params associated."; + } + s += "(" + this.getName() + ")" + " \n"; + } else { + s+= " no alignment corrections associated.\n"; + } + SurveyVolume m = getMother(); + while(m!=null) { Hep3Vector origin_m = HPSTrackerBuilder.transformToParent(new BasicHep3Vector(0, 0, 0), this, m.getName()); String unitVecStr = ""; if(getCoord()!=null) { @@ -638,12 +638,12 @@ //origin_m = VecOp.mult(0.0393701, origin_m); //s += String.format("%s origin in %s : (%.4f %.4f %.4f) (inch)\n",getName(), m.getName(), origin_m.x(),origin_m.y(),origin_m.z()); m = m.getMother(); - } - - - return s; - } - - - + } + + + return s; + } + + + } Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolumeImpl.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolumeImpl.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolumeImpl.java Wed Mar 9 11:43:24 2016 @@ -21,7 +21,7 @@ public abstract void setPositionAndRotation(SurveyVolume base); public String getName() { - return surveyVolume.getName(); + return surveyVolume.getName(); } protected Hep3Vector getBoxDim() { @@ -33,7 +33,7 @@ } public boolean isDebug() { - return debug; + return debug; } public abstract String toString(); Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolumeVisualization.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolumeVisualization.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolumeVisualization.java Wed Mar 9 11:43:24 2016 @@ -7,14 +7,14 @@ * @author Per Hansson Adrian <[log in to unmask]> */ public class SurveyVolumeVisualization { - protected String visName = ""; - public SurveyVolumeVisualization() {} - public String getVisName() { - return visName; - } - protected void setVisName(String visName) { - this.visName = visName; - } - - + protected String visName = ""; + public SurveyVolumeVisualization() {} + public String getVisName() { + return visName; + } + protected void setVisName(String visName) { + this.visName = visName; + } + + } Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SvtAlignmentConstantsReader.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SvtAlignmentConstantsReader.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SvtAlignmentConstantsReader.java Wed Mar 9 11:43:24 2016 @@ -14,16 +14,16 @@ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a> */ public class SvtAlignmentConstantsReader { - - private SvtAlignmentConstantsReader() { - } + + private SvtAlignmentConstantsReader() { + } - /** - * Read SVT alignment constants from the conditions database table <i>svt_alignments</i> and create a list of - * <code>MilleParameter</code> objects from it. - * - * @return the Millepede parameter list - */ + /** + * Read SVT alignment constants from the conditions database table <i>svt_alignments</i> and create a list of + * <code>MilleParameter</code> objects from it. + * + * @return the Millepede parameter list + */ static List<MilleParameter> readMilleParameters() { final DatabaseConditionsManager manager = DatabaseConditionsManager.getInstance(); Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSMuonCalorimeter2.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSMuonCalorimeter2.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSMuonCalorimeter2.java Wed Mar 9 11:43:24 2016 @@ -8,13 +8,13 @@ public class HPSMuonCalorimeter2 extends LCDDSubdetector { - HPSMuonCalorimeter2(Element e) throws JDOMException - { - super(e); - } + HPSMuonCalorimeter2(Element e) throws JDOMException + { + super(e); + } - void addToLCDD(LCDD lcdd, SensitiveDetector sens) throws JDOMException - { + void addToLCDD(LCDD lcdd, SensitiveDetector sens) throws JDOMException + { String name = node.getAttributeValue("name"); System.out.println("HPSMuonCalorimeter2.addToLCDD - " + name); int id = node.getAttribute("id").getIntValue(); @@ -22,7 +22,7 @@ Element parameters = node.getChild("parameters"); if (parameters == null) { - throw new RuntimeException("parameters element missing"); + throw new RuntimeException("parameters element missing"); } double frontFaceToTarget = parameters.getAttribute("front_face_to_target").getDoubleValue(); @@ -40,16 +40,16 @@ System.out.println("stripSpacingZ = " + stripSpacingZ); for (Object layerObject : node.getChildren("layer")) { - Element layerElement = (Element)layerObject; - int layerId = layerElement.getAttribute("id").getIntValue(); - System.out.println("layer = " + layerId); - for (Object sliceObject : layerElement.getChildren("slice")) { - Element sliceElement = (Element)sliceObject; - if (sliceElement.getAttribute("thickness") != null) { - double thickness = sliceElement.getAttribute("thickness").getDoubleValue(); - System.out.println("slice thickness = " + thickness); - } - } + Element layerElement = (Element)layerObject; + int layerId = layerElement.getAttribute("id").getIntValue(); + System.out.println("layer = " + layerId); + for (Object sliceObject : layerElement.getChildren("slice")) { + Element sliceElement = (Element)sliceObject; + if (sliceElement.getAttribute("thickness") != null) { + double thickness = sliceElement.getAttribute("thickness").getDoubleValue(); + System.out.println("slice thickness = " + thickness); + } + } } - } + } } Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTestRunTracker2014.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTestRunTracker2014.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTestRunTracker2014.java Wed Mar 9 11:43:24 2016 @@ -30,58 +30,58 @@ */ public class HPSTestRunTracker2014 extends HPSTracker2014Base { - public HPSTestRunTracker2014(Element node) throws JDOMException - { - super(node); - } - - /* (non-Javadoc) - * @see org.lcsim.geometry.compact.converter.lcdd.HPSTracker2014Base#initializeBuilder(org.lcsim.geometry.compact.converter.lcdd.util.LCDD, org.lcsim.geometry.compact.converter.lcdd.util.SensitiveDetector) - */ - protected HPSTrackerLCDDBuilder initializeBuilder(LCDD lcdd, SensitiveDetector sens) { - HPSTrackerLCDDBuilder b = new HPSTestRunTracker2014LCDDBuilder(_debug,node,lcdd,sens); - return b; - } - - - - /* (non-Javadoc) + public HPSTestRunTracker2014(Element node) throws JDOMException + { + super(node); + } + + /* (non-Javadoc) + * @see org.lcsim.geometry.compact.converter.lcdd.HPSTracker2014Base#initializeBuilder(org.lcsim.geometry.compact.converter.lcdd.util.LCDD, org.lcsim.geometry.compact.converter.lcdd.util.SensitiveDetector) + */ + protected HPSTrackerLCDDBuilder initializeBuilder(LCDD lcdd, SensitiveDetector sens) { + HPSTrackerLCDDBuilder b = new HPSTestRunTracker2014LCDDBuilder(_debug,node,lcdd,sens); + return b; + } + + + + /* (non-Javadoc) * @see org.lcsim.detector.converter.compact.HPSTracker2014ConverterBase#getModuleNumber(org.lcsim.geometry.compact.converter.JavaSurveyVolume) */ protected int getModuleNumber(String surveyVolume) { return HPSTrackerBuilder.getHalfFromName(surveyVolume).equals("top") ? 0 : 1; } - - - - - - - - - - - - - - private void makeExample(LCDD lcdd, SensitiveDetector sens) throws JDOMException { - - - if(_debug) { - System.out.println("--- makeExample ----"); - - } - - - - String volName = "example"; - Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); - lcdd.add(box); - Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); - - - - org.apache.commons.math3.geometry.euclidean.threed.Vector3D axisX = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(1., 0., 0.); + + + + + + + + + + + + + + private void makeExample(LCDD lcdd, SensitiveDetector sens) throws JDOMException { + + + if(_debug) { + System.out.println("--- makeExample ----"); + + } + + + + String volName = "example"; + Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); + lcdd.add(box); + Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); + + + + org.apache.commons.math3.geometry.euclidean.threed.Vector3D axisX = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(1., 0., 0.); org.apache.commons.math3.geometry.euclidean.threed.Vector3D axisY = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(0., 1., 0.); org.apache.commons.math3.geometry.euclidean.threed.Vector3D axisZ = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(0., 0., 1.); @@ -131,11 +131,11 @@ Rotation rot = new Rotation(volName + "_rotation",0,0,0); lcdd.add(pos); lcdd.add(rot); - - + + PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); if(_debug) { - System.out.println("Created physical vomume " + basePV.getName()); + System.out.println("Created physical vomume " + basePV.getName()); } @@ -151,153 +151,153 @@ lcdd.add(subRot); PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); if(_debug) { - System.out.println("Created physical vomume " + subBasePV.getName()); + System.out.println("Created physical vomume " + subBasePV.getName()); } - + lcdd.add(volumeSub); volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); - + lcdd.add(volume); - - - - - } - - - private void makeExample2(LCDD lcdd, SensitiveDetector sens) throws JDOMException { - - - if(_debug) { - System.out.println("--- makeExample2 ----"); - - } - - String volName = "example2"; - Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); - lcdd.add(box); - Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); - - - - org.apache.commons.math3.geometry.euclidean.threed.Vector3D axisX = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(1., 0., 0.); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D axisY = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(0., 1., 0.); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D axisZ = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(0., 0., 1.); - - double alpha1 = PI / 4.; - double alpha2 = PI / 4.; - double alpha3 = -PI / 4.; - - org.apache.commons.math3.geometry.euclidean.threed.Rotation r123 = - new org.apache.commons.math3.geometry.euclidean.threed.Rotation(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ, - alpha1, - alpha2, - alpha3); - - org.apache.commons.math3.geometry.euclidean.threed.Vector3D axisXPrime = r123.applyTo(axisX); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D axisYPrime = r123.applyTo(axisY); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D axisZPrime = r123.applyTo(axisZ); - - //if(_debug) System.out.println("axisYPrime: " + axisYPrime); - //if(_debug) System.out.println("axisZPrime: " + axisZPrime); - - - - //double [] rotations = r123.getAngles(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ); - - - //double [] rotations = r12.getAngles(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ); - double [] rotations = r123.getAngles(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ); - - Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5,0,0); - Rotation rot = new Rotation(volName + "_rotation",rotations[0],rotations[1],rotations[2]); - lcdd.add(pos); - lcdd.add(rot); - - - PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); - if(_debug) { - System.out.println("Created physical vomume " + basePV.getName()); - } - - - - volName = volName + "_sub"; - Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); - lcdd.add(boxSub); - Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); - Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); - Rotation subRot = new Rotation(volName + "_rotation",0,0,0); - lcdd.add(subPos); - lcdd.add(subRot); - PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); - if(_debug) { - System.out.println("Created physical vomume " + subBasePV.getName()); - } - - lcdd.add(volumeSub); - volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); - - lcdd.add(volume); - - - - - } - - - - private void makeExample3(LCDD lcdd, SensitiveDetector sens) throws JDOMException { - - - if(_debug) { - System.out.println("--- makeExample3 ----"); - - } - - String volName = "example3"; - Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); - lcdd.add(box); - Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); - - /* - - TestRunModuleL13: survey positions before ref support_plate_top transform - Survey pos for module_L1t: - ballPos [ 25.000, 676.10, -4.3500] - veePos [ 95.000, 676.10, -4.3500] - flatPos [ 60.000, 670.10, -4.3500] - TestRunModuleL13: Ref support_plate_top coord - Coordinate system: - origin [ 40.314, 142.71, 138.40] - u [ 0.99955, 0.030000, 0.0000] - v [ -0.030000, 0.99955, 0.0000] - w [ 0.0000, -0.0000, 1.0000] - TestRunModuleL13: survey positions after ref support_plate_top transform - Survey pos for module_L1t: - ballPos [ 45.020, 819.25, 134.05] - veePos [ 114.99, 821.35, 134.05] - flatPos [ 80.184, 814.31, 134.05] - TestRunModuleL13: coordinate system: - Coordinate system: - origin [ 45.020, 819.25, 134.05] - u [ 0.99955, 0.030000, 0.0000] - v [ 0.030000, -0.99955, 0.0000] - w [ 0.0000, 0.0000, -1.0000] - TestRunModuleL13: translation: - [ 45.020, 819.25, 134.05] - TestRunModuleL13: rotation: - [ - 0.999549894704642 0.030000133265350216 0.0 - 0.030000133265350216 -0.999549894704642 0.0 - 0.0 0.0 -1.0 - - ] - - - - LCDDBaseGeom: set position and rotation for volume module_L1t + + + + + } + + + private void makeExample2(LCDD lcdd, SensitiveDetector sens) throws JDOMException { + + + if(_debug) { + System.out.println("--- makeExample2 ----"); + + } + + String volName = "example2"; + Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); + lcdd.add(box); + Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); + + + + org.apache.commons.math3.geometry.euclidean.threed.Vector3D axisX = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(1., 0., 0.); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D axisY = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(0., 1., 0.); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D axisZ = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(0., 0., 1.); + + double alpha1 = PI / 4.; + double alpha2 = PI / 4.; + double alpha3 = -PI / 4.; + + org.apache.commons.math3.geometry.euclidean.threed.Rotation r123 = + new org.apache.commons.math3.geometry.euclidean.threed.Rotation(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ, + alpha1, + alpha2, + alpha3); + + org.apache.commons.math3.geometry.euclidean.threed.Vector3D axisXPrime = r123.applyTo(axisX); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D axisYPrime = r123.applyTo(axisY); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D axisZPrime = r123.applyTo(axisZ); + + //if(_debug) System.out.println("axisYPrime: " + axisYPrime); + //if(_debug) System.out.println("axisZPrime: " + axisZPrime); + + + + //double [] rotations = r123.getAngles(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ); + + + //double [] rotations = r12.getAngles(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ); + double [] rotations = r123.getAngles(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ); + + Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5,0,0); + Rotation rot = new Rotation(volName + "_rotation",rotations[0],rotations[1],rotations[2]); + lcdd.add(pos); + lcdd.add(rot); + + + PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); + if(_debug) { + System.out.println("Created physical vomume " + basePV.getName()); + } + + + + volName = volName + "_sub"; + Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); + lcdd.add(boxSub); + Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); + Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); + Rotation subRot = new Rotation(volName + "_rotation",0,0,0); + lcdd.add(subPos); + lcdd.add(subRot); + PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); + if(_debug) { + System.out.println("Created physical vomume " + subBasePV.getName()); + } + + lcdd.add(volumeSub); + volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); + + lcdd.add(volume); + + + + + } + + + + private void makeExample3(LCDD lcdd, SensitiveDetector sens) throws JDOMException { + + + if(_debug) { + System.out.println("--- makeExample3 ----"); + + } + + String volName = "example3"; + Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); + lcdd.add(box); + Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); + + /* + + TestRunModuleL13: survey positions before ref support_plate_top transform + Survey pos for module_L1t: + ballPos [ 25.000, 676.10, -4.3500] + veePos [ 95.000, 676.10, -4.3500] + flatPos [ 60.000, 670.10, -4.3500] + TestRunModuleL13: Ref support_plate_top coord + Coordinate system: + origin [ 40.314, 142.71, 138.40] + u [ 0.99955, 0.030000, 0.0000] + v [ -0.030000, 0.99955, 0.0000] + w [ 0.0000, -0.0000, 1.0000] + TestRunModuleL13: survey positions after ref support_plate_top transform + Survey pos for module_L1t: + ballPos [ 45.020, 819.25, 134.05] + veePos [ 114.99, 821.35, 134.05] + flatPos [ 80.184, 814.31, 134.05] + TestRunModuleL13: coordinate system: + Coordinate system: + origin [ 45.020, 819.25, 134.05] + u [ 0.99955, 0.030000, 0.0000] + v [ 0.030000, -0.99955, 0.0000] + w [ 0.0000, 0.0000, -1.0000] + TestRunModuleL13: translation: + [ 45.020, 819.25, 134.05] + TestRunModuleL13: rotation: + [ + 0.999549894704642 0.030000133265350216 0.0 + 0.030000133265350216 -0.999549894704642 0.0 + 0.0 0.0 -1.0 + + ] + + + + LCDDBaseGeom: set position and rotation for volume module_L1t getEulerAngles: u [ 0.030000, -0.99955, 0.0000] v[ 0.0000, 0.0000, -1.0000] -> [ 0.0000, 1.0000, 0.0000] [ 0.0000, 0.0000, 1.0000] Input: u {0.03; -1; 0} v {0; 0; -1} u' {0; 1; 0} v' {0; 0; 1} rot matrix: @@ -314,388 +314,388 @@ LCDDBaseGeom: rot [Element: <rotation/>] LCDDBaseGeom: DONE constructing LCDD object module_L1t - - - */ - - Hep3Vector u = new BasicHep3Vector(1,0,0); - Hep3Vector v = new BasicHep3Vector(0,1,0); - Hep3Vector w = new BasicHep3Vector(0,0,1); - - Hep3Vector u_L1 = new BasicHep3Vector(0.99955, 0.030000, 0.0000); - Hep3Vector v_L1 = new BasicHep3Vector(0.030000, -0.99955, 0.0000); - Hep3Vector w_L1 = new BasicHep3Vector(0.0000, 0.0000, -1.0000); - - - - org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_L1 = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u_L1.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_L1 = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v_L1.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_L1 = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w_L1.v()); - - org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w.v()); - - Hep3Vector euler_angles = TransformationUtils.getCardanAngles(v_L1, w_L1, v, w); - - //Get the generic rotation - org.apache.commons.math3.geometry.euclidean.threed.Rotation r = new org.apache.commons.math3.geometry.euclidean.threed.Rotation(v_3D_L1,w_3D_L1,v_3D, w_3D); - //Get the angles - double rotations[] = r.getAngles(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ); - - if(_debug) { - System.out.println("getEulerAngles gives euler_angles: " + euler_angles.toString()); - System.out.println("manual gives euler_angles: (" + rotations[0] + "," + rotations[1] + "," + rotations[2] + ")"); - } - - if((rotations[0]-euler_angles.x())>0.00001 || (rotations[1]-euler_angles.y())>0.00001 || (rotations[2]-euler_angles.z())>0.00001) { - //System.("closing the loop in apache rotation didn't work!"); - //throw new RuntimeException("closing the loop in apache rotation didn't work!"); - } - - - - - Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*4,0,0); - Rotation rot = new Rotation(volName + "_rotation",rotations[0],rotations[1],rotations[2]); - lcdd.add(pos); - lcdd.add(rot); - - - PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); - if(_debug) { - System.out.println("Created physical vomume " + basePV.getName()); - } - - - - volName = volName + "_sub"; - Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); - lcdd.add(boxSub); - Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); - Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); - Rotation subRot = new Rotation(volName + "_rotation",0,0,0); - lcdd.add(subPos); - lcdd.add(subRot); - PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); - if(_debug) { - System.out.println("Created physical vomume " + subBasePV.getName()); - } - - lcdd.add(volumeSub); - volumeSub.setVisAttributes(lcdd.getVisAttributes("HybridVis")); - - lcdd.add(volume); - - - - - } - - - private void makeExample4(LCDD lcdd, SensitiveDetector sens) throws JDOMException { - - - if(_debug) { - System.out.println("--- makeExample4 ----"); - - } - - String volName = "example4"; - Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); - lcdd.add(box); - Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); - - - - Hep3Vector u = new BasicHep3Vector(1,0,0); - Hep3Vector v = new BasicHep3Vector(0,1,0); - Hep3Vector w = new BasicHep3Vector(0,0,1); - - org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w.v()); - - - - //set up a rotation about the X axis - org.apache.commons.math3.geometry.euclidean.threed.Rotation r1 = new org.apache.commons.math3.geometry.euclidean.threed.Rotation(u_3D, -1.0*Math.PI); - - // find y' and z' - org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_p = r1.applyTo(u_3D); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_p = r1.applyTo(v_3D); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_p = r1.applyTo(w_3D); - - - double [] rotations = r1.getAngles(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ); - - - if(_debug) { - System.out.println("u_3D: " + u_3D.toString()); - System.out.println("v_3D: " + v_3D.toString()); - System.out.println("w_3D: " + w_3D.toString()); - r1.toString(); - System.out.println("u_3D_p: " + u_3D_p.toString()); - System.out.println("v_3D_p: " + v_3D_p.toString()); - System.out.println("w_3D_p: " + w_3D_p.toString()); - - System.out.println("gives euler_angles: (" + rotations[0] + "," + rotations[1] + "," + rotations[2] + ")"); - - } - - - - //apply to unit vector - - Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*2,0,0); - Rotation rot = new Rotation(volName + "_rotation",rotations[0],rotations[1],rotations[2]); - lcdd.add(pos); - lcdd.add(rot); - - - PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); - if(_debug) { - System.out.println("Created physical vomume " + basePV.getName()); - } - - - - - volName = volName + "_sub"; - Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); - lcdd.add(boxSub); - Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); - Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); - Rotation subRot = new Rotation(volName + "_rotation",0,0,0); - lcdd.add(subPos); - lcdd.add(subRot); - PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); - if(_debug) { - System.out.println("Created physical vomume " + subBasePV.getName()); - } - - lcdd.add(volumeSub); - volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); - - lcdd.add(volume); - - - - - } - - - private void makeExample5(LCDD lcdd, SensitiveDetector sens) throws JDOMException { - - - if(_debug) { - System.out.println("--- makeExample5 ----"); - - } - - String volName = "example5"; - Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); - lcdd.add(box); - Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); - - - - Hep3Vector u = new BasicHep3Vector(1,0,0); - Hep3Vector v = new BasicHep3Vector(0,1,0); - Hep3Vector w = new BasicHep3Vector(0,0,1); - - org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w.v()); - - - - //set up a rotation about the X axis - org.apache.commons.math3.geometry.euclidean.threed.Rotation r1 = new org.apache.commons.math3.geometry.euclidean.threed.Rotation(u_3D, -1.0*Math.PI); - - // find y' and z' - org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_p = r1.applyTo(u_3D); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_p = r1.applyTo(v_3D); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_p = r1.applyTo(w_3D); - - // set up a rotation about the Z axis - org.apache.commons.math3.geometry.euclidean.threed.Rotation r3 = new org.apache.commons.math3.geometry.euclidean.threed.Rotation(w_3D_p, -0.03); - org.apache.commons.math3.geometry.euclidean.threed.Rotation r13 = r3.applyTo(r1); - - - // find y' and z' - org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_pp = r13.applyTo(u_3D); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_pp = r13.applyTo(v_3D); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_pp = r13.applyTo(w_3D); - //org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_pp = r13.applyTo(u_3D_p); - //org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_pp = r13.applyTo(v_3D_p); - //org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_pp = r13.applyTo(w_3D_p); - - double [] rotations = r13.getAngles(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ); - - - if(_debug) { - System.out.println("u_3D: " + u_3D.toString()); - System.out.println("v_3D: " + v_3D.toString()); - System.out.println("w_3D: " + w_3D.toString()); - r1.toString(); - System.out.println("u_3D_p: " + u_3D_p.toString()); - System.out.println("v_3D_p: " + v_3D_p.toString()); - System.out.println("w_3D_p: " + w_3D_p.toString()); - r13.toString(); - System.out.println("u_3D_pp: " + u_3D_pp.toString()); - System.out.println("v_3D_pp: " + v_3D_pp.toString()); - System.out.println("w_3D_pp: " + w_3D_pp.toString()); - System.out.println("gives euler_angles: (" + rotations[0] + "," + rotations[1] + "," + rotations[2] + ")"); - - } - - - - //apply to unit vector - - Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*3,0,0); - Rotation rot = new Rotation(volName + "_rotation",rotations[0],rotations[1],rotations[2]); - lcdd.add(pos); - lcdd.add(rot); - - - PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); - if(_debug) { - System.out.println("Created physical vomume " + basePV.getName()); - } - - - volName = volName + "_sub"; - Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); - lcdd.add(boxSub); - Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); - Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); - Rotation subRot = new Rotation(volName + "_rotation",0,0,0); - lcdd.add(subPos); - lcdd.add(subRot); - PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); - if(_debug) { - System.out.println("Created physical vomume " + subBasePV.getName()); - } - - lcdd.add(volumeSub); - volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); - - lcdd.add(volume); - - - - - } - - - - - private void makeExample5b(LCDD lcdd, SensitiveDetector sens) throws JDOMException { - - - if(_debug) { - System.out.println("--- makeExample5b ----"); - - } - - String volName = "example5b"; - Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); - lcdd.add(box); - Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); - - - - Hep3Vector u = new BasicHep3Vector(1,0,0); - Hep3Vector v = new BasicHep3Vector(0,1,0); - Hep3Vector w = new BasicHep3Vector(0,0,1); - - org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w.v()); - - - // set up a rotation about the Z axis - org.apache.commons.math3.geometry.euclidean.threed.Rotation r3 = new org.apache.commons.math3.geometry.euclidean.threed.Rotation(w_3D, -0.03); - - // find y' and z' - org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_p = r3.applyTo(u_3D); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_p = r3.applyTo(v_3D); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_p = r3.applyTo(w_3D); - - - - double [] rotations = r3.getAngles(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ); - - - if(_debug) { - System.out.println("u_3D: " + u_3D.toString()); - System.out.println("v_3D: " + v_3D.toString()); - System.out.println("w_3D: " + w_3D.toString()); - r3.toString(); - System.out.println("u_3D_p: " + u_3D_p.toString()); - System.out.println("v_3D_p: " + v_3D_p.toString()); - System.out.println("w_3D_p: " + w_3D_p.toString()); - System.out.println("gives euler_angles: (" + rotations[0] + "," + rotations[1] + "," + rotations[2] + ")"); - - } - - - - //apply to unit vector - - Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*3,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length*-1.5,0); - Rotation rot = new Rotation(volName + "_rotation",rotations[0],rotations[1],rotations[2]); - lcdd.add(pos); - lcdd.add(rot); - - - PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); - if(_debug) { - System.out.println("Created physical vomume " + basePV.getName()); - } - - - volName = volName + "_sub"; - Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); - lcdd.add(boxSub); - Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); - Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); - Rotation subRot = new Rotation(volName + "_rotation",0,0,0); - lcdd.add(subPos); - lcdd.add(subRot); - PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); - if(_debug) { - System.out.println("Created physical vomume " + subBasePV.getName()); - } - - lcdd.add(volumeSub); - volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); - - lcdd.add(volume); - - - - - } - - private void makeExample3b(LCDD lcdd, SensitiveDetector sens) throws JDOMException { - - - if(_debug) { - System.out.println("--- makeExample3b ----"); - - } - - String volName = "example3b"; - Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); - lcdd.add(box); - Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); - - /* - - TestRunModuleL13: survey positions + + + */ + + Hep3Vector u = new BasicHep3Vector(1,0,0); + Hep3Vector v = new BasicHep3Vector(0,1,0); + Hep3Vector w = new BasicHep3Vector(0,0,1); + + Hep3Vector u_L1 = new BasicHep3Vector(0.99955, 0.030000, 0.0000); + Hep3Vector v_L1 = new BasicHep3Vector(0.030000, -0.99955, 0.0000); + Hep3Vector w_L1 = new BasicHep3Vector(0.0000, 0.0000, -1.0000); + + + + org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_L1 = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u_L1.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_L1 = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v_L1.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_L1 = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w_L1.v()); + + org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w.v()); + + Hep3Vector euler_angles = TransformationUtils.getCardanAngles(v_L1, w_L1, v, w); + + //Get the generic rotation + org.apache.commons.math3.geometry.euclidean.threed.Rotation r = new org.apache.commons.math3.geometry.euclidean.threed.Rotation(v_3D_L1,w_3D_L1,v_3D, w_3D); + //Get the angles + double rotations[] = r.getAngles(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ); + + if(_debug) { + System.out.println("getEulerAngles gives euler_angles: " + euler_angles.toString()); + System.out.println("manual gives euler_angles: (" + rotations[0] + "," + rotations[1] + "," + rotations[2] + ")"); + } + + if((rotations[0]-euler_angles.x())>0.00001 || (rotations[1]-euler_angles.y())>0.00001 || (rotations[2]-euler_angles.z())>0.00001) { + //System.("closing the loop in apache rotation didn't work!"); + //throw new RuntimeException("closing the loop in apache rotation didn't work!"); + } + + + + + Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*4,0,0); + Rotation rot = new Rotation(volName + "_rotation",rotations[0],rotations[1],rotations[2]); + lcdd.add(pos); + lcdd.add(rot); + + + PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); + if(_debug) { + System.out.println("Created physical vomume " + basePV.getName()); + } + + + + volName = volName + "_sub"; + Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); + lcdd.add(boxSub); + Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); + Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); + Rotation subRot = new Rotation(volName + "_rotation",0,0,0); + lcdd.add(subPos); + lcdd.add(subRot); + PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); + if(_debug) { + System.out.println("Created physical vomume " + subBasePV.getName()); + } + + lcdd.add(volumeSub); + volumeSub.setVisAttributes(lcdd.getVisAttributes("HybridVis")); + + lcdd.add(volume); + + + + + } + + + private void makeExample4(LCDD lcdd, SensitiveDetector sens) throws JDOMException { + + + if(_debug) { + System.out.println("--- makeExample4 ----"); + + } + + String volName = "example4"; + Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); + lcdd.add(box); + Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); + + + + Hep3Vector u = new BasicHep3Vector(1,0,0); + Hep3Vector v = new BasicHep3Vector(0,1,0); + Hep3Vector w = new BasicHep3Vector(0,0,1); + + org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w.v()); + + + + //set up a rotation about the X axis + org.apache.commons.math3.geometry.euclidean.threed.Rotation r1 = new org.apache.commons.math3.geometry.euclidean.threed.Rotation(u_3D, -1.0*Math.PI); + + // find y' and z' + org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_p = r1.applyTo(u_3D); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_p = r1.applyTo(v_3D); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_p = r1.applyTo(w_3D); + + + double [] rotations = r1.getAngles(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ); + + + if(_debug) { + System.out.println("u_3D: " + u_3D.toString()); + System.out.println("v_3D: " + v_3D.toString()); + System.out.println("w_3D: " + w_3D.toString()); + r1.toString(); + System.out.println("u_3D_p: " + u_3D_p.toString()); + System.out.println("v_3D_p: " + v_3D_p.toString()); + System.out.println("w_3D_p: " + w_3D_p.toString()); + + System.out.println("gives euler_angles: (" + rotations[0] + "," + rotations[1] + "," + rotations[2] + ")"); + + } + + + + //apply to unit vector + + Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*2,0,0); + Rotation rot = new Rotation(volName + "_rotation",rotations[0],rotations[1],rotations[2]); + lcdd.add(pos); + lcdd.add(rot); + + + PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); + if(_debug) { + System.out.println("Created physical vomume " + basePV.getName()); + } + + + + + volName = volName + "_sub"; + Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); + lcdd.add(boxSub); + Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); + Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); + Rotation subRot = new Rotation(volName + "_rotation",0,0,0); + lcdd.add(subPos); + lcdd.add(subRot); + PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); + if(_debug) { + System.out.println("Created physical vomume " + subBasePV.getName()); + } + + lcdd.add(volumeSub); + volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); + + lcdd.add(volume); + + + + + } + + + private void makeExample5(LCDD lcdd, SensitiveDetector sens) throws JDOMException { + + + if(_debug) { + System.out.println("--- makeExample5 ----"); + + } + + String volName = "example5"; + Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); + lcdd.add(box); + Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); + + + + Hep3Vector u = new BasicHep3Vector(1,0,0); + Hep3Vector v = new BasicHep3Vector(0,1,0); + Hep3Vector w = new BasicHep3Vector(0,0,1); + + org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w.v()); + + + + //set up a rotation about the X axis + org.apache.commons.math3.geometry.euclidean.threed.Rotation r1 = new org.apache.commons.math3.geometry.euclidean.threed.Rotation(u_3D, -1.0*Math.PI); + + // find y' and z' + org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_p = r1.applyTo(u_3D); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_p = r1.applyTo(v_3D); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_p = r1.applyTo(w_3D); + + // set up a rotation about the Z axis + org.apache.commons.math3.geometry.euclidean.threed.Rotation r3 = new org.apache.commons.math3.geometry.euclidean.threed.Rotation(w_3D_p, -0.03); + org.apache.commons.math3.geometry.euclidean.threed.Rotation r13 = r3.applyTo(r1); + + + // find y' and z' + org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_pp = r13.applyTo(u_3D); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_pp = r13.applyTo(v_3D); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_pp = r13.applyTo(w_3D); + //org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_pp = r13.applyTo(u_3D_p); + //org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_pp = r13.applyTo(v_3D_p); + //org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_pp = r13.applyTo(w_3D_p); + + double [] rotations = r13.getAngles(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ); + + + if(_debug) { + System.out.println("u_3D: " + u_3D.toString()); + System.out.println("v_3D: " + v_3D.toString()); + System.out.println("w_3D: " + w_3D.toString()); + r1.toString(); + System.out.println("u_3D_p: " + u_3D_p.toString()); + System.out.println("v_3D_p: " + v_3D_p.toString()); + System.out.println("w_3D_p: " + w_3D_p.toString()); + r13.toString(); + System.out.println("u_3D_pp: " + u_3D_pp.toString()); + System.out.println("v_3D_pp: " + v_3D_pp.toString()); + System.out.println("w_3D_pp: " + w_3D_pp.toString()); + System.out.println("gives euler_angles: (" + rotations[0] + "," + rotations[1] + "," + rotations[2] + ")"); + + } + + + + //apply to unit vector + + Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*3,0,0); + Rotation rot = new Rotation(volName + "_rotation",rotations[0],rotations[1],rotations[2]); + lcdd.add(pos); + lcdd.add(rot); + + + PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); + if(_debug) { + System.out.println("Created physical vomume " + basePV.getName()); + } + + + volName = volName + "_sub"; + Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); + lcdd.add(boxSub); + Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); + Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); + Rotation subRot = new Rotation(volName + "_rotation",0,0,0); + lcdd.add(subPos); + lcdd.add(subRot); + PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); + if(_debug) { + System.out.println("Created physical vomume " + subBasePV.getName()); + } + + lcdd.add(volumeSub); + volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); + + lcdd.add(volume); + + + + + } + + + + + private void makeExample5b(LCDD lcdd, SensitiveDetector sens) throws JDOMException { + + + if(_debug) { + System.out.println("--- makeExample5b ----"); + + } + + String volName = "example5b"; + Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); + lcdd.add(box); + Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); + + + + Hep3Vector u = new BasicHep3Vector(1,0,0); + Hep3Vector v = new BasicHep3Vector(0,1,0); + Hep3Vector w = new BasicHep3Vector(0,0,1); + + org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w.v()); + + + // set up a rotation about the Z axis + org.apache.commons.math3.geometry.euclidean.threed.Rotation r3 = new org.apache.commons.math3.geometry.euclidean.threed.Rotation(w_3D, -0.03); + + // find y' and z' + org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_p = r3.applyTo(u_3D); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_p = r3.applyTo(v_3D); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_p = r3.applyTo(w_3D); + + + + double [] rotations = r3.getAngles(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ); + + + if(_debug) { + System.out.println("u_3D: " + u_3D.toString()); + System.out.println("v_3D: " + v_3D.toString()); + System.out.println("w_3D: " + w_3D.toString()); + r3.toString(); + System.out.println("u_3D_p: " + u_3D_p.toString()); + System.out.println("v_3D_p: " + v_3D_p.toString()); + System.out.println("w_3D_p: " + w_3D_p.toString()); + System.out.println("gives euler_angles: (" + rotations[0] + "," + rotations[1] + "," + rotations[2] + ")"); + + } + + + + //apply to unit vector + + Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*3,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length*-1.5,0); + Rotation rot = new Rotation(volName + "_rotation",rotations[0],rotations[1],rotations[2]); + lcdd.add(pos); + lcdd.add(rot); + + + PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); + if(_debug) { + System.out.println("Created physical vomume " + basePV.getName()); + } + + + volName = volName + "_sub"; + Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); + lcdd.add(boxSub); + Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); + Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); + Rotation subRot = new Rotation(volName + "_rotation",0,0,0); + lcdd.add(subPos); + lcdd.add(subRot); + PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); + if(_debug) { + System.out.println("Created physical vomume " + subBasePV.getName()); + } + + lcdd.add(volumeSub); + volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); + + lcdd.add(volume); + + + + + } + + private void makeExample3b(LCDD lcdd, SensitiveDetector sens) throws JDOMException { + + + if(_debug) { + System.out.println("--- makeExample3b ----"); + + } + + String volName = "example3b"; + Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); + lcdd.add(box); + Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); + + /* + + TestRunModuleL13: survey positions Survey pos for module_L1b: ballPos [ 25.000, 661.10, 4.3500] veePos [ 95.000, 661.10, 4.3500] @@ -732,11 +732,11 @@ ] - - - - - LCDDBaseGeom: set position and rotation for volume module_L1b + + + + + LCDDBaseGeom: set position and rotation for volume module_L1b getEulerAngles: u [ -0.030000, 0.99955, 0.0000] v[ 0.0000, 0.0000, 1.0000] -> [ 0.0000, 1.0000, 0.0000] [ 0.0000, 0.0000, 1.0000] Input: u {-0.03; 1; 0} v {0; 0; 1} u' {0; 1; 0} v' {0; 0; 1} rot matrix: @@ -753,484 +753,484 @@ LCDDBaseGeom: rot [Element: <rotation/>] LCDDBaseGeom: DONE constructing LCDD object module_L1b - - - - - */ - - Hep3Vector u = new BasicHep3Vector(1,0,0); - Hep3Vector v = new BasicHep3Vector(0,1,0); - Hep3Vector w = new BasicHep3Vector(0,0,1); - - Hep3Vector u_L1 = new BasicHep3Vector(0.99955, 0.030000, 0.0000); - Hep3Vector v_L1 = new BasicHep3Vector(-0.030000, 0.99955, 0.0000); - Hep3Vector w_L1 = new BasicHep3Vector(0.0000, 0.0000, 1.0000); - - - - org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_L1 = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u_L1.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_L1 = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v_L1.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_L1 = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w_L1.v()); - - org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w.v()); - - Hep3Vector euler_angles = TransformationUtils.getCardanAngles(v_L1, w_L1, v, w); - - //Get the generic rotation - org.apache.commons.math3.geometry.euclidean.threed.Rotation r = new org.apache.commons.math3.geometry.euclidean.threed.Rotation(v_3D_L1,w_3D_L1,v_3D, w_3D); - //Get the angles - double rotations[] = r.getAngles(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ); - - if(_debug) { - System.out.println("getEulerAngles gives euler_angles: " + euler_angles.toString()); - System.out.println("manual gives euler_angles: (" + rotations[0] + "," + rotations[1] + "," + rotations[2] + ")"); - } - - if((rotations[0]-euler_angles.x())>0.00001 || (rotations[1]-euler_angles.y())>0.00001 || (rotations[2]-euler_angles.z())>0.00001) { - //throw new RuntimeException("closing the loop in apache rotation didn't work!"); - } - - - - - Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*4,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length*-1.5,0); - Rotation rot = new Rotation(volName + "_rotation",rotations[0],rotations[1],rotations[2]); - lcdd.add(pos); - lcdd.add(rot); - - - PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); - if(_debug) { - System.out.println("Created physical vomume " + basePV.getName()); - } - - - - volName = volName + "_sub"; - Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); - lcdd.add(boxSub); - Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); - Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); - Rotation subRot = new Rotation(volName + "_rotation",0,0,0); - lcdd.add(subPos); - lcdd.add(subRot); - PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); - if(_debug) { - System.out.println("Created physical vomume " + subBasePV.getName()); - } - - lcdd.add(volumeSub); - volumeSub.setVisAttributes(lcdd.getVisAttributes("HybridVis")); - - lcdd.add(volume); - - - - - } - - - private void makeExample6(LCDD lcdd, SensitiveDetector sens) throws JDOMException { - - - if(_debug) { - System.out.println("--- makeExample6 ----"); - - } - - String volName = "example6"; - Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); - lcdd.add(box); - Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); - - double [] rotations = {-0.5*Math.PI,0,0}; - - - if(_debug) { - - - System.out.println("manual set lcdd angles: (" + rotations[0] + "," + rotations[1] + "," + rotations[2] + ")"); - - } - - - - //apply to unit vector - - Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*-2,0,0); - Rotation rot = new Rotation(volName + "_rotation",rotations[0],rotations[1],rotations[2]); - lcdd.add(pos); - lcdd.add(rot); - - - PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); - if(_debug) { - System.out.println("Created physical vomume " + basePV.getName()); - } - - - - - volName = volName + "_sub"; - Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); - lcdd.add(boxSub); - Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); - Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); - Rotation subRot = new Rotation(volName + "_rotation",0,0,0); - lcdd.add(subPos); - lcdd.add(subRot); - PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); - if(_debug) { - System.out.println("Created physical vomume " + subBasePV.getName()); - } - - lcdd.add(volumeSub); - volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); - - lcdd.add(volume); - - - - - } - - - - private void makeExample66(LCDD lcdd, SensitiveDetector sens) throws JDOMException { - - - if(_debug) { - System.out.println("--- makeExample66 ----"); - - } - - String volName = "example66"; - Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); - lcdd.add(box); - Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); - - - - Hep3Vector u = new BasicHep3Vector(1,0,0); - Hep3Vector v = new BasicHep3Vector(0,1,0); - Hep3Vector w = new BasicHep3Vector(0,0,1); - - org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w.v()); - - - - //set up a rotation about the X axis - org.apache.commons.math3.geometry.euclidean.threed.Rotation r1 = new org.apache.commons.math3.geometry.euclidean.threed.Rotation(u_3D, -0.5*Math.PI); - - // find y' and z' - org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_p = r1.applyTo(u_3D); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_p = r1.applyTo(v_3D); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_p = r1.applyTo(w_3D); - - - double [] rotations = r1.getAngles(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ); - - - if(_debug) { - System.out.println("u_3D: " + u_3D.toString()); - System.out.println("v_3D: " + v_3D.toString()); - System.out.println("w_3D: " + w_3D.toString()); - r1.toString(); - System.out.println("u_3D_p: " + u_3D_p.toString()); - System.out.println("v_3D_p: " + v_3D_p.toString()); - System.out.println("w_3D_p: " + w_3D_p.toString()); - - System.out.println("gives euler_angles: (" + rotations[0] + "," + rotations[1] + "," + rotations[2] + ")"); - - } - - - - //apply to unit vector - - Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*-4,0,0); - Rotation rot = new Rotation(volName + "_rotation",rotations[0],rotations[1],rotations[2]); - lcdd.add(pos); - lcdd.add(rot); - - - PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); - if(_debug) { - System.out.println("Created physical vomume " + basePV.getName()); - } - - - - - volName = volName + "_sub"; - Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); - lcdd.add(boxSub); - Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); - Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); - Rotation subRot = new Rotation(volName + "_rotation",0,0,0); - lcdd.add(subPos); - lcdd.add(subRot); - PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); - if(_debug) { - System.out.println("Created physical vomume " + subBasePV.getName()); - } - - lcdd.add(volumeSub); - volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); - - lcdd.add(volume); - - - - - } - - - - - - - private void makeExample7(LCDD lcdd, SensitiveDetector sens) throws JDOMException { - - - if(_debug) { - System.out.println("--- makeExample7 ----"); - - } - - String volName = "example7"; - Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); - lcdd.add(box); - Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); - - double [] rotations = {-0.5*Math.PI,0,-0.25*Math.PI}; - - - if(_debug) { - - - System.out.println("manual set lcdd angles: (" + rotations[0] + "," + rotations[1] + "," + rotations[2] + ")"); - - } - - - - //apply to unit vector - - Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*-2,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length*-1,0); - Rotation rot = new Rotation(volName + "_rotation",rotations[0],rotations[1],rotations[2]); - lcdd.add(pos); - lcdd.add(rot); - - - PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); - if(_debug) { - System.out.println("Created physical vomume " + basePV.getName()); - } - - - - - volName = volName + "_sub"; - Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); - lcdd.add(boxSub); - Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); - Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); - Rotation subRot = new Rotation(volName + "_rotation",0,0,0); - lcdd.add(subPos); - lcdd.add(subRot); - PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); - if(_debug) { - System.out.println("Created physical vomume " + subBasePV.getName()); - } - - lcdd.add(volumeSub); - volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); - - lcdd.add(volume); - - - - - } - - - - private void makeExample77(LCDD lcdd, SensitiveDetector sens) throws JDOMException { - - - if(_debug) { - System.out.println("--- makeExample77 ----"); - - } - - String volName = "example77"; - Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); - lcdd.add(box); - Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); - - - - Hep3Vector u = new BasicHep3Vector(1,0,0); - Hep3Vector v = new BasicHep3Vector(0,1,0); - Hep3Vector w = new BasicHep3Vector(0,0,1); - - org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w.v()); - - - - //set up a rotation about the X axis - org.apache.commons.math3.geometry.euclidean.threed.Rotation r1 = new org.apache.commons.math3.geometry.euclidean.threed.Rotation(u_3D, -0.5*Math.PI); - - // find y' and z' - org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_p = r1.applyTo(u_3D); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_p = r1.applyTo(v_3D); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_p = r1.applyTo(w_3D); - - - //set up a rotation about the Z xis - org.apache.commons.math3.geometry.euclidean.threed.Rotation r3 = new org.apache.commons.math3.geometry.euclidean.threed.Rotation(w_3D_p, -0.25*Math.PI); - - org.apache.commons.math3.geometry.euclidean.threed.Rotation r13 = r3.applyTo(r1); - - // find y'' and z'' - org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_pp = r13.applyTo(u_3D); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_pp = r13.applyTo(v_3D); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_pp = r13.applyTo(w_3D); - - // find y'' and z'' (cross-check) - org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_pp_2 = r3.applyTo(u_3D_p); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_pp_2 = r3.applyTo(v_3D_p); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_pp_2 = r3.applyTo(w_3D_p); - - - double [] rotations = r13.getAngles(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ); - - - if(_debug) { - System.out.println("u_3D: " + u_3D.toString()); - System.out.println("v_3D: " + v_3D.toString()); - System.out.println("w_3D: " + w_3D.toString()); - r1.toString(); - System.out.println("u_3D_p: " + u_3D_p.toString()); - System.out.println("v_3D_p: " + v_3D_p.toString()); - System.out.println("w_3D_p: " + w_3D_p.toString()); - r13.toString(); - System.out.println("u_3D_pp: " + u_3D_pp.toString()); - System.out.println("v_3D_pp: " + v_3D_pp.toString()); - System.out.println("w_3D_pp: " + w_3D_pp.toString()); - - System.out.println("gives euler_angles: (" + rotations[0] + "," + rotations[1] + "," + rotations[2] + ")"); - - System.out.println("u_3D_pp_2: " + u_3D_pp_2.toString()); - System.out.println("v_3D_pp_2: " + v_3D_pp_2.toString()); - System.out.println("w_3D_pp_2: " + w_3D_pp_2.toString()); - } - - - - //apply to unit vector - - Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*-4,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length*-1,0); - Rotation rot = new Rotation(volName + "_rotation",rotations[0],rotations[1],rotations[2]); - lcdd.add(pos); - lcdd.add(rot); - - - PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); - if(_debug) { - System.out.println("Created physical vomume " + basePV.getName()); - } - - - - - volName = volName + "_sub"; - Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); - lcdd.add(boxSub); - Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); - Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); - Rotation subRot = new Rotation(volName + "_rotation",0,0,0); - lcdd.add(subPos); - lcdd.add(subRot); - PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); - if(_debug) { - System.out.println("Created physical vomume " + subBasePV.getName()); - } - - lcdd.add(volumeSub); - volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); - - lcdd.add(volume); - - - - - } - - - - - private void makeExample8(LCDD lcdd, SensitiveDetector sens) throws JDOMException { - - - if(_debug) { - System.out.println("--- makeExample8 ----"); - - } - - String volName = "example8"; - Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); - lcdd.add(box); - Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); - - - Hep3Vector u = new BasicHep3Vector(1,0,0); - Hep3Vector v = new BasicHep3Vector(0,1,0); - Hep3Vector w = new BasicHep3Vector(0,0,1); - - org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w.v()); - - Hep3Vector u_L1 = new BasicHep3Vector(1/Math.sqrt(2),0,1/Math.sqrt(2)); - Hep3Vector v_L1 = new BasicHep3Vector(-1/Math.sqrt(2),0,1/Math.sqrt(2)); - Hep3Vector w_L1 = new BasicHep3Vector(0,-1,0); - - Hep3Vector euler_angles = TransformationUtils.getCardanAngles(u_L1, v_L1, u, v); - - + + + + + */ + + Hep3Vector u = new BasicHep3Vector(1,0,0); + Hep3Vector v = new BasicHep3Vector(0,1,0); + Hep3Vector w = new BasicHep3Vector(0,0,1); + + Hep3Vector u_L1 = new BasicHep3Vector(0.99955, 0.030000, 0.0000); + Hep3Vector v_L1 = new BasicHep3Vector(-0.030000, 0.99955, 0.0000); + Hep3Vector w_L1 = new BasicHep3Vector(0.0000, 0.0000, 1.0000); + + + + org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_L1 = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u_L1.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_L1 = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v_L1.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_L1 = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w_L1.v()); + + org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w.v()); + + Hep3Vector euler_angles = TransformationUtils.getCardanAngles(v_L1, w_L1, v, w); + + //Get the generic rotation + org.apache.commons.math3.geometry.euclidean.threed.Rotation r = new org.apache.commons.math3.geometry.euclidean.threed.Rotation(v_3D_L1,w_3D_L1,v_3D, w_3D); + //Get the angles + double rotations[] = r.getAngles(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ); + + if(_debug) { + System.out.println("getEulerAngles gives euler_angles: " + euler_angles.toString()); + System.out.println("manual gives euler_angles: (" + rotations[0] + "," + rotations[1] + "," + rotations[2] + ")"); + } + + if((rotations[0]-euler_angles.x())>0.00001 || (rotations[1]-euler_angles.y())>0.00001 || (rotations[2]-euler_angles.z())>0.00001) { + //throw new RuntimeException("closing the loop in apache rotation didn't work!"); + } + + + + + Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*4,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length*-1.5,0); + Rotation rot = new Rotation(volName + "_rotation",rotations[0],rotations[1],rotations[2]); + lcdd.add(pos); + lcdd.add(rot); + + + PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); + if(_debug) { + System.out.println("Created physical vomume " + basePV.getName()); + } + + + + volName = volName + "_sub"; + Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); + lcdd.add(boxSub); + Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); + Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); + Rotation subRot = new Rotation(volName + "_rotation",0,0,0); + lcdd.add(subPos); + lcdd.add(subRot); + PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); + if(_debug) { + System.out.println("Created physical vomume " + subBasePV.getName()); + } + + lcdd.add(volumeSub); + volumeSub.setVisAttributes(lcdd.getVisAttributes("HybridVis")); + + lcdd.add(volume); + + + + + } + + + private void makeExample6(LCDD lcdd, SensitiveDetector sens) throws JDOMException { + + + if(_debug) { + System.out.println("--- makeExample6 ----"); + + } + + String volName = "example6"; + Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); + lcdd.add(box); + Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); + + double [] rotations = {-0.5*Math.PI,0,0}; + + + if(_debug) { + + + System.out.println("manual set lcdd angles: (" + rotations[0] + "," + rotations[1] + "," + rotations[2] + ")"); + + } + + + + //apply to unit vector + + Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*-2,0,0); + Rotation rot = new Rotation(volName + "_rotation",rotations[0],rotations[1],rotations[2]); + lcdd.add(pos); + lcdd.add(rot); + + + PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); + if(_debug) { + System.out.println("Created physical vomume " + basePV.getName()); + } + + + + + volName = volName + "_sub"; + Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); + lcdd.add(boxSub); + Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); + Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); + Rotation subRot = new Rotation(volName + "_rotation",0,0,0); + lcdd.add(subPos); + lcdd.add(subRot); + PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); + if(_debug) { + System.out.println("Created physical vomume " + subBasePV.getName()); + } + + lcdd.add(volumeSub); + volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); + + lcdd.add(volume); + + + + + } + + + + private void makeExample66(LCDD lcdd, SensitiveDetector sens) throws JDOMException { + + + if(_debug) { + System.out.println("--- makeExample66 ----"); + + } + + String volName = "example66"; + Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); + lcdd.add(box); + Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); + + + + Hep3Vector u = new BasicHep3Vector(1,0,0); + Hep3Vector v = new BasicHep3Vector(0,1,0); + Hep3Vector w = new BasicHep3Vector(0,0,1); + + org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w.v()); + + + + //set up a rotation about the X axis + org.apache.commons.math3.geometry.euclidean.threed.Rotation r1 = new org.apache.commons.math3.geometry.euclidean.threed.Rotation(u_3D, -0.5*Math.PI); + + // find y' and z' + org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_p = r1.applyTo(u_3D); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_p = r1.applyTo(v_3D); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_p = r1.applyTo(w_3D); + + + double [] rotations = r1.getAngles(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ); + + + if(_debug) { + System.out.println("u_3D: " + u_3D.toString()); + System.out.println("v_3D: " + v_3D.toString()); + System.out.println("w_3D: " + w_3D.toString()); + r1.toString(); + System.out.println("u_3D_p: " + u_3D_p.toString()); + System.out.println("v_3D_p: " + v_3D_p.toString()); + System.out.println("w_3D_p: " + w_3D_p.toString()); + + System.out.println("gives euler_angles: (" + rotations[0] + "," + rotations[1] + "," + rotations[2] + ")"); + + } + + + + //apply to unit vector + + Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*-4,0,0); + Rotation rot = new Rotation(volName + "_rotation",rotations[0],rotations[1],rotations[2]); + lcdd.add(pos); + lcdd.add(rot); + + + PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); + if(_debug) { + System.out.println("Created physical vomume " + basePV.getName()); + } + + + + + volName = volName + "_sub"; + Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); + lcdd.add(boxSub); + Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); + Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); + Rotation subRot = new Rotation(volName + "_rotation",0,0,0); + lcdd.add(subPos); + lcdd.add(subRot); + PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); + if(_debug) { + System.out.println("Created physical vomume " + subBasePV.getName()); + } + + lcdd.add(volumeSub); + volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); + + lcdd.add(volume); + + + + + } + + + + + + + private void makeExample7(LCDD lcdd, SensitiveDetector sens) throws JDOMException { + + + if(_debug) { + System.out.println("--- makeExample7 ----"); + + } + + String volName = "example7"; + Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); + lcdd.add(box); + Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); + + double [] rotations = {-0.5*Math.PI,0,-0.25*Math.PI}; + + + if(_debug) { + + + System.out.println("manual set lcdd angles: (" + rotations[0] + "," + rotations[1] + "," + rotations[2] + ")"); + + } + + + + //apply to unit vector + + Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*-2,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length*-1,0); + Rotation rot = new Rotation(volName + "_rotation",rotations[0],rotations[1],rotations[2]); + lcdd.add(pos); + lcdd.add(rot); + + + PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); + if(_debug) { + System.out.println("Created physical vomume " + basePV.getName()); + } + + + + + volName = volName + "_sub"; + Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); + lcdd.add(boxSub); + Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); + Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); + Rotation subRot = new Rotation(volName + "_rotation",0,0,0); + lcdd.add(subPos); + lcdd.add(subRot); + PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); + if(_debug) { + System.out.println("Created physical vomume " + subBasePV.getName()); + } + + lcdd.add(volumeSub); + volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); + + lcdd.add(volume); + + + + + } + + + + private void makeExample77(LCDD lcdd, SensitiveDetector sens) throws JDOMException { + + + if(_debug) { + System.out.println("--- makeExample77 ----"); + + } + + String volName = "example77"; + Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); + lcdd.add(box); + Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); + + + + Hep3Vector u = new BasicHep3Vector(1,0,0); + Hep3Vector v = new BasicHep3Vector(0,1,0); + Hep3Vector w = new BasicHep3Vector(0,0,1); + + org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w.v()); + + + + //set up a rotation about the X axis + org.apache.commons.math3.geometry.euclidean.threed.Rotation r1 = new org.apache.commons.math3.geometry.euclidean.threed.Rotation(u_3D, -0.5*Math.PI); + + // find y' and z' + org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_p = r1.applyTo(u_3D); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_p = r1.applyTo(v_3D); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_p = r1.applyTo(w_3D); + + + //set up a rotation about the Z xis + org.apache.commons.math3.geometry.euclidean.threed.Rotation r3 = new org.apache.commons.math3.geometry.euclidean.threed.Rotation(w_3D_p, -0.25*Math.PI); + + org.apache.commons.math3.geometry.euclidean.threed.Rotation r13 = r3.applyTo(r1); + + // find y'' and z'' + org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_pp = r13.applyTo(u_3D); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_pp = r13.applyTo(v_3D); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_pp = r13.applyTo(w_3D); + + // find y'' and z'' (cross-check) + org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D_pp_2 = r3.applyTo(u_3D_p); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D_pp_2 = r3.applyTo(v_3D_p); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D_pp_2 = r3.applyTo(w_3D_p); + + + double [] rotations = r13.getAngles(org.apache.commons.math3.geometry.euclidean.threed.RotationOrder.XYZ); + + + if(_debug) { + System.out.println("u_3D: " + u_3D.toString()); + System.out.println("v_3D: " + v_3D.toString()); + System.out.println("w_3D: " + w_3D.toString()); + r1.toString(); + System.out.println("u_3D_p: " + u_3D_p.toString()); + System.out.println("v_3D_p: " + v_3D_p.toString()); + System.out.println("w_3D_p: " + w_3D_p.toString()); + r13.toString(); + System.out.println("u_3D_pp: " + u_3D_pp.toString()); + System.out.println("v_3D_pp: " + v_3D_pp.toString()); + System.out.println("w_3D_pp: " + w_3D_pp.toString()); + + System.out.println("gives euler_angles: (" + rotations[0] + "," + rotations[1] + "," + rotations[2] + ")"); + + System.out.println("u_3D_pp_2: " + u_3D_pp_2.toString()); + System.out.println("v_3D_pp_2: " + v_3D_pp_2.toString()); + System.out.println("w_3D_pp_2: " + w_3D_pp_2.toString()); + } + + + + //apply to unit vector + + Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*-4,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length*-1,0); + Rotation rot = new Rotation(volName + "_rotation",rotations[0],rotations[1],rotations[2]); + lcdd.add(pos); + lcdd.add(rot); + + + PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); + if(_debug) { + System.out.println("Created physical vomume " + basePV.getName()); + } + + + + + volName = volName + "_sub"; + Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); + lcdd.add(boxSub); + Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); + Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); + Rotation subRot = new Rotation(volName + "_rotation",0,0,0); + lcdd.add(subPos); + lcdd.add(subRot); + PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); + if(_debug) { + System.out.println("Created physical vomume " + subBasePV.getName()); + } + + lcdd.add(volumeSub); + volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); + + lcdd.add(volume); + + + + + } + + + + + private void makeExample8(LCDD lcdd, SensitiveDetector sens) throws JDOMException { if(_debug) { - - - System.out.println("euler angles " + euler_angles.toString()); - + System.out.println("--- makeExample8 ----"); + } - - - //apply to unit vector - + String volName = "example8"; + Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); + lcdd.add(box); + Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); + + + Hep3Vector u = new BasicHep3Vector(1,0,0); + Hep3Vector v = new BasicHep3Vector(0,1,0); + Hep3Vector w = new BasicHep3Vector(0,0,1); + + org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w.v()); + + Hep3Vector u_L1 = new BasicHep3Vector(1/Math.sqrt(2),0,1/Math.sqrt(2)); + Hep3Vector v_L1 = new BasicHep3Vector(-1/Math.sqrt(2),0,1/Math.sqrt(2)); + Hep3Vector w_L1 = new BasicHep3Vector(0,-1,0); + + Hep3Vector euler_angles = TransformationUtils.getCardanAngles(u_L1, v_L1, u, v); + + + + + if(_debug) { + + + System.out.println("euler angles " + euler_angles.toString()); + + } + + + + //apply to unit vector + Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*-1,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length*-3,0); Rotation rot = new Rotation(volName + "_rotation",euler_angles.x(),euler_angles.y(),euler_angles.z()); lcdd.add(pos); lcdd.add(rot); - - + + PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); if(_debug) { - System.out.println("Created physical vomume " + basePV.getName()); + System.out.println("Created physical vomume " + basePV.getName()); } - + @@ -1244,197 +1244,197 @@ lcdd.add(subRot); PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); if(_debug) { - System.out.println("Created physical vomume " + subBasePV.getName()); + System.out.println("Created physical vomume " + subBasePV.getName()); } - + lcdd.add(volumeSub); volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); lcdd.add(volume); - - - - - } - - - - private void makeExample9(LCDD lcdd, SensitiveDetector sens) throws JDOMException { - - - if(_debug) { - System.out.println("--- makeExample9 ----"); - - } - - String volName = "example9"; - Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); - lcdd.add(box); - Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); - - - Hep3Vector u = new BasicHep3Vector(1,0,0); - Hep3Vector v = new BasicHep3Vector(0,1,0); - Hep3Vector w = new BasicHep3Vector(0,0,1); - - org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w.v()); - - Hep3Vector u_L1 = new BasicHep3Vector(1,0,0); - Hep3Vector v_L1 = new BasicHep3Vector(0,0,1); - Hep3Vector w_L1 = new BasicHep3Vector(0,-1,0); - - Hep3Vector euler_angles = TransformationUtils.getCardanAngles(u_L1, v_L1, u, v); - - - - - if(_debug) { - - - System.out.println("euler angles " + euler_angles.toString()); - - } - - - - //apply to unit vector - - Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*-1,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length*-2,0); - Rotation rot = new Rotation(volName + "_rotation",euler_angles.x(),euler_angles.y(),euler_angles.z()); - lcdd.add(pos); - lcdd.add(rot); - - - PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); - if(_debug) { - System.out.println("Created physical vomume " + basePV.getName()); - } - - - - - volName = volName + "_sub"; - Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); - lcdd.add(boxSub); - Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); - Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); - Rotation subRot = new Rotation(volName + "_rotation",0,0,0); - lcdd.add(subPos); - lcdd.add(subRot); - PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); - if(_debug) { - System.out.println("Created physical vomume " + subBasePV.getName()); - } - - lcdd.add(volumeSub); - volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); - - lcdd.add(volume); - - - - - } - - - - - - private void makeExample10(LCDD lcdd, SensitiveDetector sens) throws JDOMException { - - - if(_debug) { - System.out.println("--- makeExample10 ----"); - - } - - String volName = "example10"; - Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); - lcdd.add(box); - Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); - - - Hep3Vector u = new BasicHep3Vector(1,0,0); - Hep3Vector v = new BasicHep3Vector(0,1,0); - Hep3Vector w = new BasicHep3Vector(0,0,1); - - org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v.v()); - org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w.v()); - - Hep3Vector u_L1 = new BasicHep3Vector(1/Math.sqrt(2),1/Math.sqrt(2),0); - Hep3Vector v_L1 = new BasicHep3Vector(0,0,1); - Hep3Vector w_L1 = new BasicHep3Vector(1/Math.sqrt(2),-1/Math.sqrt(2),0); - - Hep3Vector euler_angles = TransformationUtils.getCardanAngles(u_L1, v_L1, u, v); - - - - - if(_debug) { - - - System.out.println("euler angles " + euler_angles.toString()); - - } - - - - //apply to unit vector - - Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*-2,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length*-2,0); - Rotation rot = new Rotation(volName + "_rotation",euler_angles.x(),euler_angles.y(),euler_angles.z()); - lcdd.add(pos); - lcdd.add(rot); - - - PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); - if(_debug) { - System.out.println("Created physical vomume " + basePV.getName()); - } - - - - - volName = volName + "_sub"; - Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); - lcdd.add(boxSub); - Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); - Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); - Rotation subRot = new Rotation(volName + "_rotation",0,0,0); - lcdd.add(subPos); - lcdd.add(subRot); - PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); - if(_debug) { - System.out.println("Created physical vomume " + subBasePV.getName()); - } - - lcdd.add(volumeSub); - volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); - - lcdd.add(volume); - - - - - } + + + + + } + + + + private void makeExample9(LCDD lcdd, SensitiveDetector sens) throws JDOMException { + + + if(_debug) { + System.out.println("--- makeExample9 ----"); + + } + + String volName = "example9"; + Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); + lcdd.add(box); + Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); + + + Hep3Vector u = new BasicHep3Vector(1,0,0); + Hep3Vector v = new BasicHep3Vector(0,1,0); + Hep3Vector w = new BasicHep3Vector(0,0,1); + + org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w.v()); + + Hep3Vector u_L1 = new BasicHep3Vector(1,0,0); + Hep3Vector v_L1 = new BasicHep3Vector(0,0,1); + Hep3Vector w_L1 = new BasicHep3Vector(0,-1,0); + + Hep3Vector euler_angles = TransformationUtils.getCardanAngles(u_L1, v_L1, u, v); + + + + + if(_debug) { + + + System.out.println("euler angles " + euler_angles.toString()); + + } + + + + //apply to unit vector + + Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*-1,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length*-2,0); + Rotation rot = new Rotation(volName + "_rotation",euler_angles.x(),euler_angles.y(),euler_angles.z()); + lcdd.add(pos); + lcdd.add(rot); + + + PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); + if(_debug) { + System.out.println("Created physical vomume " + basePV.getName()); + } + + + + + volName = volName + "_sub"; + Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); + lcdd.add(boxSub); + Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); + Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); + Rotation subRot = new Rotation(volName + "_rotation",0,0,0); + lcdd.add(subPos); + lcdd.add(subRot); + PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); + if(_debug) { + System.out.println("Created physical vomume " + subBasePV.getName()); + } + + lcdd.add(volumeSub); + volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); + + lcdd.add(volume); + + + + + } + + + + + + private void makeExample10(LCDD lcdd, SensitiveDetector sens) throws JDOMException { + + + if(_debug) { + System.out.println("--- makeExample10 ----"); + + } + + String volName = "example10"; + Box box = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/4.0); + lcdd.add(box); + Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum")); + + + Hep3Vector u = new BasicHep3Vector(1,0,0); + Hep3Vector v = new BasicHep3Vector(0,1,0); + Hep3Vector w = new BasicHep3Vector(0,0,1); + + org.apache.commons.math3.geometry.euclidean.threed.Vector3D u_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(u.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D v_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(v.v()); + org.apache.commons.math3.geometry.euclidean.threed.Vector3D w_3D = new org.apache.commons.math3.geometry.euclidean.threed.Vector3D(w.v()); + + Hep3Vector u_L1 = new BasicHep3Vector(1/Math.sqrt(2),1/Math.sqrt(2),0); + Hep3Vector v_L1 = new BasicHep3Vector(0,0,1); + Hep3Vector w_L1 = new BasicHep3Vector(1/Math.sqrt(2),-1/Math.sqrt(2),0); + + Hep3Vector euler_angles = TransformationUtils.getCardanAngles(u_L1, v_L1, u, v); + + + + + if(_debug) { + + + System.out.println("euler angles " + euler_angles.toString()); + + } + + + + //apply to unit vector + + Position pos = new Position(volName + "_position",HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width*1.5*-2,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length*-2,0); + Rotation rot = new Rotation(volName + "_rotation",euler_angles.x(),euler_angles.y(),euler_angles.z()); + lcdd.add(pos); + lcdd.add(rot); + + + PhysVol basePV = new PhysVol(volume, lcdd.pickMotherVolume(this), pos, rot); + if(_debug) { + System.out.println("Created physical vomume " + basePV.getName()); + } + + + + + volName = volName + "_sub"; + Box boxSub = new Box(volName + "Box", HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_width, HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0 , HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/8.0); + lcdd.add(boxSub); + Volume volumeSub = new Volume(volName + "_volume", boxSub, lcdd.getMaterial("Vacuum")); + Position subPos = new Position(volName + "_position",0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/4.0*2-HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_length/8.0,HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope.base_height/16.0); + Rotation subRot = new Rotation(volName + "_rotation",0,0,0); + lcdd.add(subPos); + lcdd.add(subRot); + PhysVol subBasePV = new PhysVol(volumeSub, volume, subPos, subRot); + if(_debug) { + System.out.println("Created physical vomume " + subBasePV.getName()); + } + + lcdd.add(volumeSub); + volumeSub.setVisAttributes(lcdd.getVisAttributes("SensorVis")); + + lcdd.add(volume); + + + + + } - - - - - - - - - - - - - + + + + + + + + + + + + + } Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker.java Wed Mar 9 11:43:24 2016 @@ -69,7 +69,7 @@ // layer for (Iterator i = node.getChildren("layer").iterator(); i.hasNext();) { - // Modules are numbered from 0 starting in each layer. + // Modules are numbered from 0 starting in each layer. int moduleNumber = 0; Element layerElement = (Element) i.next(); Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2.java Wed Mar 9 11:43:24 2016 @@ -53,79 +53,79 @@ } // Place modules within the tracking volume. - private void createModulePlacements(LCDD lcdd, int sysId, String subdetName) throws DataConversionException { - //Volume trackingVolume = lcdd.getTrackingVolume(); - Volume momVolume = lcdd.pickMotherVolume(this); - // Loop over layers. + private void createModulePlacements(LCDD lcdd, int sysId, String subdetName) throws DataConversionException { + //Volume trackingVolume = lcdd.getTrackingVolume(); + Volume momVolume = lcdd.pickMotherVolume(this); + // Loop over layers. for (Iterator i = node.getChildren("layer").iterator(); i.hasNext();) { - Element layerElement = (Element)i.next(); - int layerNumber = layerElement.getAttribute("id").getIntValue(); - // Loop over modules within layer. - for (Iterator j = layerElement.getChildren("module_placement").iterator(); j.hasNext();) { - - Element modulePlacementElement = (Element)j.next(); - String moduleName = modulePlacementElement.getAttributeValue("name"); - int moduleNumber = modulePlacementElement.getAttribute("id").getIntValue(); - - // Get the position and rotation parameters. All must be explicitly specified. - double x, y, z; - double rx, ry, rz; - x = modulePlacementElement.getAttribute("x").getDoubleValue(); - y = modulePlacementElement.getAttribute("y").getDoubleValue(); - z = modulePlacementElement.getAttribute("z").getDoubleValue(); - rx = modulePlacementElement.getAttribute("rx").getDoubleValue(); - ry = modulePlacementElement.getAttribute("ry").getDoubleValue(); - rz = modulePlacementElement.getAttribute("rz").getDoubleValue(); - - // Place the module with position and rotation from above. - String modulePlacementName = subdetName + "_" + moduleName + "_layer" + layerNumber + "_module" + moduleNumber; - Position p = new Position(modulePlacementName + "_position", x, y, z); - Rotation r = new Rotation(modulePlacementName + "_rotation", rx, ry, rz); - lcdd.add(p); - lcdd.add(r); - //PhysVol modulePhysVol = new PhysVol(modules.get(moduleName), trackingVolume, p, r); - PhysVol modulePhysVol = new PhysVol(modules.get(moduleName), momVolume, p, r); - - // Add identifier values to the placement volume. - modulePhysVol.addPhysVolID("system", sysId); - modulePhysVol.addPhysVolID("barrel", 0); - modulePhysVol.addPhysVolID("layer", layerNumber); - modulePhysVol.addPhysVolID("module", moduleNumber); - } - } - } + Element layerElement = (Element)i.next(); + int layerNumber = layerElement.getAttribute("id").getIntValue(); + // Loop over modules within layer. + for (Iterator j = layerElement.getChildren("module_placement").iterator(); j.hasNext();) { + + Element modulePlacementElement = (Element)j.next(); + String moduleName = modulePlacementElement.getAttributeValue("name"); + int moduleNumber = modulePlacementElement.getAttribute("id").getIntValue(); + + // Get the position and rotation parameters. All must be explicitly specified. + double x, y, z; + double rx, ry, rz; + x = modulePlacementElement.getAttribute("x").getDoubleValue(); + y = modulePlacementElement.getAttribute("y").getDoubleValue(); + z = modulePlacementElement.getAttribute("z").getDoubleValue(); + rx = modulePlacementElement.getAttribute("rx").getDoubleValue(); + ry = modulePlacementElement.getAttribute("ry").getDoubleValue(); + rz = modulePlacementElement.getAttribute("rz").getDoubleValue(); + + // Place the module with position and rotation from above. + String modulePlacementName = subdetName + "_" + moduleName + "_layer" + layerNumber + "_module" + moduleNumber; + Position p = new Position(modulePlacementName + "_position", x, y, z); + Rotation r = new Rotation(modulePlacementName + "_rotation", rx, ry, rz); + lcdd.add(p); + lcdd.add(r); + //PhysVol modulePhysVol = new PhysVol(modules.get(moduleName), trackingVolume, p, r); + PhysVol modulePhysVol = new PhysVol(modules.get(moduleName), momVolume, p, r); + + // Add identifier values to the placement volume. + modulePhysVol.addPhysVolID("system", sysId); + modulePhysVol.addPhysVolID("barrel", 0); + modulePhysVol.addPhysVolID("layer", layerNumber); + modulePhysVol.addPhysVolID("module", moduleNumber); + } + } + } // Create the module logical volumes. - private void createModules(LCDD lcdd, SensitiveDetector sd) { + private void createModules(LCDD lcdd, SensitiveDetector sd) { for (Iterator i = node.getChildren("module").iterator(); i.hasNext();) { Element module = (Element) i.next(); String moduleName = module.getAttributeValue("name"); moduleParameters.put(moduleName, new ModuleParameters(module)); modules.put(moduleName, makeModule(moduleParameters.get(moduleName), sd, lcdd)); } - } - - private Volume makeModule(ModuleParameters params, SensitiveDetector sd, LCDD lcdd) { - double thickness = params.getThickness(); - double x, y; - // x = params.getDimension(0); - // y = params.getDimension(1); - y = params.getDimension(0); // Y is in X plane in world coordinates. - x = params.getDimension(1); // X is in Y plane in world coordinates. - // System.out.println("making module with x = " + x + " and y = " + y); - Box box = new Box(params.getName() + "Box", x, y, thickness); - lcdd.add(box); - - Volume moduleVolume = new Volume(params.getName() + "Volume", box, vacuum); - makeModuleComponents(moduleVolume, params, sd, lcdd); - lcdd.add(moduleVolume); - - if (params.getVis() != null) { - moduleVolume.setVisAttributes(lcdd.getVisAttributes(params.getVis())); - } - - return moduleVolume; - } + } + + private Volume makeModule(ModuleParameters params, SensitiveDetector sd, LCDD lcdd) { + double thickness = params.getThickness(); + double x, y; + // x = params.getDimension(0); + // y = params.getDimension(1); + y = params.getDimension(0); // Y is in X plane in world coordinates. + x = params.getDimension(1); // X is in Y plane in world coordinates. + // System.out.println("making module with x = " + x + " and y = " + y); + Box box = new Box(params.getName() + "Box", x, y, thickness); + lcdd.add(box); + + Volume moduleVolume = new Volume(params.getName() + "Volume", box, vacuum); + makeModuleComponents(moduleVolume, params, sd, lcdd); + lcdd.add(moduleVolume); + + if (params.getVis() != null) { + moduleVolume.setVisAttributes(lcdd.getVisAttributes(params.getVis())); + } + + return moduleVolume; + } private void makeModuleComponents(Volume moduleVolume, ModuleParameters moduleParameters, SensitiveDetector sd, LCDD lcdd) { Box envelope = (Box) lcdd.getSolid(moduleVolume.getSolidRef()); Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014.java Wed Mar 9 11:43:24 2016 @@ -61,7 +61,7 @@ return moduleNumber; } - + } Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/subdetector/HPSTestRunTracker2014.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/subdetector/HPSTestRunTracker2014.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/subdetector/HPSTestRunTracker2014.java Wed Mar 9 11:43:24 2016 @@ -9,21 +9,21 @@ public class HPSTestRunTracker2014 extends AbstractTracker { - public HPSTestRunTracker2014(Element node) throws JDOMException - { - super(node); - } + public HPSTestRunTracker2014(Element node) throws JDOMException + { + super(node); + } - public void appendHepRep(HepRepFactory factory, HepRep heprep) - { + public void appendHepRep(HepRepFactory factory, HepRep heprep) + { DetectorElementToHepRepConverter.convert(getDetectorElement(), factory, heprep, -1, false, getVisAttributes().getColor()); - } - - public boolean isEndcap() { - return false; - } - - public boolean isBarrel() { - return true; - } + } + + public boolean isEndcap() { + return false; + } + + public boolean isBarrel() { + return true; + } } Modified: java/trunk/detector-model/src/test/java/org/lcsim/detector/converter/compact/HPSTracker2ConverterTest.java ============================================================================= --- java/trunk/detector-model/src/test/java/org/lcsim/detector/converter/compact/HPSTracker2ConverterTest.java (original) +++ java/trunk/detector-model/src/test/java/org/lcsim/detector/converter/compact/HPSTracker2ConverterTest.java Wed Mar 9 11:43:24 2016 @@ -36,8 +36,8 @@ private static final int TOTAL_NUMBER_OF_STEREO_LAYERS = 10; private static final String SUBDETECTOR_NAME = "Tracker"; - public static final int NUMBER_OF_READOUT_STRIPS = 639; - public static final int NUMBER_OF_SENSE_STRIPS = 1277; + public static final int NUMBER_OF_READOUT_STRIPS = 639; + public static final int NUMBER_OF_SENSE_STRIPS = 1277; //-----------------// //-----------------// @@ -74,12 +74,12 @@ for(HpsSiSensor sensor : sensors) { assertTrue("[ " + this.getClass().getSimpleName() + " ]: Sensor is of wrong type: " + sensor.getClass().getSimpleName(), sensor instanceof HpsSiSensor); - assertTrue("[ " + this.getClass().getSimpleName() + " ]: Wrong number of readout electrodes found.", - sensor.getReadoutElectrodes(ChargeCarrier.HOLE).getNCells() == NUMBER_OF_READOUT_STRIPS); - - assertTrue("[ " + this.getClass().getSimpleName() + " ]: Wrong number of sense electrodes found.", - sensor.getSenseElectrodes(ChargeCarrier.HOLE).getNCells() == NUMBER_OF_SENSE_STRIPS); - LOGGER.info(sensor.toString()); + assertTrue("[ " + this.getClass().getSimpleName() + " ]: Wrong number of readout electrodes found.", + sensor.getReadoutElectrodes(ChargeCarrier.HOLE).getNCells() == NUMBER_OF_READOUT_STRIPS); + + assertTrue("[ " + this.getClass().getSimpleName() + " ]: Wrong number of sense electrodes found.", + sensor.getSenseElectrodes(ChargeCarrier.HOLE).getNCells() == NUMBER_OF_SENSE_STRIPS); + LOGGER.info(sensor.toString()); } LOGGER.info("Sensors were all initialized correctly."); Modified: java/trunk/detector-model/src/test/java/org/lcsim/geometry/compact/converter/lcdd/HPSTestRunTracker2014LCDDTest.java ============================================================================= --- java/trunk/detector-model/src/test/java/org/lcsim/geometry/compact/converter/lcdd/HPSTestRunTracker2014LCDDTest.java (original) +++ java/trunk/detector-model/src/test/java/org/lcsim/geometry/compact/converter/lcdd/HPSTestRunTracker2014LCDDTest.java Wed Mar 9 11:43:24 2016 @@ -18,7 +18,7 @@ { public HPSTestRunTracker2014LCDDTest(String name) { - super(name); + super(name); } public static TestSuite suite() Modified: java/trunk/detector-model/src/test/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014LCDDTest.java ============================================================================= --- java/trunk/detector-model/src/test/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014LCDDTest.java (original) +++ java/trunk/detector-model/src/test/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014LCDDTest.java Wed Mar 9 11:43:24 2016 @@ -18,7 +18,7 @@ { public HPSTracker2014LCDDTest(String name) { - super(name); + super(name); } public static TestSuite suite() Modified: java/trunk/detector-model/src/test/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014v1LCDDTest.java ============================================================================= --- java/trunk/detector-model/src/test/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014v1LCDDTest.java (original) +++ java/trunk/detector-model/src/test/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014v1LCDDTest.java Wed Mar 9 11:43:24 2016 @@ -18,7 +18,7 @@ { public HPSTracker2014v1LCDDTest(String name) { - super(name); + super(name); } public static TestSuite suite() Modified: java/trunk/detector-model/src/test/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014v1SurveyLCDDTest.java ============================================================================= --- java/trunk/detector-model/src/test/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014v1SurveyLCDDTest.java (original) +++ java/trunk/detector-model/src/test/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014v1SurveyLCDDTest.java Wed Mar 9 11:43:24 2016 @@ -18,7 +18,7 @@ { public HPSTracker2014v1SurveyLCDDTest(String name) { - super(name); + super(name); } public static TestSuite suite() Modified: java/trunk/detector-model/src/test/java/org/lcsim/geometry/subdetector/HPSTestRunTracker2014Test.java ============================================================================= --- java/trunk/detector-model/src/test/java/org/lcsim/geometry/subdetector/HPSTestRunTracker2014Test.java (original) +++ java/trunk/detector-model/src/test/java/org/lcsim/geometry/subdetector/HPSTestRunTracker2014Test.java Wed Mar 9 11:43:24 2016 @@ -19,36 +19,36 @@ */ public class HPSTestRunTracker2014Test extends TestCase { - - Detector det; - public HPSTestRunTracker2014Test(String name) { - super(name); - } - - protected void setUp() throws Exception { - GeometryReader geometryReader = new GeometryReader(); - geometryReader.setBuildDetailed(true); - String pathToCompactFile = "/org/lcsim/geometry/subdetector/HPSTestRunTracker2014.xml"; + + Detector det; + public HPSTestRunTracker2014Test(String name) { + super(name); + } + + protected void setUp() throws Exception { + GeometryReader geometryReader = new GeometryReader(); + geometryReader.setBuildDetailed(true); + String pathToCompactFile = "/org/lcsim/geometry/subdetector/HPSTestRunTracker2014.xml"; - InputStream in = HPSTestRunTracker2014Test.class.getResourceAsStream(pathToCompactFile); - det = geometryReader.read(in); - - System.out.printf("%s: detector name converted: %s\n",this.getClass().getSimpleName(), det.getName()); - - - } - - public void test() { - - -// IDetectorElementStore store = DetectorElementStore.getInstance(); -// System.out.printf("%s: Printing %d DE:\n",this.getClass().getSimpleName(), store.size()); -// System.out.printf("%s: %50s %40s %50s %50s\n",this.getClass().getSimpleName(), "name", "pos", "path","mother"); -// for(IDetectorElement e : store) { -// System.out.printf("%s: %50s %40s %50s %50s \n",this.getClass().getSimpleName(), e.getName(),e.hasGeometryInfo()?e.getGeometry().getPosition().toString():" - ",e.hasGeometryInfo()?((PhysicalVolumePath)e.getGeometry().getPath()).toString():" - ",e.getParent()==null?" - ":e.getParent().getName()); -// } - - IDetectorElementStore store = DetectorElementStore.getInstance(); + InputStream in = HPSTestRunTracker2014Test.class.getResourceAsStream(pathToCompactFile); + det = geometryReader.read(in); + + System.out.printf("%s: detector name converted: %s\n",this.getClass().getSimpleName(), det.getName()); + + + } + + public void test() { + + +// IDetectorElementStore store = DetectorElementStore.getInstance(); +// System.out.printf("%s: Printing %d DE:\n",this.getClass().getSimpleName(), store.size()); +// System.out.printf("%s: %50s %40s %50s %50s\n",this.getClass().getSimpleName(), "name", "pos", "path","mother"); +// for(IDetectorElement e : store) { +// System.out.printf("%s: %50s %40s %50s %50s \n",this.getClass().getSimpleName(), e.getName(),e.hasGeometryInfo()?e.getGeometry().getPosition().toString():" - ",e.hasGeometryInfo()?((PhysicalVolumePath)e.getGeometry().getPath()).toString():" - ",e.getParent()==null?" - ":e.getParent().getName()); +// } + + IDetectorElementStore store = DetectorElementStore.getInstance(); System.out.printf("%s: Printing %d DE:\n",this.getClass().getSimpleName(), store.size()); System.out.printf("%s: %50s %40s %50s %50s %s\n",this.getClass().getSimpleName(), "name", "pos", "path","mother", "expId"); for(IDetectorElement e : store) { @@ -58,8 +58,8 @@ expId = e.getExpandedIdentifier(); System.out.printf("%s: %50s %40s %50s %50s %s\n",this.getClass().getSimpleName(), e.getName(),e.hasGeometryInfo()?e.getGeometry().getPosition().toString():" - ",e.hasGeometryInfo()?((PhysicalVolumePath)e.getGeometry().getPath()).toString():" - ",e.getParent()==null?" - ":e.getParent().getName(),expId==null?" no expId ":expId.toString()); } - - } + + } } Modified: java/trunk/detector-model/src/test/resources/org/lcsim/geometry/subdetector/HPSTest.xml ============================================================================= --- java/trunk/detector-model/src/test/resources/org/lcsim/geometry/subdetector/HPSTest.xml (original) +++ java/trunk/detector-model/src/test/resources/org/lcsim/geometry/subdetector/HPSTest.xml Wed Mar 9 11:43:24 2016 @@ -50,7 +50,7 @@ <!-- <constant name="tracking_region_radius" value="200.0*cm"/> <constant name="tracking_region_min" value="5.0*cm"/> - <constant name="tracking_region_zmax" value="100.0*cm"/> + <constant name="tracking_region_zmax" value="100.0*cm"/> <constant name="xCent1" value="10*cm" /> <constant name="xCent2" value="20*cm" /> Modified: java/trunk/detector-model/src/test/resources/org/lcsim/geometry/subdetector/HPSTestRunTracker2014.xml ============================================================================= --- java/trunk/detector-model/src/test/resources/org/lcsim/geometry/subdetector/HPSTestRunTracker2014.xml (original) +++ java/trunk/detector-model/src/test/resources/org/lcsim/geometry/subdetector/HPSTestRunTracker2014.xml Wed Mar 9 11:43:24 2016 @@ -7,9 +7,9 @@ </info> <define> - <!-- units --> - <constant name="mm" value="0.1*cm"/> - <constant name="inch" value="25.4*mm"/> + <!-- units --> + <constant name="mm" value="0.1*cm"/> + <constant name="inch" value="25.4*mm"/> <!-- world --> <constant name="world_side" value="500.0*cm" /> @@ -17,8 +17,8 @@ <constant name="world_y" value="world_side" /> <constant name="world_z" value="world_side" /> - <!-- tracking region --> - <constant name="tracking_region_radius" value="200.0*cm"/> + <!-- tracking region --> + <constant name="tracking_region_radius" value="200.0*cm"/> <constant name="tracking_region_min" value="5.0*cm"/> <constant name="tracking_region_zmax" value="131.8*cm"/> @@ -34,7 +34,7 @@ </materials> <display> - + <vis name="SensorVis" alpha="1.0" r="1.0" g="0.0" b="0.0" drawingStyle="wireframe" lineStyle="unbroken" showDaughters="true" visible="true"/> <vis name="ActiveSensorVis" alpha="1.0" r="1.0" g="0.0" b="0.0" drawingStyle="solid" lineStyle="unbroken" showDaughters="true" visible="true"/> <vis name="CarbonFiberVis" alpha="1.0" r="0.88" g="0.88" b="0.88" drawingStyle="solid" lineStyle="unbroken" showDaughters="true" visible="true"/> @@ -48,7 +48,7 @@ <vis name="BasePlateVis" alpha="1.0" r="0.35" g="0.35" b="0.35" drawingStyle="solid" lineStyle="dashed" showDaughters="true" visible="true"/> <vis name="LayerVis" alpha="0.0" r="0.0" g="0.0" b="1.0" drawingStyle="wireframe" showDaughters="true" visible="false"/> <vis name="ComponentVis" alpha="0.0" r="0.0" g="0.2" b="0.4" drawingStyle="solid" showDaughters="false" visible="false"/> - <vis name="BeamPlaneVis" alpha="1.0" r="1.0" g="1.0" b="1.0" drawingStyle="solid" lineStyle="unbroken" showDaughters="false" visible="true"/> + <vis name="BeamPlaneVis" alpha="1.0" r="1.0" g="1.0" b="1.0" drawingStyle="solid" lineStyle="unbroken" showDaughters="false" visible="true"/> </display> Modified: java/trunk/distribution/src/main/java/org/hps/HPSJavaProperties.java ============================================================================= --- java/trunk/distribution/src/main/java/org/hps/HPSJavaProperties.java (original) +++ java/trunk/distribution/src/main/java/org/hps/HPSJavaProperties.java Wed Mar 9 11:43:24 2016 @@ -82,6 +82,11 @@ return this.properties.getProperty("timestamp"); } + /** + * Convert this object to a string. + * + * @return this object converted to a string + */ @Override public String toString() { final StringBuffer sb = new StringBuffer(); Modified: java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/event/Association.java ============================================================================= --- java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/event/Association.java (original) +++ java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/event/Association.java Wed Mar 9 11:43:24 2016 @@ -10,52 +10,52 @@ * @author Kyle McCarty */ public final class Association { - private final Point parent; - private final Point child; - private final Color highlight; - - /** - * <b>Association</b><br/><br/> - * <code>public <b>Association</b>(Point parentCrystal, Point childCrystal, Color highlightColor)</code><br/><br/> - * Creates an association between a child crystal and a parent - * crystal. - * @param parentCrystal - The crystal with which the child crystal - * is connected. - * @param childCrystal - The connected crystal. - * @param highlightColor - The color in which the child crystal - * should be highlighted. - */ - public Association(Point parentCrystal, Point childCrystal, Color highlightColor) { - parent = parentCrystal; - child = childCrystal; - highlight = highlightColor; - } - - /** - * <b>getChildCrystal</b><br/><br/> - * <code>public Point <b>getChildCrystal</b>()</code><br/><br/> - * Indicates the indices for the child crystal. - * @return Returns the child crystal's indices in a <code>Point - * </code> object. - */ - public Point getChildCrystal() { return child; } - - /** - * <b>getHighlight</b><br/><br/> - * <code>public Color <b>getHighlight</b>()</code><br/><br/> - * Gets the color with which the child crystal should be highlighted - * whenever the parent crystal is selected. - * @return Returns the highlight color as a <code>Color</code> object. - */ - public Color getHighlight() { return highlight; } - - /** - * <b>getParentCrystal</b><br/><br/> - * <code>public Point <b>getParentCrystal</b>()</code><br/><br/> - * Indicates the indices for the parent crystal with which the - * child crystal is connected. - * @return Returns the parent crystal's indices in a <code>Point - * </code> object. - */ - public Point getParentCrystal() { return parent; } + private final Point parent; + private final Point child; + private final Color highlight; + + /** + * <b>Association</b><br/><br/> + * <code>public <b>Association</b>(Point parentCrystal, Point childCrystal, Color highlightColor)</code><br/><br/> + * Creates an association between a child crystal and a parent + * crystal. + * @param parentCrystal - The crystal with which the child crystal + * is connected. + * @param childCrystal - The connected crystal. + * @param highlightColor - The color in which the child crystal + * should be highlighted. + */ + public Association(Point parentCrystal, Point childCrystal, Color highlightColor) { + parent = parentCrystal; + child = childCrystal; + highlight = highlightColor; + } + + /** + * <b>getChildCrystal</b><br/><br/> + * <code>public Point <b>getChildCrystal</b>()</code><br/><br/> + * Indicates the indices for the child crystal. + * @return Returns the child crystal's indices in a <code>Point + * </code> object. + */ + public Point getChildCrystal() { return child; } + + /** + * <b>getHighlight</b><br/><br/> + * <code>public Color <b>getHighlight</b>()</code><br/><br/> + * Gets the color with which the child crystal should be highlighted + * whenever the parent crystal is selected. + * @return Returns the highlight color as a <code>Color</code> object. + */ + public Color getHighlight() { return highlight; } + + /** + * <b>getParentCrystal</b><br/><br/> + * <code>public Point <b>getParentCrystal</b>()</code><br/><br/> + * Indicates the indices for the parent crystal with which the + * child crystal is connected. + * @return Returns the parent crystal's indices in a <code>Point + * </code> object. + */ + public Point getParentCrystal() { return parent; } } Modified: java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/event/Cluster.java ============================================================================= --- java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/event/Cluster.java (original) +++ java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/event/Cluster.java Wed Mar 9 11:43:24 2016 @@ -11,161 +11,161 @@ * @author Kyle McCarty */ public final class Cluster { - private final Point center; - private final double energy; - private final double time; - private ArrayList<Point> hitList = new ArrayList<Point>(); - private ArrayList<Point> shareList = new ArrayList<Point>(); - - /** - * Creates a new cluster. All clusters are required to have a - * cluster center. - * @param ix - The cluster center's x-index. - * @param iy - The cluster center's y-index. - */ - public Cluster(int ix, int iy) { this(new Point(ix, iy), Double.NaN, Double.NaN); } - - /** - * Creates a new cluster. All clusters are required to have a seed - * hit. - * @param clusterCenter - The <code>Point</code> object indicating in - * which crystal the seed hit occurred. - */ - public Cluster(Point clusterCenter) { this(clusterCenter, Double.NaN, Double.NaN); } - - /** - * Creates a new cluster. All clusters are required to have a - * cluster center. - * @param ix - The cluster center's x-index. - * @param iy - The cluster center's y-index. - * @param energy - The cluster's energy. - */ - public Cluster(int ix, int iy, double energy) { this(new Point(ix, iy), energy, Double.NaN); } - - /** - * Creates a new cluster. All clusters are required to have a - * cluster center. - * @param ix - The cluster center's x-index. - * @param iy - The cluster center's y-index. - * @param energy - The cluster's energy. - * @param time - The cluster's time-stamp. - */ - public Cluster(int ix, int iy, double energy, double time) { this(new Point(ix, iy), energy, time); } - - /** - * Creates a new cluster. All clusters are required to have a seed - * hit. - * @param clusterCenter - The <code>Point</code> object indicating in - * which crystal the seed hit occurred. - * @param energy - The cluster's energy. - */ - public Cluster(Point clusterCenter, double energy) { - this(clusterCenter, energy, Double.NaN); - } - - /** - * Creates a new cluster. All clusters are required to have a seed - * hit. - * @param clusterCenter - The <code>Point</code> object indicating in - * which crystal the seed hit occurred. - * @param energy - The cluster's energy. - * @param time - The cluster's time-stamp. - */ - public Cluster(Point clusterCenter, double energy, double time) { - center = clusterCenter; - this.energy = energy; - this.time = time; - } - - /** - * Adds an <code>Point</code> to the list of this cluster's - * component hits. - * @param ix - The component hit's x-coordinate. - * @param iy - The component hit's y-coordinate. - */ - public void addComponentHit(int ix, int iy) { hitList.add(new Point(ix, iy)); } - - /** - * Adds an <code>Point</code> to the list of this cluster's - * component hits. - * @param eHit - The <code>Point</code> object indicating in which - * crystal the hit occurred. - */ - public void addComponentHit(Point eHit) { hitList.add(eHit); } - - /** - * Adds an <code>Point</code> to the list of this cluster's shared - * hits. - * @param ix - The shared hit's x-coordinate. - * @param iy - The shared hit's y-coordinate. - */ - public void addSharedHit(int ix, int iy) { shareList.add(new Point(ix, iy)); } - - /** - * Adds an <code>Point</code> to the list of this cluster's shared - * hits. - * @param eHit - The <code>Point</code> object indicating in which - * crystal the hit occurred. - */ - public void addSharedHit(Point eHit) { shareList.add(eHit); } - - /** - * Gets the hit representing the cluster center. - * @return Returns the cluster center hit as an <code>Point</code>. - */ - public Point getClusterCenter() { return center; } - - /** - * Gets the cluster's energy, if it was defined when the cluster - * was constructed. - * @return Returns the energy of the cluster if it was defined, - * and <code>NaN</code> otherwise. - */ - public double getClusterEnergy() { return energy; } - - /** - * Gets the time stamp for the cluster in nanoseconds. - * @return Returns the cluster's time stamp. - */ - public double getClusterTime() { return time; } - - /** - * Indicates how many component hits compose this cluster. Note - * that this does not include the seed hit or shared hits. - * @return Returns the number of component hits in the cluster - * as an <code>int</code>. - */ - public int getComponentHitCount() { return hitList.size(); } - - /** - * Gets the list of hits that make up the cluster, exempting the - * seed hit and shared hits. - * @return Returns the cluster hits as a <code>List</code> object - * composed of <code>Point</code> objects. - */ - public List<Point> getComponentHits() { return hitList; } - - /** - * Indicates how many total hits compose this cluster. This includes - * component hits, shared hits, and the seed hit. - * @return Returns the number of component hits in the cluster - * as an <code>int</code>. - */ - public int getHitCount() { return hitList.size() + shareList.size() + 1; } - - /** - * Indicates how many shared hits compose this cluster. Note that - * this does not include the seed hit or component hits. - * @return Returns the number of shared hits in the cluster as an - * <code>int</code>. - */ - public int getSharedHitCount() { return shareList.size(); } - - /** - * Gets the list of hits that make up the cluster, exempting the - * seed hit and component hits. - * @return Returns the shared hits as a <code>List</code> object - * composed of <code>Point</code> objects. - */ - public List<Point> getSharedHits() { return shareList; } + private final Point center; + private final double energy; + private final double time; + private ArrayList<Point> hitList = new ArrayList<Point>(); + private ArrayList<Point> shareList = new ArrayList<Point>(); + + /** + * Creates a new cluster. All clusters are required to have a + * cluster center. + * @param ix - The cluster center's x-index. + * @param iy - The cluster center's y-index. + */ + public Cluster(int ix, int iy) { this(new Point(ix, iy), Double.NaN, Double.NaN); } + + /** + * Creates a new cluster. All clusters are required to have a seed + * hit. + * @param clusterCenter - The <code>Point</code> object indicating in + * which crystal the seed hit occurred. + */ + public Cluster(Point clusterCenter) { this(clusterCenter, Double.NaN, Double.NaN); } + + /** + * Creates a new cluster. All clusters are required to have a + * cluster center. + * @param ix - The cluster center's x-index. + * @param iy - The cluster center's y-index. + * @param energy - The cluster's energy. + */ + public Cluster(int ix, int iy, double energy) { this(new Point(ix, iy), energy, Double.NaN); } + + /** + * Creates a new cluster. All clusters are required to have a + * cluster center. + * @param ix - The cluster center's x-index. + * @param iy - The cluster center's y-index. + * @param energy - The cluster's energy. + * @param time - The cluster's time-stamp. + */ + public Cluster(int ix, int iy, double energy, double time) { this(new Point(ix, iy), energy, time); } + + /** + * Creates a new cluster. All clusters are required to have a seed + * hit. + * @param clusterCenter - The <code>Point</code> object indicating in + * which crystal the seed hit occurred. + * @param energy - The cluster's energy. + */ + public Cluster(Point clusterCenter, double energy) { + this(clusterCenter, energy, Double.NaN); + } + + /** + * Creates a new cluster. All clusters are required to have a seed + * hit. + * @param clusterCenter - The <code>Point</code> object indicating in + * which crystal the seed hit occurred. + * @param energy - The cluster's energy. + * @param time - The cluster's time-stamp. + */ + public Cluster(Point clusterCenter, double energy, double time) { + center = clusterCenter; + this.energy = energy; + this.time = time; + } + + /** + * Adds an <code>Point</code> to the list of this cluster's + * component hits. + * @param ix - The component hit's x-coordinate. + * @param iy - The component hit's y-coordinate. + */ + public void addComponentHit(int ix, int iy) { hitList.add(new Point(ix, iy)); } + + /** + * Adds an <code>Point</code> to the list of this cluster's + * component hits. + * @param eHit - The <code>Point</code> object indicating in which + * crystal the hit occurred. + */ + public void addComponentHit(Point eHit) { hitList.add(eHit); } + + /** + * Adds an <code>Point</code> to the list of this cluster's shared + * hits. + * @param ix - The shared hit's x-coordinate. + * @param iy - The shared hit's y-coordinate. + */ + public void addSharedHit(int ix, int iy) { shareList.add(new Point(ix, iy)); } + + /** + * Adds an <code>Point</code> to the list of this cluster's shared + * hits. + * @param eHit - The <code>Point</code> object indicating in which + * crystal the hit occurred. + */ + public void addSharedHit(Point eHit) { shareList.add(eHit); } + + /** + * Gets the hit representing the cluster center. + * @return Returns the cluster center hit as an <code>Point</code>. + */ + public Point getClusterCenter() { return center; } + + /** + * Gets the cluster's energy, if it was defined when the cluster + * was constructed. + * @return Returns the energy of the cluster if it was defined, + * and <code>NaN</code> otherwise. + */ + public double getClusterEnergy() { return energy; } + + /** + * Gets the time stamp for the cluster in nanoseconds. + * @return Returns the cluster's time stamp. + */ + public double getClusterTime() { return time; } + + /** + * Indicates how many component hits compose this cluster. Note + * that this does not include the seed hit or shared hits. + * @return Returns the number of component hits in the cluster + * as an <code>int</code>. + */ + public int getComponentHitCount() { return hitList.size(); } + + /** + * Gets the list of hits that make up the cluster, exempting the + * seed hit and shared hits. + * @return Returns the cluster hits as a <code>List</code> object + * composed of <code>Point</code> objects. + */ + public List<Point> getComponentHits() { return hitList; } + + /** + * Indicates how many total hits compose this cluster. This includes + * component hits, shared hits, and the seed hit. + * @return Returns the number of component hits in the cluster + * as an <code>int</code>. + */ + public int getHitCount() { return hitList.size() + shareList.size() + 1; } + + /** + * Indicates how many shared hits compose this cluster. Note that + * this does not include the seed hit or component hits. + * @return Returns the number of shared hits in the cluster as an + * <code>int</code>. + */ + public int getSharedHitCount() { return shareList.size(); } + + /** + * Gets the list of hits that make up the cluster, exempting the + * seed hit and component hits. + * @return Returns the shared hits as a <code>List</code> object + * composed of <code>Point</code> objects. + */ + public List<Point> getSharedHits() { return shareList; } } Modified: java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/event/EcalHit.java ============================================================================= --- java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/event/EcalHit.java (original) +++ java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/event/EcalHit.java Wed Mar 9 11:43:24 2016 @@ -23,7 +23,7 @@ * @param energy - The raw energy of the hit. **/ public EcalHit(int ix, int iy, double energy) { - this(new Point(ix, iy), energy); + this(new Point(ix, iy), energy); } /** @@ -32,7 +32,7 @@ * @param energy - The raw energy of the hit. **/ public EcalHit(Point ixy, double energy) { - loc = ixy; + loc = ixy; this.energy = energy; } @@ -44,7 +44,7 @@ * @param time - The time-stamp for the hit. **/ public EcalHit(int ix, int iy, double energy, double time) { - this(new Point(ix, iy), energy, time); + this(new Point(ix, iy), energy, time); } /** @@ -54,7 +54,7 @@ * @param time - The time-stamp for the hit. **/ public EcalHit(Point ixy, double energy, double time) { - loc = ixy; + loc = ixy; this.energy = energy; this.time = time; } Modified: java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/event/Event.java ============================================================================= --- java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/event/Event.java (original) +++ java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/event/Event.java Wed Mar 9 11:43:24 2016 @@ -10,119 +10,119 @@ * @author Kyle McCarty */ public final class Event { - private List<EcalHit> hitList; - private List<Point> clusterList; - private List<Association> connectList; - - /** - * <b>Event</b><br/><br/> - * <code>public <b>Event</b>()</code><br/><br/> - * Creates a new <code>Event</code>. - */ - public Event() { this(10, 10, 10); } - - /** - * <b>Event</b><br/><br/> - * <code>public <b>Event</b>(int hits, int clusters)</code><br/><br/> - * Creates a new <code>Event</code> and reserves spaces for the - * given number of hits and cluster centers. - * @param hits - The number of hits for which to reserve space. - * @param clusters - The number of cluster centers for which to - * reserve space. - */ - public Event(int hits, int clusters) { this(hits, clusters, 10); } - - /** - * <b>Event</b><br/><br/> - * <code>public <b>Event</b>(int hits, int clusters, int associations)</code><br/><br/> - * Creates a new <code>Event</code> and reserves spaces for the - * given number of hits, cluster centers, and crystal associations. - * @param hits - The number of hits for which to reserve space. - * @param clusters - The number of cluster centers for which to - * reserve space. - * @param associations - The number of crystal associations for - * which to reserve space. - */ - public Event(int hits, int clusters, int associations) { - hitList = new ArrayList<EcalHit>(hits); - clusterList = new ArrayList<Point>(clusters); - connectList = new ArrayList<Association>(associations); - } - - /** - * <b>Event</b><br/><br/> - * <code>public <b>Event</b>(List<EcalHit> hits, List<Point> clusters, List<Association> associations)</code><br/><br/> - * Creates a new <code>Event</code> and sets its contents to those - * of the given lists. The crystal association list will be empty. - * @param hits - The list of calorimeter hits. - * @param clusters - The list of cluster centers. - */ - public Event(List<EcalHit> hits, List<Point> clusters) { - this(hits, clusters, new ArrayList<Association>()); - } - - /** - * <b>Event</b><br/><br/> - * <code>public <b>Event</b>(List<EcalHit> hits, List<Point> clusters, List<Association> associations)</code><br/><br/> - * Creates a new <code>Event</code> and sets its contents to those - * of the given lists. - * @param hits - The list of calorimeter hits. - * @param clusters - The list of cluster centers. - * @param associations - The list of crystal associations. - */ - public Event(List<EcalHit> hits, List<Point> clusters, List<Association> associations) { - hitList = hits; - clusterList = clusters; - connectList = associations; - } - - /** - * <b>addAssociation</b><br/><br/> - * <code>public void <b>addAssociation</b>(Association connectedCrystal)</code><br/><br/> - * Adds a crystal association to the event. - * @param connectedCrystal - The crystal association to add. - */ - public void addAssociation(Association connectedCrystal) { - connectList.add(connectedCrystal); - } - - /** - * <b>addCluster</b><br/><br/> - * <code>public void <b>addCluster</b>(Point cluster)</code><br/><br/> - * Adds a cluster center to the event. - * @param cluster - The cluster center to add. - */ - public void addCluster(Point cluster) { clusterList.add(cluster); } - - /** - * <b>addHit</b><br/><br/> - * <code>public void <b>addHit</b>(EcalHit hit)</code><br/><br/> - * Adds a calorimeter hit to the event. - * @param hit - The calorimeter hit to add. - */ - public void addHit(EcalHit hit) { hitList.add(hit); } - - /** - * <b>getAssociations</b><br/><br/> - * <code>public List<Association> <b>getAssociations</b>()</code><br/><br/> - * Gets the list of associated crystals for this event. - * @return Returns the associations in a <code>List</code>. - */ - public List<Association> getAssociations() { return connectList; } - - /** - * <b>getClusterCenters</b><br/><br/> - * <code>List<Cluster><b>getClusterCenters</b>()</code><br/><br/> - * Gets the list of cluster centers for this event. - * @return Returns the cluster centers in a <code>List</code>. - */ - public List<Point> getClusterCenters() { return clusterList; } - - /** - * <b>getHits</b><br/><br/> - * <code>public List<EcalHit> <b>getHits</b>()</code><br/><br/> - * Gets the list of calorimeter hits for this event. - * @return Returns the hits in a <code>List</code>. - */ - public List<EcalHit> getHits() { return hitList; } + private List<EcalHit> hitList; + private List<Point> clusterList; + private List<Association> connectList; + + /** + * <b>Event</b><br/><br/> + * <code>public <b>Event</b>()</code><br/><br/> + * Creates a new <code>Event</code>. + */ + public Event() { this(10, 10, 10); } + + /** + * <b>Event</b><br/><br/> + * <code>public <b>Event</b>(int hits, int clusters)</code><br/><br/> + * Creates a new <code>Event</code> and reserves spaces for the + * given number of hits and cluster centers. + * @param hits - The number of hits for which to reserve space. + * @param clusters - The number of cluster centers for which to + * reserve space. + */ + public Event(int hits, int clusters) { this(hits, clusters, 10); } + + /** + * <b>Event</b><br/><br/> + * <code>public <b>Event</b>(int hits, int clusters, int associations)</code><br/><br/> + * Creates a new <code>Event</code> and reserves spaces for the + * given number of hits, cluster centers, and crystal associations. + * @param hits - The number of hits for which to reserve space. + * @param clusters - The number of cluster centers for which to + * reserve space. + * @param associations - The number of crystal associations for + * which to reserve space. + */ + public Event(int hits, int clusters, int associations) { + hitList = new ArrayList<EcalHit>(hits); + clusterList = new ArrayList<Point>(clusters); + connectList = new ArrayList<Association>(associations); + } + + /** + * <b>Event</b><br/><br/> + * <code>public <b>Event</b>(List<EcalHit> hits, List<Point> clusters, List<Association> associations)</code><br/><br/> + * Creates a new <code>Event</code> and sets its contents to those + * of the given lists. The crystal association list will be empty. + * @param hits - The list of calorimeter hits. + * @param clusters - The list of cluster centers. + */ + public Event(List<EcalHit> hits, List<Point> clusters) { + this(hits, clusters, new ArrayList<Association>()); + } + + /** + * <b>Event</b><br/><br/> + * <code>public <b>Event</b>(List<EcalHit> hits, List<Point> clusters, List<Association> associations)</code><br/><br/> + * Creates a new <code>Event</code> and sets its contents to those + * of the given lists. + * @param hits - The list of calorimeter hits. + * @param clusters - The list of cluster centers. + * @param associations - The list of crystal associations. + */ + public Event(List<EcalHit> hits, List<Point> clusters, List<Association> associations) { + hitList = hits; + clusterList = clusters; + connectList = associations; + } + + /** + * <b>addAssociation</b><br/><br/> + * <code>public void <b>addAssociation</b>(Association connectedCrystal)</code><br/><br/> + * Adds a crystal association to the event. + * @param connectedCrystal - The crystal association to add. + */ + public void addAssociation(Association connectedCrystal) { + connectList.add(connectedCrystal); + } + + /** + * <b>addCluster</b><br/><br/> + * <code>public void <b>addCluster</b>(Point cluster)</code><br/><br/> + * Adds a cluster center to the event. + * @param cluster - The cluster center to add. + */ + public void addCluster(Point cluster) { clusterList.add(cluster); } + + /** + * <b>addHit</b><br/><br/> + * <code>public void <b>addHit</b>(EcalHit hit)</code><br/><br/> + * Adds a calorimeter hit to the event. + * @param hit - The calorimeter hit to add. + */ + public void addHit(EcalHit hit) { hitList.add(hit); } + + /** + * <b>getAssociations</b><br/><br/> + * <code>public List<Association> <b>getAssociations</b>()</code><br/><br/> + * Gets the list of associated crystals for this event. + * @return Returns the associations in a <code>List</code>. + */ + public List<Association> getAssociations() { return connectList; } + + /** + * <b>getClusterCenters</b><br/><br/> + * <code>List<Cluster><b>getClusterCenters</b>()</code><br/><br/> + * Gets the list of cluster centers for this event. + * @return Returns the cluster centers in a <code>List</code>. + */ + public List<Point> getClusterCenters() { return clusterList; } + + /** + * <b>getHits</b><br/><br/> + * <code>public List<EcalHit> <b>getHits</b>()</code><br/><br/> + * Gets the list of calorimeter hits for this event. + * @return Returns the hits in a <code>List</code>. + */ + public List<EcalHit> getHits() { return hitList; } } Modified: java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/io/EventManager.java ============================================================================= --- java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/io/EventManager.java (original) +++ java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/io/EventManager.java Wed Mar 9 11:43:24 2016 @@ -21,16 +21,16 @@ * may be read. * @throws IOException Occurs if there is an error closing the file stream. **/ - public void close() throws IOException; - - /** - * <b>getEventNumber</b><br/><br/> + public void close() throws IOException; + + /** + * <b>getEventNumber</b><br/><br/> * <code>public int <b>getEventNumber</b>()</code><br/><br/> * Gets the ordinal number for the currently displayed event. - * @return Returns the current event's ordinal number. - */ - public int getEventNumber(); - + * @return Returns the current event's ordinal number. + */ + public int getEventNumber(); + /** * <b>getClusters</b><br/><br/> * <code>public ArrayList<Cluster> <b>getClusters</b>()</code><br/><br/> @@ -38,17 +38,17 @@ * @return Returns the current clusters as an <code>ArrayList * </code> object. **/ - public List<Cluster> getClusters(); - - /** + public List<Cluster> getClusters(); + + /** * <b>getHits</b><br/><br/> * <code>public ArrayList<EcalHit> <b>getHits</b>()</code><br/><br/> * Allows access to the current event's list of hits. * @return Returns the current hits as an <code>ArrayList</code> object. **/ - public List<EcalHit> getHits(); - - /** + public List<EcalHit> getHits(); + + /** * <b>nextEvent</b><br/><br/> * <code>public boolean <b>nextEvent</b>()</code><br/><br/> * Populates the event manager with hits and clusters from the next event. @@ -56,8 +56,8 @@ * </code> if it was not. * @throws IOException Occurs if there was a file read error. **/ - public boolean nextEvent() throws IOException; - + public boolean nextEvent() throws IOException; + /** * <b>previousEvent</b><br/><br/> * <code>public boolean <b>previousEvent</b>()</code><br/><br/> @@ -66,5 +66,5 @@ * </code> if it was not. * @throws IOException Occurs if there was a file read error. **/ - public boolean previousEvent() throws IOException; + public boolean previousEvent() throws IOException; } Modified: java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/lcsim/EventDisplayOutputDriver.java ============================================================================= --- java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/lcsim/EventDisplayOutputDriver.java (original) +++ java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/lcsim/EventDisplayOutputDriver.java Wed Mar 9 11:43:24 2016 @@ -97,30 +97,30 @@ // Only write clusters if the option is selected. if(outputClusters) { - // Process the clusters. - for (org.lcsim.event.Cluster cluster : clusters) { - // Get the seed hit for the cluster. - CalorimeterHit seedHit = (CalorimeterHit)cluster.getCalorimeterHits().get(0); - int ix = seedHit.getIdentifierFieldValue("ix"); - int iy = seedHit.getIdentifierFieldValue("iy"); - double time = seedHit.getTime(); - - // Get the cluster's total energy. - double energy = cluster.getEnergy(); - - // Write the seed hit to start a cluster. - writer.append(String.format("Cluster\t%d\t%d\t%f\t%f%n", ix, iy, energy, time)); - - // Write the component hits to the cluster. - for (CalorimeterHit hit : cluster.getCalorimeterHits()) { - // Get each component hit's x/y coordinates. - ix = hit.getIdentifierFieldValue("ix"); - iy = hit.getIdentifierFieldValue("iy"); - - // Write them as component hits. - writer.append(String.format("CompHit\t%d\t%d%n", ix, iy)); - } - } + // Process the clusters. + for (org.lcsim.event.Cluster cluster : clusters) { + // Get the seed hit for the cluster. + CalorimeterHit seedHit = (CalorimeterHit)cluster.getCalorimeterHits().get(0); + int ix = seedHit.getIdentifierFieldValue("ix"); + int iy = seedHit.getIdentifierFieldValue("iy"); + double time = seedHit.getTime(); + + // Get the cluster's total energy. + double energy = cluster.getEnergy(); + + // Write the seed hit to start a cluster. + writer.append(String.format("Cluster\t%d\t%d\t%f\t%f%n", ix, iy, energy, time)); + + // Write the component hits to the cluster. + for (CalorimeterHit hit : cluster.getCalorimeterHits()) { + // Get each component hit's x/y coordinates. + ix = hit.getIdentifierFieldValue("ix"); + iy = hit.getIdentifierFieldValue("iy"); + + // Write them as component hits. + writer.append(String.format("CompHit\t%d\t%d%n", ix, iy)); + } + } } // Append the end of event indicator. @@ -169,7 +169,7 @@ * indicates that they will be output. */ public void setIgnoreEmptyEvents(boolean ignoreEmptyEvents) { - this.ignoreEmptyEvents = ignoreEmptyEvents; + this.ignoreEmptyEvents = ignoreEmptyEvents; } /** @@ -179,7 +179,7 @@ * indicates that they will be output. */ public void setIgnoreNoClusterEvents(boolean ignoreNoClusterEvents) { - this.ignoreNoClusterEvents = ignoreNoClusterEvents; + this.ignoreNoClusterEvents = ignoreNoClusterEvents; } /** @@ -196,6 +196,6 @@ * will be written and <code>false</code> that they will not. */ public void setOutputClusters(boolean outputClusters) { - this.outputClusters = outputClusters; + this.outputClusters = outputClusters; } } Modified: java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/lcsim/LCIOBridgeDriver.java ============================================================================= --- java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/lcsim/LCIOBridgeDriver.java (original) +++ java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/lcsim/LCIOBridgeDriver.java Wed Mar 9 11:43:24 2016 @@ -39,9 +39,9 @@ * @param event - The LCIO event. */ public void process(EventHeader event) { - // If we are still updating the display, skip this event. - if(updating) { return; } - + // If we are still updating the display, skip this event. + if(updating) { return; } + // Make sure that this event has calorimeter hits. if (event.hasCollection(CalorimeterHit.class, ecalCollectionName)) { // Get the list of calorimeter hits from the event. @@ -55,44 +55,44 @@ // If this is the correct place to update, do so. if(eventsProcessed >= displayInterval) { - // Lock the update method for the duration of the update. - updating = true; - - // Clear the event display. - eventDisplay.resetDisplay(); - - // Add all of the hits. - for(CalorimeterHit hit : hits) { - // Get the hit's location and energy. - int ix = hit.getIdentifierFieldValue("ix"); - int iy = hit.getIdentifierFieldValue("iy"); - double energy = hit.getRawEnergy(); - - // Add the hit energy to the event display. - eventDisplay.addHit(new EcalHit(ix, iy, energy)); - } - - // Add all the clusters. - for(org.lcsim.event.Cluster cluster : clusters) { - // Get the seed hit. - CalorimeterHit seed = cluster.getCalorimeterHits().get(0); - int ix = seed.getIdentifierFieldValue("ix"); - int iy = seed.getIdentifierFieldValue("iy"); - double energy = seed.getRawEnergy(); // FIXME: Should this be getCorrectedEnergy() instead? --JM - - // Add the cluster center to the event display. - Cluster cc = new Cluster(ix, iy, energy); - eventDisplay.addCluster(cc); - } - - // Update the display. - eventDisplay.updateDisplay(); - - // Reset the number of events we've seen since the last update. - eventsProcessed = 0; - - // Unlock the update method so that more events can be processed. - updating = false; + // Lock the update method for the duration of the update. + updating = true; + + // Clear the event display. + eventDisplay.resetDisplay(); + + // Add all of the hits. + for(CalorimeterHit hit : hits) { + // Get the hit's location and energy. + int ix = hit.getIdentifierFieldValue("ix"); + int iy = hit.getIdentifierFieldValue("iy"); + double energy = hit.getRawEnergy(); + + // Add the hit energy to the event display. + eventDisplay.addHit(new EcalHit(ix, iy, energy)); + } + + // Add all the clusters. + for(org.lcsim.event.Cluster cluster : clusters) { + // Get the seed hit. + CalorimeterHit seed = cluster.getCalorimeterHits().get(0); + int ix = seed.getIdentifierFieldValue("ix"); + int iy = seed.getIdentifierFieldValue("iy"); + double energy = seed.getRawEnergy(); // FIXME: Should this be getCorrectedEnergy() instead? --JM + + // Add the cluster center to the event display. + Cluster cc = new Cluster(ix, iy, energy); + eventDisplay.addCluster(cc); + } + + // Update the display. + eventDisplay.updateDisplay(); + + // Reset the number of events we've seen since the last update. + eventsProcessed = 0; + + // Unlock the update method so that more events can be processed. + updating = false; } } } @@ -119,14 +119,14 @@ * a new event is displayed. */ public void setDisplayInterval(String displayInterval) { - // Convert the argument to an integer. - int disp = Integer.parseInt(displayInterval); - - // If it is negative, make it zero. - if(disp < 0) { disp = 0; } - - // Set the display interval. - this.displayInterval = disp; + // Convert the argument to an integer. + int disp = Integer.parseInt(displayInterval); + + // If it is negative, make it zero. + if(disp < 0) { disp = 0; } + + // Set the display interval. + this.displayInterval = disp; } /** Modified: java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/DataFileViewer.java ============================================================================= --- java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/DataFileViewer.java (original) +++ java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/DataFileViewer.java Wed Mar 9 11:43:24 2016 @@ -97,9 +97,9 @@ filterPanel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - // Suppress panel redrawing until the highlights are set. - ecalPanel.setSuppressRedraw(true); - + // Suppress panel redrawing until the highlights are set. + ecalPanel.setSuppressRedraw(true); + // Clear the panel highlighting. ecalPanel.clearHighlight(); Modified: java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/FileViewer.java ============================================================================= --- java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/FileViewer.java (original) +++ java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/FileViewer.java Wed Mar 9 11:43:24 2016 @@ -178,9 +178,9 @@ // be displayed. Double hitTime = crystalTimeMap.get(crystal); if(hitTime != null) { - setStatusField(fieldNames[HIT_TIME], Double.toString(hitTime)); + setStatusField(fieldNames[HIT_TIME], Double.toString(hitTime)); } else { - setStatusField(fieldNames[HIT_TIME], ResizableFieldPanel.NULL_VALUE); + setStatusField(fieldNames[HIT_TIME], ResizableFieldPanel.NULL_VALUE); } } // Otherwise, clear the field values. @@ -257,7 +257,7 @@ // Load hit time map. crystalTimeMap.clear(); for(EcalHit hit : em.getHits()) { - crystalTimeMap.put(new Point(toPanelX(hit.getX()), toPanelY(hit.getY())), hit.getTime()); + crystalTimeMap.put(new Point(toPanelX(hit.getX()), toPanelY(hit.getY())), hit.getTime()); } // Display it. Modified: java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PDataEventViewer.java ============================================================================= --- java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PDataEventViewer.java (original) +++ java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PDataEventViewer.java Wed Mar 9 11:43:24 2016 @@ -98,9 +98,9 @@ filterPanel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - // Suppress panel redrawing until the highlights are set. - ecalPanel.setSuppressRedraw(true); - + // Suppress panel redrawing until the highlights are set. + ecalPanel.setSuppressRedraw(true); + // Clear the panel highlighting. ecalPanel.clearHighlight(); Modified: java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/Viewer.java ============================================================================= --- java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/Viewer.java (original) +++ java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/Viewer.java Wed Mar 9 11:43:24 2016 @@ -638,7 +638,7 @@ JFileChooser chooser = new JFileChooser(); if(chooser.showSaveDialog(this) == JFileChooser.CANCEL_OPTION) { - return; + return; } // Parse the file name and make sure that it ends in .PNG. @@ -646,9 +646,9 @@ int index = filepath.lastIndexOf('.'); if(index == -1) { filepath = filepath + ".png"; } else { - if(filepath.substring(index + 1).compareTo("png") != 0) { - filepath = filepath.substring(0, index) + ".png"; - } + if(filepath.substring(index + 1).compareTo("png") != 0) { + filepath = filepath.substring(0, index) + ".png"; + } } // Get the lowest available file name. Modified: java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/BooleanMap.java ============================================================================= --- java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/BooleanMap.java (original) +++ java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/BooleanMap.java Wed Mar 9 11:43:24 2016 @@ -10,208 +10,208 @@ * @author Kyle McCarty */ public final class BooleanMap implements ColorMap<Double> { - // The color to display for values which pass the boolean check. - private Color activeColor = new Color(255, 50, 50); - // The color to display for values that fail the boolean check. - private Color inactiveColor = Color.WHITE; - // The critical value against which the boolean check is performed. - private double value = 0.0; - // The type of this boolean scale. - private final BooleanType boolType; - - /** - * <b>BooleanMap</b><br/><br/> - * <code>public <b>BooleanMap</b>(BooleanType type, double comparisonValue)</code><br/><br/> - * Defines a <code>ColorScale</code> which maps values to colors - * based on a boolean comparison. - * @param type - The type of boolean comparison to perform. - * @param comparisonValue - The value against which the comparison - * should be made. - */ - public BooleanMap(BooleanType type, double comparisonValue) { - // Make sure the comparison type is not null. - if(type == null) { throw new IllegalArgumentException("Boolean comparison type can not be null."); } - - // Define the critical value and the boolean type. - value = comparisonValue; - boolType = type; - } - - /** - * <b>BooleanMap</b><br/><br/> - * <code>public <b>BooleanMap</b>(BooleanType type, double comparisonValue, - * Color activeColor)</code><br/><br/> - * Defines a <code>ColorScale</code> which maps values to colors - * based on a boolean comparison. - * @param type - The type of boolean comparison to perform. - * @param comparisonValue - The value against which the comparison - * should be made. - * @param activeColor - The color in which values that pass the - * comparison should be displayed. - */ - public BooleanMap(BooleanType type, double comparisonValue, Color activeColor) { - // Set the critical value and the boolean type. - this(type, comparisonValue); - - // Set the active color. - this.activeColor = activeColor; - } - - /** - * <b>BooleanMap</b><br/><br/> - * <code>public <b>BooleanMap</b>(BooleanType type, double comparisonValue, - * Color activeColor, Color inactiveColor)</code><br/><br/> - * Defines a <code>ColorScale</code> which maps values to colors - * based on a boolean comparison. - * @param type - The type of boolean comparison to perform. - * @param comparisonValue - The value against which the comparison - * should be made. - * @param activeColor - The color in which values that pass the - * comparison should be displayed. - * @param inactiveColor - The color in which values that fail the - * comparison should be displayed. - */ - public BooleanMap(BooleanType type, double comparisonValue, Color activeColor, Color inactiveColor) { - // Set the critical value and the boolean type. - this(type, comparisonValue); - - // Set the active and inactive colors. - this.activeColor = activeColor; - this.inactiveColor = inactiveColor; - } - - public Color getColor(Double value) { - // If the argument is null, treat it is zero. - if(value == null) { value = 0.0; } - - // If it passes the boolean comparison, return the active color. - if(passes(value)) { return activeColor; } - - // Otherwise, return the inactive color. - else { return inactiveColor; } - } - - /** - * <b>getActiveColor</b><br/><br/> - * <code>public Color <b>getActiveColor</b>()</code><br/><br/> - * Gets the color used by the scale for values which pass the - * boolean comparison. - * @return Returns the color as a <code>Color</code> object. - */ - public Color getActiveColor() { return activeColor; } - - /** - * <b>getBooleanType</b><br/><br/> - * <code>public BooleanType <b>getBooleanType</b>()</code><br/><br/> - * Indicates what type of boolean comparison is performed by this - * scale. - * @return Returns the type of comparison as a <code>BooleanType - * </code> enumerable. - */ - public BooleanType getBooleanType() { return boolType; } - - /** - * <b>getComparisonValue</b><br/><br/> - * <code>public double <b>getComparisonValue</b>()</code><br/><br/> - * Gets the value against which the boolean comparisons are - * performed. - * @return Returns the value which is compared against. - */ - public double getComparisonValue() { return value; } - - /** - * <b>getInactiveColor</b><br/><br/> - * <code>public Color <b>getInactiveColor</b>()</code><br/><br/> - * Gets the color used by the scale for values which fail the - * boolean comparison. - * @return Returns the color as a <code>Color</code> object. - */ - public Color getInactiveColor() { return inactiveColor; } - - /** - * <b>setComparisonValue</b><br/><br/> - * <code>public void <b>setComparisonValue</b>(double value)</code><br/><br/> - * Sets the value against which the boolean comparison is performed. - * @param value - The value to compare against. - */ - public void setComparisonValue(double value) { this.value = value; } - - /** - * <b>passes</b><br/><br/> - * <code>private boolean <b>passes</b>(double d)</code><br/><br/> - * Determines whether a given external value passes the boolean - * check or not. - * @param d - The external value to compare. - * @return Returns <code>true</code> if the value passes the boolean - * check and <code>false</code> if it does not. - */ - private boolean passes(double d) { - // Perform the appropriate comparison. Note that the default - // case is included to satisfy the compiler -- it should not - // ever actually be used. - switch(boolType) { - case EQUAL_TO: - return d == value; - case NOT_EQUAL_TO: - return d != value; - case GREATER_THAN: - return d > value; - case LESS_THAN: - return d < value; - case GREATER_THAN_OR_EQUAL_TO: - return d >= value; - case LESS_THAN_OR_EQUAL_TO: - return d<= value; - default: - return false; - } - } - - /** - * Enumerable <code>BooleanType</code> defines the type of boolean - * comparison that is to be performed by the scale. - */ - public enum BooleanType { - /** - * <b>EQUAL_TO</b><br/><br/> - * Performs the boolean check:<br/><br/> - * <code>[External Value] == [Comparison Value]</code> - */ - EQUAL_TO, - - /** - * <b>NOT_EQUAL_TO</b><br/><br/> - * Performs the boolean check:<br/><br/> - * <code>[External Value] != [Comparison Value]</code> - */ - NOT_EQUAL_TO, - - /** - * <b>GREATER_THAN</b><br/><br/> - * Performs the boolean check:<br/><br/> - * <code>[External Value] > [Comparison Value]</code> - */ - GREATER_THAN, - - /** - * <b>LESS_THAN</b><br/><br/> - * Performs the boolean check:<br/><br/> - * <code>[External Value] < [Comparison Value]</code> - */ - LESS_THAN, - - /** - * <b>GREATER_THAN_OR_EQUAL_TO</b><br/><br/> - * Performs the boolean check:<br/><br/> - * <code>[External Value] >= [Comparison Value]</code> - */ - GREATER_THAN_OR_EQUAL_TO, - - /** - * <b>LESS_THAN_OR_EQUAL_TO</b><br/><br/> - * Performs the boolean check:<br/><br/> - * <code>[External Value] <= [Comparison Value]</code> - */ - LESS_THAN_OR_EQUAL_TO - }; + // The color to display for values which pass the boolean check. + private Color activeColor = new Color(255, 50, 50); + // The color to display for values that fail the boolean check. + private Color inactiveColor = Color.WHITE; + // The critical value against which the boolean check is performed. + private double value = 0.0; + // The type of this boolean scale. + private final BooleanType boolType; + + /** + * <b>BooleanMap</b><br/><br/> + * <code>public <b>BooleanMap</b>(BooleanType type, double comparisonValue)</code><br/><br/> + * Defines a <code>ColorScale</code> which maps values to colors + * based on a boolean comparison. + * @param type - The type of boolean comparison to perform. + * @param comparisonValue - The value against which the comparison + * should be made. + */ + public BooleanMap(BooleanType type, double comparisonValue) { + // Make sure the comparison type is not null. + if(type == null) { throw new IllegalArgumentException("Boolean comparison type can not be null."); } + + // Define the critical value and the boolean type. + value = comparisonValue; + boolType = type; + } + + /** + * <b>BooleanMap</b><br/><br/> + * <code>public <b>BooleanMap</b>(BooleanType type, double comparisonValue, + * Color activeColor)</code><br/><br/> + * Defines a <code>ColorScale</code> which maps values to colors + * based on a boolean comparison. + * @param type - The type of boolean comparison to perform. + * @param comparisonValue - The value against which the comparison + * should be made. + * @param activeColor - The color in which values that pass the + * comparison should be displayed. + */ + public BooleanMap(BooleanType type, double comparisonValue, Color activeColor) { + // Set the critical value and the boolean type. + this(type, comparisonValue); + + // Set the active color. + this.activeColor = activeColor; + } + + /** + * <b>BooleanMap</b><br/><br/> + * <code>public <b>BooleanMap</b>(BooleanType type, double comparisonValue, + * Color activeColor, Color inactiveColor)</code><br/><br/> + * Defines a <code>ColorScale</code> which maps values to colors + * based on a boolean comparison. + * @param type - The type of boolean comparison to perform. + * @param comparisonValue - The value against which the comparison + * should be made. + * @param activeColor - The color in which values that pass the + * comparison should be displayed. + * @param inactiveColor - The color in which values that fail the + * comparison should be displayed. + */ + public BooleanMap(BooleanType type, double comparisonValue, Color activeColor, Color inactiveColor) { + // Set the critical value and the boolean type. + this(type, comparisonValue); + + // Set the active and inactive colors. + this.activeColor = activeColor; + this.inactiveColor = inactiveColor; + } + + public Color getColor(Double value) { + // If the argument is null, treat it is zero. + if(value == null) { value = 0.0; } + + // If it passes the boolean comparison, return the active color. + if(passes(value)) { return activeColor; } + + // Otherwise, return the inactive color. + else { return inactiveColor; } + } + + /** + * <b>getActiveColor</b><br/><br/> + * <code>public Color <b>getActiveColor</b>()</code><br/><br/> + * Gets the color used by the scale for values which pass the + * boolean comparison. + * @return Returns the color as a <code>Color</code> object. + */ + public Color getActiveColor() { return activeColor; } + + /** + * <b>getBooleanType</b><br/><br/> + * <code>public BooleanType <b>getBooleanType</b>()</code><br/><br/> + * Indicates what type of boolean comparison is performed by this + * scale. + * @return Returns the type of comparison as a <code>BooleanType + * </code> enumerable. + */ + public BooleanType getBooleanType() { return boolType; } + + /** + * <b>getComparisonValue</b><br/><br/> + * <code>public double <b>getComparisonValue</b>()</code><br/><br/> + * Gets the value against which the boolean comparisons are + * performed. + * @return Returns the value which is compared against. + */ + public double getComparisonValue() { return value; } + + /** + * <b>getInactiveColor</b><br/><br/> + * <code>public Color <b>getInactiveColor</b>()</code><br/><br/> + * Gets the color used by the scale for values which fail the + * boolean comparison. + * @return Returns the color as a <code>Color</code> object. + */ + public Color getInactiveColor() { return inactiveColor; } + + /** + * <b>setComparisonValue</b><br/><br/> + * <code>public void <b>setComparisonValue</b>(double value)</code><br/><br/> + * Sets the value against which the boolean comparison is performed. + * @param value - The value to compare against. + */ + public void setComparisonValue(double value) { this.value = value; } + + /** + * <b>passes</b><br/><br/> + * <code>private boolean <b>passes</b>(double d)</code><br/><br/> + * Determines whether a given external value passes the boolean + * check or not. + * @param d - The external value to compare. + * @return Returns <code>true</code> if the value passes the boolean + * check and <code>false</code> if it does not. + */ + private boolean passes(double d) { + // Perform the appropriate comparison. Note that the default + // case is included to satisfy the compiler -- it should not + // ever actually be used. + switch(boolType) { + case EQUAL_TO: + return d == value; + case NOT_EQUAL_TO: + return d != value; + case GREATER_THAN: + return d > value; + case LESS_THAN: + return d < value; + case GREATER_THAN_OR_EQUAL_TO: + return d >= value; + case LESS_THAN_OR_EQUAL_TO: + return d<= value; + default: + return false; + } + } + + /** + * Enumerable <code>BooleanType</code> defines the type of boolean + * comparison that is to be performed by the scale. + */ + public enum BooleanType { + /** + * <b>EQUAL_TO</b><br/><br/> + * Performs the boolean check:<br/><br/> + * <code>[External Value] == [Comparison Value]</code> + */ + EQUAL_TO, + + /** + * <b>NOT_EQUAL_TO</b><br/><br/> + * Performs the boolean check:<br/><br/> + * <code>[External Value] != [Comparison Value]</code> + */ + NOT_EQUAL_TO, + + /** + * <b>GREATER_THAN</b><br/><br/> + * Performs the boolean check:<br/><br/> + * <code>[External Value] > [Comparison Value]</code> + */ + GREATER_THAN, + + /** + * <b>LESS_THAN</b><br/><br/> + * Performs the boolean check:<br/><br/> + * <code>[External Value] < [Comparison Value]</code> + */ + LESS_THAN, + + /** + * <b>GREATER_THAN_OR_EQUAL_TO</b><br/><br/> + * Performs the boolean check:<br/><br/> + * <code>[External Value] >= [Comparison Value]</code> + */ + GREATER_THAN_OR_EQUAL_TO, + + /** + * <b>LESS_THAN_OR_EQUAL_TO</b><br/><br/> + * Performs the boolean check:<br/><br/> + * <code>[External Value] <= [Comparison Value]</code> + */ + LESS_THAN_OR_EQUAL_TO + }; } Modified: java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/ColorScale.java ============================================================================= --- java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/ColorScale.java (original) +++ java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/ColorScale.java Wed Mar 9 11:43:24 2016 @@ -47,8 +47,8 @@ * value, if scaling is logarithmic. */ public double getScaledMaximum() { - if(linear) { return max; } - else { return lMax; } + if(linear) { return max; } + else { return lMax; } } /** @@ -61,8 +61,8 @@ * value, if scaling is logarithmic. */ public double getScaledMinimum() { - if(linear) { return min; } - else { return lMin; } + if(linear) { return min; } + else { return lMin; } } /** Modified: java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/CrystalEvent.java ============================================================================= --- java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/CrystalEvent.java (original) +++ java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/CrystalEvent.java Wed Mar 9 11:43:24 2016 @@ -14,41 +14,41 @@ * @author Kyle McCarty */ public class CrystalEvent extends AWTEvent { - private static final long serialVersionUID = 77198267255387212L; - // Stores the location of the triggering crystal. - private final Point crystal; - // The AWTEvent id for this event. - private static final int AWT_ID = AWTEvent.RESERVED_ID_MAX + 10; - - /** - * <b>CrystalEvent</b><br/><br/> - * <code>public <b>CrystalEvent</b>(Viewer parent, Point triggerCrystal)</code><br/><br/> - * Creates a crystal event for the indicated crystal and triggering - * component. - * @param source - The triggering component. - * @param triggerCrystal - The crystal associated with the event. - * @throws IllegalArgumentException Occurs if the associated crystal - * is <code>null</code>. - */ - public CrystalEvent(Viewer source, Point triggerCrystal) throws IllegalArgumentException { - // Run the superclass constructor. - super(source, AWT_ID); - - // Make sure that the trigger crystal is not null. - if(triggerCrystal == null) { - throw new IllegalArgumentException("Crystal events can not occur with respect to non-exstant crystals."); - } - - // Define the event parameters. - crystal = triggerCrystal; - } - - /** - * <b>getCrystalID</b><br/><br/> - * <code>public Point <b>getCrystalID</b>()</code><br/><br/> - * Indicates the panel indices at which the crystal is located. - * @return Returns the crystal's panel indices as a <code>Point - * </code> object. - */ - public Point getCrystalID() { return crystal; } + private static final long serialVersionUID = 77198267255387212L; + // Stores the location of the triggering crystal. + private final Point crystal; + // The AWTEvent id for this event. + private static final int AWT_ID = AWTEvent.RESERVED_ID_MAX + 10; + + /** + * <b>CrystalEvent</b><br/><br/> + * <code>public <b>CrystalEvent</b>(Viewer parent, Point triggerCrystal)</code><br/><br/> + * Creates a crystal event for the indicated crystal and triggering + * component. + * @param source - The triggering component. + * @param triggerCrystal - The crystal associated with the event. + * @throws IllegalArgumentException Occurs if the associated crystal + * is <code>null</code>. + */ + public CrystalEvent(Viewer source, Point triggerCrystal) throws IllegalArgumentException { + // Run the superclass constructor. + super(source, AWT_ID); + + // Make sure that the trigger crystal is not null. + if(triggerCrystal == null) { + throw new IllegalArgumentException("Crystal events can not occur with respect to non-exstant crystals."); + } + + // Define the event parameters. + crystal = triggerCrystal; + } + + /** + * <b>getCrystalID</b><br/><br/> + * <code>public Point <b>getCrystalID</b>()</code><br/><br/> + * Indicates the panel indices at which the crystal is located. + * @return Returns the crystal's panel indices as a <code>Point + * </code> object. + */ + public Point getCrystalID() { return crystal; } } Modified: java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/CrystalListener.java ============================================================================= --- java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/CrystalListener.java (original) +++ java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/CrystalListener.java Wed Mar 9 11:43:24 2016 @@ -11,27 +11,27 @@ * @author Kyle McCarty */ public interface CrystalListener extends EventListener { - /** - * <b>crystalActivated</b><br/><br/> - * <code>public void <b>crystalActivated</b>(CrystalEvent e)</code><br/><br/> - * Invoked when a crystal becomes highlighted. - * @param e - An object describing the event. - */ - public void crystalActivated(CrystalEvent e); - - /** - * <b>crystalDeactivated</b><br/><br/> - * <code>public void <b>crystalDeactivated</b>(CrystalEvent e)</code><br/><br/> - * Invoked when a crystal ceases to be highlighted. - * @param e - An object describing the event. - */ - public void crystalDeactivated(CrystalEvent e); - - /** - * <b>crystalClicked</b><br/><br/> - * <code>public void <b>crystalClicked</b>(CrystalEvent e)</code><br/><br/> - * Invoked when a crystal is clicked - * @param e - An object describing the event. - */ - public void crystalClicked(CrystalEvent e); + /** + * <b>crystalActivated</b><br/><br/> + * <code>public void <b>crystalActivated</b>(CrystalEvent e)</code><br/><br/> + * Invoked when a crystal becomes highlighted. + * @param e - An object describing the event. + */ + public void crystalActivated(CrystalEvent e); + + /** + * <b>crystalDeactivated</b><br/><br/> + * <code>public void <b>crystalDeactivated</b>(CrystalEvent e)</code><br/><br/> + * Invoked when a crystal ceases to be highlighted. + * @param e - An object describing the event. + */ + public void crystalDeactivated(CrystalEvent e); + + /** + * <b>crystalClicked</b><br/><br/> + * <code>public void <b>crystalClicked</b>(CrystalEvent e)</code><br/><br/> + * Invoked when a crystal is clicked + * @param e - An object describing the event. + */ + public void crystalClicked(CrystalEvent e); } Modified: java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/DatabaseCheck.java ============================================================================= --- java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/DatabaseCheck.java (original) +++ java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/DatabaseCheck.java Wed Mar 9 11:43:24 2016 @@ -17,122 +17,122 @@ import org.lcsim.conditions.ConditionsManager.ConditionsNotFoundException; public class DatabaseCheck { - private static final Set<Integer> idFailSet = new HashSet<Integer>(); - private static final Set<Point> pointFailSet = new HashSet<Point>(); - - public static void main(String[] args) throws ConditionsNotFoundException, IOException { - // Check that an appropriate file has been given. - String filepath = null; - if(args.length == 1) { - filepath = args[0]; - } - - // If no file path was defined, throw an error. - if(filepath == null) { - throw new FileNotFoundException("No CSV mapping file defined."); - } - - // Initialize the local database. - EcalWiringManager manager = new EcalWiringManager(filepath); - - // Initialize the database. - int runNumber = 2000; - String detectorName = "HPS-Proposal2014-v7-2pt2"; - DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance(); - conditionsManager.setDetector(detectorName, runNumber); - - // Get ECAL conditions. - EcalConditions ecalConditions = DatabaseConditionsManager.getInstance().getEcalConditions(); - - // Get the list of EcalChannel objects. - EcalChannelCollection channels = ecalConditions.getChannelCollection(); - EcalLedCollection leds = conditionsManager.getCachedConditions(EcalLedCollection.class, "ecal_leds").getCachedData(); - - // Map the LED objects to their channels. - Map<Integer, EcalLed> ledMap = new HashMap<Integer, EcalLed>(); + private static final Set<Integer> idFailSet = new HashSet<Integer>(); + private static final Set<Point> pointFailSet = new HashSet<Point>(); + + public static void main(String[] args) throws ConditionsNotFoundException, IOException { + // Check that an appropriate file has been given. + String filepath = null; + if(args.length == 1) { + filepath = args[0]; + } + + // If no file path was defined, throw an error. + if(filepath == null) { + throw new FileNotFoundException("No CSV mapping file defined."); + } + + // Initialize the local database. + EcalWiringManager manager = new EcalWiringManager(filepath); + + // Initialize the database. + int runNumber = 2000; + String detectorName = "HPS-Proposal2014-v7-2pt2"; + DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance(); + conditionsManager.setDetector(detectorName, runNumber); + + // Get ECAL conditions. + EcalConditions ecalConditions = DatabaseConditionsManager.getInstance().getEcalConditions(); + + // Get the list of EcalChannel objects. + EcalChannelCollection channels = ecalConditions.getChannelCollection(); + EcalLedCollection leds = conditionsManager.getCachedConditions(EcalLedCollection.class, "ecal_leds").getCachedData(); + + // Map the LED objects to their channels. + Map<Integer, EcalLed> ledMap = new HashMap<Integer, EcalLed>(); for (EcalLed led : leds) { - ledMap.put(led.getEcalChannelId(), led); + ledMap.put(led.getEcalChannelId(), led); } - - // Perform the comparison test. - for(EcalChannel channel : channels) { - // Get the crystal point information. - Point crystal = new Point(channel.getX(), channel.getY()); - - // Get the data from manager. - CrystalDataSet data = manager.getCrystalData(crystal); - - // Get the appropriate LED collection. - EcalLed led = ledMap.get(channel.getChannelId()); - - // Perform the comparison. - System.out.printf("Checking Mappings for Crystal (%3d, %3d):%n", crystal.x, crystal.y); - System.out.printf("\tChannel ID :: %d%n", channel.getChannelId()); - - System.out.printf("\tChannel [ %3d ] vs [ %3d ] ... ", channel.getChannel(), data.getFADCChannel()); - if(channel.getChannel() == data.getFADCChannel()) { - System.out.printf("[ Success ]%n"); - } else { - System.out.printf("[ Failure ]%n"); - idFailSet.add(channel.getChannelId()); - pointFailSet.add(crystal); - } - - int crate = data.getMotherboard().isTop() ? 1 : 2; - System.out.printf("\tCrate [ %3d ] vs [ %3d ] ... ", channel.getCrate(), crate); - if(channel.getCrate() == crate) { - System.out.printf("[ Success ]%n"); - } else { - System.out.printf("[ Failure ]%n"); - idFailSet.add(channel.getChannelId()); - pointFailSet.add(crystal); - } - - System.out.printf("\tSlot [ %3d ] vs [ %3d ] ... ", channel.getSlot(), data.getFADCSlot()); - if(channel.getSlot() == data.getFADCSlot()) { - System.out.printf("[ Success ]%n"); - } else { - System.out.printf("[ Failure ]%n"); - idFailSet.add(channel.getChannelId()); - pointFailSet.add(crystal); - } - - System.out.printf("\tLED Channel [ %3d ] vs [ %3d ] ... ", led.getLedNumber(), data.getLEDChannel()); - if(led.getLedNumber() == data.getLEDChannel()) { - System.out.printf("[ Success ]%n"); - } else { - System.out.printf("[ Failure ]%n"); - idFailSet.add(channel.getChannelId()); - pointFailSet.add(crystal); - } - - System.out.printf("\tLED Crate [ %3d ] vs [ %3d ] ... ", led.getCrateNumber(), crate); - if(led.getCrateNumber() == crate) { - System.out.printf("[ Success ]%n"); - } else { - System.out.printf("[ Failure ]%n"); - idFailSet.add(channel.getChannelId()); - pointFailSet.add(crystal); - } - - System.out.println(); - System.out.println(); - } - - // Print out the failing crystals. - System.out.println("Crystals that Failed:"); - for(Point fail : pointFailSet) { - System.out.printf("\tCrystal (%3d, %3d)%n", fail.x, fail.y); - } - if(pointFailSet.isEmpty()) { - System.out.println("\tNone!"); - } - - // Indicate the database connection settings. - System.out.println("\n"); - System.out.printf("Detector :: %s%n", detectorName); - System.out.printf("Run Number :: %d%n", runNumber); - System.out.printf("Channel Collection :: %d%n", channels.getCollectionId()); - System.out.printf("LED Collection :: %d%n", leds.getCollectionId()); - } + + // Perform the comparison test. + for(EcalChannel channel : channels) { + // Get the crystal point information. + Point crystal = new Point(channel.getX(), channel.getY()); + + // Get the data from manager. + CrystalDataSet data = manager.getCrystalData(crystal); + + // Get the appropriate LED collection. + EcalLed led = ledMap.get(channel.getChannelId()); + + // Perform the comparison. + System.out.printf("Checking Mappings for Crystal (%3d, %3d):%n", crystal.x, crystal.y); + System.out.printf("\tChannel ID :: %d%n", channel.getChannelId()); + + System.out.printf("\tChannel [ %3d ] vs [ %3d ] ... ", channel.getChannel(), data.getFADCChannel()); + if(channel.getChannel() == data.getFADCChannel()) { + System.out.printf("[ Success ]%n"); + } else { + System.out.printf("[ Failure ]%n"); + idFailSet.add(channel.getChannelId()); + pointFailSet.add(crystal); + } + + int crate = data.getMotherboard().isTop() ? 1 : 2; + System.out.printf("\tCrate [ %3d ] vs [ %3d ] ... ", channel.getCrate(), crate); + if(channel.getCrate() == crate) { + System.out.printf("[ Success ]%n"); + } else { + System.out.printf("[ Failure ]%n"); + idFailSet.add(channel.getChannelId()); + pointFailSet.add(crystal); + } + + System.out.printf("\tSlot [ %3d ] vs [ %3d ] ... ", channel.getSlot(), data.getFADCSlot()); + if(channel.getSlot() == data.getFADCSlot()) { + System.out.printf("[ Success ]%n"); + } else { + System.out.printf("[ Failure ]%n"); + idFailSet.add(channel.getChannelId()); + pointFailSet.add(crystal); + } + + System.out.printf("\tLED Channel [ %3d ] vs [ %3d ] ... ", led.getLedNumber(), data.getLEDChannel()); + if(led.getLedNumber() == data.getLEDChannel()) { + System.out.printf("[ Success ]%n"); + } else { + System.out.printf("[ Failure ]%n"); + idFailSet.add(channel.getChannelId()); + pointFailSet.add(crystal); + } + + System.out.printf("\tLED Crate [ %3d ] vs [ %3d ] ... ", led.getCrateNumber(), crate); + if(led.getCrateNumber() == crate) { + System.out.printf("[ Success ]%n"); + } else { + System.out.printf("[ Failure ]%n"); + idFailSet.add(channel.getChannelId()); + pointFailSet.add(crystal); + } + + System.out.println(); + System.out.println(); + } + + // Print out the failing crystals. + System.out.println("Crystals that Failed:"); + for(Point fail : pointFailSet) { + System.out.printf("\tCrystal (%3d, %3d)%n", fail.x, fail.y); + } + if(pointFailSet.isEmpty()) { + System.out.println("\tNone!"); + } + + // Indicate the database connection settings. + System.out.println("\n"); + System.out.printf("Detector :: %s%n", detectorName); + System.out.printf("Run Number :: %d%n", runNumber); + System.out.printf("Channel Collection :: %d%n", channels.getCollectionId()); + System.out.printf("LED Collection :: %d%n", leds.getCollectionId()); + } } Modified: java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/GradientScale.java ============================================================================= --- java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/GradientScale.java (original) +++ java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/GradientScale.java Wed Mar 9 11:43:24 2016 @@ -21,9 +21,9 @@ private int[] drgb = { 255, 255, 255 }; public Color getColor(Double value) { - // If the argument is null, treat it as zero. - if(value == null) { value = 0.0; } - + // If the argument is null, treat it as zero. + if(value == null) { value = 0.0; } + // If the value is less than the minimum, return the cold color. if (value < min) { return coldColor; } Modified: java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/MultiGradientScale.java ============================================================================= --- java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/MultiGradientScale.java (original) +++ java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/MultiGradientScale.java Wed Mar 9 11:43:24 2016 @@ -29,9 +29,9 @@ } public Color getColor(Double value) { - // If the value is null, treat it as zero. - if(value == null) { value = 0.0; } - + // If the value is null, treat it as zero. + if(value == null) { value = 0.0; } + // Get the number of colors and scales. int colors = colorList.size(); int scales = scaleList.size(); @@ -48,7 +48,7 @@ else { sValue = Math.log10(scale * value); } if(value < 1 && (Double.isNaN(sValue) || Double.isInfinite(sValue))) { - return scaleList.get(0).getColor(0.0); + return scaleList.get(0).getColor(0.0); } // Otherwise, determine which scale should get the value. Modified: java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/ClockSingleton.java ============================================================================= --- java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/ClockSingleton.java (original) +++ java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/ClockSingleton.java Wed Mar 9 11:43:24 2016 @@ -13,35 +13,35 @@ */ public class ClockSingleton { - public static final ClockSingleton _instance = new ClockSingleton(); - private int clock; - //time between events (bunch spacing) - private double dt = 2.0; + public static final ClockSingleton _instance = new ClockSingleton(); + private int clock; + //time between events (bunch spacing) + private double dt = 2.0; - private ClockSingleton() { - } + private ClockSingleton() { + } - public static void init() { - _instance.clock = 0; - } + public static void init() { + _instance.clock = 0; + } - public static int getClock() { - return _instance.clock; - } + public static int getClock() { + return _instance.clock; + } - public static double getTime() { - return _instance.dt * _instance.clock; - } + public static double getTime() { + return _instance.dt * _instance.clock; + } - public static double getDt() { - return _instance.dt; - } + public static double getDt() { + return _instance.dt; + } - public static void setDt(double dt) { - _instance.dt = dt; - } + public static void setDt(double dt) { + _instance.dt = dt; + } - public static void step() { - _instance.clock++; - } + public static void step() { + _instance.clock++; + } } Modified: java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCEcalReadoutDriver.java ============================================================================= --- java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCEcalReadoutDriver.java (original) +++ java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCEcalReadoutDriver.java Wed Mar 9 11:43:24 2016 @@ -383,7 +383,7 @@ } } else { if (pedestalSubtractedValue < triggerThreshold || triggerPathHitTimes.get(cellID) + delay0 == readoutCounter) { -// System.out.printf("sum = %f\n",sum); +// System.out.printf("sum = %f\n",sum); triggerPathDelayQueue.add(new BaseRawCalorimeterHit(cellID, (int) Math.round((sum + pedestalSubtractedValue) / scaleFactor), 64 * triggerPathHitTimes.get(cellID))); @@ -460,15 +460,15 @@ short[] adcValues = new short[readoutWindow]; for (int i = 0; i < readoutWindow; i++) { adcValues[i] = (short) pipeline.getValue(readoutLatency - i - 1); -// if (adcValues[i] != 0) { -// System.out.println("getWindow: " + adcValues[i] + " at i = " + i); -// } +// if (adcValues[i] != 0) { +// System.out.println("getWindow: " + adcValues[i] + " at i = " + i); +// } } return adcValues; } protected List<RawTrackerHit> readWindow() { -// System.out.println("Reading FADC data"); +// System.out.println("Reading FADC data"); List<RawTrackerHit> hits = new ArrayList<RawTrackerHit>(); for (Long cellID : digitalPipelines.keySet()) { short[] adcValues = getWindow(cellID); @@ -488,7 +488,7 @@ } protected List<RawTrackerHit> readPulses() { -// System.out.println("Reading FADC data"); +// System.out.println("Reading FADC data"); List<RawTrackerHit> hits = new ArrayList<RawTrackerHit>(); for (Long cellID : digitalPipelines.keySet()) { short[] window = getWindow(cellID); @@ -522,7 +522,7 @@ } protected List<RawCalorimeterHit> readIntegrals() { -// System.out.println("Reading FADC data"); +// System.out.println("Reading FADC data"); List<RawCalorimeterHit> hits = new ArrayList<RawCalorimeterHit>(); for (Long cellID : digitalPipelines.keySet()) { short[] window = getWindow(cellID); Modified: java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCPrimaryTriggerDriver.java ============================================================================= --- java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCPrimaryTriggerDriver.java (original) +++ java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCPrimaryTriggerDriver.java Wed Mar 9 11:43:24 2016 @@ -34,7 +34,7 @@ private int pairCoincidence = 2; // Maximum allowed time difference between clusters. (4 ns clock-cycles) private int backgroundLevel = -1; // Automatically sets the cuts to achieve a predetermined background rate. private TriggerModule triggerModule = new TriggerModule(1.0, 0.050, - 6.600, 0.010, 6.600, 0.000, 13.200, 6.600, 0.0, 360, 0.0055); + 6.600, 0.010, 6.600, 0.000, 13.200, 6.600, 0.0, 360, 0.0055); // ================================================================== // ==== Driver Internal Variables =================================== @@ -77,55 +77,55 @@ */ @Override public void startOfData() { - // Define plot type names. - String[] plotType = new String[PLOT_COUNT]; - plotType[NO_CUTS] = ""; - plotType[ALL_CUTS] = " (Passed All Cuts)"; - plotType[OVER_1HIT] = " (More than 1 Hit)"; - plotType[OVER_2HIT] = " (More than 2 Hits)"; - plotType[SINGLES_CUTS] = " (Passed Single Cuts)"; - - // Define plot type directories. - String[] plotDir = new String[PLOT_COUNT]; - plotDir[NO_CUTS] = "NoCuts/"; - plotDir[ALL_CUTS] = "PassedAll/"; - plotDir[OVER_1HIT] = "2PlusHits/"; - plotDir[OVER_2HIT] = "3PlusHits/"; - plotDir[SINGLES_CUTS] = "PassedSingles/"; - - // Instantiate the singles plot arrays. - clusterSeedEnergy = new IHistogram1D[PLOT_COUNT]; - clusterHitCount = new IHistogram1D[PLOT_COUNT]; - clusterTotalEnergy = new IHistogram1D[PLOT_COUNT]; - clusterDistribution = new IHistogram2D[PLOT_COUNT]; - - // Instantiate the pair plot arrays. Note that the pair cuts - // only ever see clusters that pass the singles cuts, so the - // "passed singles cuts" plots are meaningless. Thusly, the - // pair plots have one fewer plot than the singles. - pairEnergySum = new IHistogram1D[PLOT_COUNT - 1]; - pairEnergyDifference = new IHistogram1D[PLOT_COUNT - 1]; - pairCoplanarity = new IHistogram1D[PLOT_COUNT - 1]; - pairEnergySlope = new IHistogram1D[PLOT_COUNT - 1]; - pairEnergySum2DDistribution = new IHistogram2D[PLOT_COUNT - 1]; - - // Instantiate the plots. - for(int i = 0; i < PLOT_COUNT; i++) { - System.out.println(plotDir[i] + "Cluster Seed Energy" + plotType[i]); - clusterSeedEnergy[i] = aida.histogram1D(plotDir[i] + "Cluster Seed Energy" + plotType[i], 176, 0.0, 2.2); - clusterHitCount[i] = aida.histogram1D(plotDir[i] + "Cluster Hit Count" + plotType[i], 9, 0.5, 9.5); - clusterTotalEnergy[i] = aida.histogram1D(plotDir[i] + "Cluster Total Energy" + plotType[i], 176, 0.0, 2.2); - clusterDistribution[i] = aida.histogram2D(plotDir[i] + "Cluster Seed" + plotType[i], 46, -23, 23, 11, -5.5, 5.5); - - if(i != PLOT_COUNT - 1) { - pairEnergySum[i] = aida.histogram1D(plotDir[i] + "Pair Energy Sum" + plotType[i], 176, 0.0, 4.4); - pairEnergyDifference[i] = aida.histogram1D(plotDir[i] + "Pair Energy Difference" + plotType[i], 176, 0.0, 2.2); - pairCoplanarity[i] = aida.histogram1D(plotDir[i] + "Pair Coplanarity" + plotType[i], 180, 0.0, 180.0); - pairEnergySlope[i] = aida.histogram1D(plotDir[i] + "Pair Energy Slope" + plotType[i], 200, 0.0, 4.0); - pairEnergySum2DDistribution[i] = aida.histogram2D(plotDir[i] + "Pair Energy Sum 2D" + plotType[i], 176, 0.0, 4.4, 176, 0.0, 4.4); - } - } - + // Define plot type names. + String[] plotType = new String[PLOT_COUNT]; + plotType[NO_CUTS] = ""; + plotType[ALL_CUTS] = " (Passed All Cuts)"; + plotType[OVER_1HIT] = " (More than 1 Hit)"; + plotType[OVER_2HIT] = " (More than 2 Hits)"; + plotType[SINGLES_CUTS] = " (Passed Single Cuts)"; + + // Define plot type directories. + String[] plotDir = new String[PLOT_COUNT]; + plotDir[NO_CUTS] = "NoCuts/"; + plotDir[ALL_CUTS] = "PassedAll/"; + plotDir[OVER_1HIT] = "2PlusHits/"; + plotDir[OVER_2HIT] = "3PlusHits/"; + plotDir[SINGLES_CUTS] = "PassedSingles/"; + + // Instantiate the singles plot arrays. + clusterSeedEnergy = new IHistogram1D[PLOT_COUNT]; + clusterHitCount = new IHistogram1D[PLOT_COUNT]; + clusterTotalEnergy = new IHistogram1D[PLOT_COUNT]; + clusterDistribution = new IHistogram2D[PLOT_COUNT]; + + // Instantiate the pair plot arrays. Note that the pair cuts + // only ever see clusters that pass the singles cuts, so the + // "passed singles cuts" plots are meaningless. Thusly, the + // pair plots have one fewer plot than the singles. + pairEnergySum = new IHistogram1D[PLOT_COUNT - 1]; + pairEnergyDifference = new IHistogram1D[PLOT_COUNT - 1]; + pairCoplanarity = new IHistogram1D[PLOT_COUNT - 1]; + pairEnergySlope = new IHistogram1D[PLOT_COUNT - 1]; + pairEnergySum2DDistribution = new IHistogram2D[PLOT_COUNT - 1]; + + // Instantiate the plots. + for(int i = 0; i < PLOT_COUNT; i++) { + System.out.println(plotDir[i] + "Cluster Seed Energy" + plotType[i]); + clusterSeedEnergy[i] = aida.histogram1D(plotDir[i] + "Cluster Seed Energy" + plotType[i], 176, 0.0, 2.2); + clusterHitCount[i] = aida.histogram1D(plotDir[i] + "Cluster Hit Count" + plotType[i], 9, 0.5, 9.5); + clusterTotalEnergy[i] = aida.histogram1D(plotDir[i] + "Cluster Total Energy" + plotType[i], 176, 0.0, 2.2); + clusterDistribution[i] = aida.histogram2D(plotDir[i] + "Cluster Seed" + plotType[i], 46, -23, 23, 11, -5.5, 5.5); + + if(i != PLOT_COUNT - 1) { + pairEnergySum[i] = aida.histogram1D(plotDir[i] + "Pair Energy Sum" + plotType[i], 176, 0.0, 4.4); + pairEnergyDifference[i] = aida.histogram1D(plotDir[i] + "Pair Energy Difference" + plotType[i], 176, 0.0, 2.2); + pairCoplanarity[i] = aida.histogram1D(plotDir[i] + "Pair Coplanarity" + plotType[i], 180, 0.0, 180.0); + pairEnergySlope[i] = aida.histogram1D(plotDir[i] + "Pair Energy Slope" + plotType[i], 200, 0.0, 4.0); + pairEnergySum2DDistribution[i] = aida.histogram2D(plotDir[i] + "Pair Energy Sum 2D" + plotType[i], 176, 0.0, 4.4, 176, 0.0, 4.4); + } + } + // Make sure that a valid cluster collection name has been // defined. If it has not, throw an exception. if (clusterCollectionName == null) { @@ -239,15 +239,15 @@ // Fill the hit count plots for N > 1. if(hitCount > 1) { - // Populate the plots. + // Populate the plots. clusterSeedEnergy[OVER_1HIT].fill(seedEnergy); clusterTotalEnergy[OVER_1HIT].fill(clusterEnergy); clusterHitCount[OVER_1HIT].fill(hitCount); clusterDistribution[OVER_1HIT].fill(ix, iy); - + // Fill the hit count plots for N > 2. if(hitCount > 2) { - // Populate the plots. + // Populate the plots. clusterSeedEnergy[OVER_2HIT].fill(seedEnergy); clusterTotalEnergy[OVER_2HIT].fill(clusterEnergy); clusterHitCount[OVER_2HIT].fill(hitCount); @@ -260,14 +260,14 @@ // VERBOSE :: Print the seed energy comparison check. if(verbose) { System.out.printf("\tSeed Energy Cut :: %.3f < %.3f < %.3f --> %b%n", - triggerModule.getCutValue(TriggerModule.CLUSTER_SEED_ENERGY_LOW), seedEnergy, - triggerModule.getCutValue(TriggerModule.CLUSTER_SEED_ENERGY_HIGH), - triggerModule.clusterSeedEnergyCut(cluster)); + triggerModule.getCutValue(TriggerModule.CLUSTER_SEED_ENERGY_LOW), seedEnergy, + triggerModule.getCutValue(TriggerModule.CLUSTER_SEED_ENERGY_HIGH), + triggerModule.clusterSeedEnergyCut(cluster)); } // If the cluster fails the cut, skip to the next cluster. if(!triggerModule.clusterSeedEnergyCut(cluster)) { - continue clusterLoop; + continue clusterLoop; } // Otherwise, note that it passed the cut. @@ -278,13 +278,13 @@ // VERBOSE :: Print the hit count comparison check. if(verbose) { System.out.printf("\tHit Count Cut :: %d >= %.0f --> %b%n", - hitCount, triggerModule.getCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW), - triggerModule.clusterHitCountCut(cluster)); + hitCount, triggerModule.getCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW), + triggerModule.clusterHitCountCut(cluster)); } // If the cluster fails the cut, skip to the next cluster. if(!triggerModule.clusterHitCountCut(cluster)) { - continue clusterLoop; + continue clusterLoop; } // Otherwise, note that it passed the cut. @@ -295,14 +295,14 @@ // VERBOSE :: Print the cluster energy comparison check. if(verbose) { System.out.printf("\tCluster Energy Cut :: %.3f < %.3f < %.3f --> %b%n", - triggerModule.getCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW), clusterEnergy, - triggerModule.getCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH), - triggerModule.clusterTotalEnergyCut(cluster)); + triggerModule.getCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW), clusterEnergy, + triggerModule.getCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH), + triggerModule.clusterTotalEnergyCut(cluster)); } // If the cluster fails the cut, skip to the next cluster. if(!triggerModule.clusterTotalEnergyCut(cluster)) { - continue clusterLoop; + continue clusterLoop; } // Otherwise, note that it passed the cut. @@ -544,63 +544,63 @@ // Some cut values are almost always the same thing. Set those // here and only overwrite if necessary. - triggerModule.setCutValue(TriggerModule.CLUSTER_SEED_ENERGY_LOW, 0.125); - triggerModule.setCutValue(TriggerModule.CLUSTER_SEED_ENERGY_HIGH, 1.300); - triggerModule.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.200); - triggerModule.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 1.700); - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, 0.500); - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, 2.000); - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, 1.200); - triggerModule.setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 30); - triggerModule.setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 2); + triggerModule.setCutValue(TriggerModule.CLUSTER_SEED_ENERGY_LOW, 0.125); + triggerModule.setCutValue(TriggerModule.CLUSTER_SEED_ENERGY_HIGH, 1.300); + triggerModule.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.200); + triggerModule.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 1.700); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, 0.500); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, 2.000); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, 1.200); + triggerModule.setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 30); + triggerModule.setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 2); // Set the variable values. if(backgroundLevel == 1) { - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, 1.000); - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 1.2); - triggerModule.setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 20); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, 1.000); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 1.2); + triggerModule.setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 20); } else if(backgroundLevel == 2) { - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 1.0); - triggerModule.setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 20); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 1.0); + triggerModule.setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 20); } else if(backgroundLevel == 3) { - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 1.0); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 1.0); } else if(backgroundLevel == 4) { - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.8); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.8); } else if(backgroundLevel == 5) { - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.8); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.8); } else if(backgroundLevel == 6) { - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.6); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.6); } else if(backgroundLevel == 7) { - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.6); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.6); } else if(backgroundLevel == 8) { - triggerModule.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 1.500); - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.4); + triggerModule.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 1.500); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.4); } else if(backgroundLevel == 9) { - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.4); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.4); } else if(backgroundLevel == 10) { - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.4); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.4); } else if(backgroundLevel == 0) { - triggerModule.setCutValue(TriggerModule.CLUSTER_SEED_ENERGY_LOW, 0.100); - triggerModule.setCutValue(TriggerModule.CLUSTER_SEED_ENERGY_HIGH, 6.600); - triggerModule.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.100); - triggerModule.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 1.500); - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, 0.000); - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, 1.900); - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, 2.200); - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 1.1); - triggerModule.setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 35); - triggerModule.setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 1); + triggerModule.setCutValue(TriggerModule.CLUSTER_SEED_ENERGY_LOW, 0.100); + triggerModule.setCutValue(TriggerModule.CLUSTER_SEED_ENERGY_HIGH, 6.600); + triggerModule.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.100); + triggerModule.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 1.500); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, 0.000); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, 1.900); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, 2.200); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 1.1); + triggerModule.setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 35); + triggerModule.setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 1); } else if(backgroundLevel == -1) { - triggerModule.setCutValue(TriggerModule.CLUSTER_SEED_ENERGY_LOW, 0.050); - triggerModule.setCutValue(TriggerModule.CLUSTER_SEED_ENERGY_HIGH, 6.600); - triggerModule.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.010); - triggerModule.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 6.600); - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, 0.000); - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, 13.200); - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, 6.600); - triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.0); - triggerModule.setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 360); - triggerModule.setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 1); + triggerModule.setCutValue(TriggerModule.CLUSTER_SEED_ENERGY_LOW, 0.050); + triggerModule.setCutValue(TriggerModule.CLUSTER_SEED_ENERGY_HIGH, 6.600); + triggerModule.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.010); + triggerModule.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 6.600); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, 0.000); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, 13.200); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, 6.600); + triggerModule.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.0); + triggerModule.setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 360); + triggerModule.setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 1); } } @@ -636,16 +636,16 @@ // Fill the hit count plots for N > 1. if(clusterPair[0].getCalorimeterHits().size() > 1 && clusterPair[1].getCalorimeterHits().size() > 1) { - // Populate the plots. + // Populate the plots. pairEnergySum[OVER_1HIT].fill(energySum); pairEnergyDifference[OVER_1HIT].fill(energyDifference); pairEnergySlope[OVER_1HIT].fill(energySlope); pairCoplanarity[OVER_1HIT].fill(coplanarity); pairEnergySum2DDistribution[OVER_1HIT].fill(clusterPair[0].getEnergy(), clusterPair[1].getEnergy()); - + // Fill the hit count plots for N > 2. if(clusterPair[0].getCalorimeterHits().size() > 2 && clusterPair[1].getCalorimeterHits().size() > 2) { - // Populate the plots. + // Populate the plots. pairEnergySum[OVER_2HIT].fill(energySum); pairEnergyDifference[OVER_2HIT].fill(energyDifference); pairEnergySlope[OVER_2HIT].fill(energySlope); @@ -658,7 +658,7 @@ // ============================================================= // If the cluster fails the cut, skip to the next pair. if(!triggerModule.pairEnergySumCut(clusterPair)) { - continue pairLoop; + continue pairLoop; } // Otherwise, note that it passed the cut. @@ -668,7 +668,7 @@ // ============================================================= // If the cluster fails the cut, skip to the next pair. if(!triggerModule.pairEnergyDifferenceCut(clusterPair)) { - continue pairLoop; + continue pairLoop; } // Otherwise, note that it passed the cut. @@ -678,7 +678,7 @@ // ============================================================= // If the cluster fails the cut, skip to the next pair. if(!triggerModule.pairEnergySlopeCut(clusterPair)) { - continue pairLoop; + continue pairLoop; } // Otherwise, note that it passed the cut. @@ -688,7 +688,7 @@ // ============================================================= // If the cluster fails the cut, skip to the next pair. if(!triggerModule.pairCoplanarityCut(clusterPair)) { - continue pairLoop; + continue pairLoop; } // Otherwise, note that it passed the cut. @@ -774,6 +774,6 @@ * @param cuts - The cut string. */ public void setCuts(String cuts) { - triggerModule.setCutValues(false, cuts); + triggerModule.setCutValues(false, cuts); } } Modified: java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCTriggerVariableDriver.java ============================================================================= --- java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCTriggerVariableDriver.java (original) +++ java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCTriggerVariableDriver.java Wed Mar 9 11:43:24 2016 @@ -63,14 +63,14 @@ //System.out.printf("%d ecal clusters in event\n", clusters.size()); //System.out.printf("%s: %d clusters\n",this.getClass().getSimpleName(),clusters.size()); - //for(Cluster cl : clusters) { - // System.out.printf("%s: cl E %f x %f y %f \n",this.getClass().getSimpleName(),cl.getEnergy(),cl.getPosition()[0],cl.getPosition()[1]); - //} - List<Cluster> unique_clusters = this.getUniqueClusters(clusters); - //System.out.printf("%s: %d unique clusters\n",this.getClass().getSimpleName(),unique_clusters.size()); - //for(Cluster cl : unique_clusters) { - // System.out.printf("%s: cl E %f x %f y %f \n",this.getClass().getSimpleName(),cl.getEnergy(),cl.getPosition()[0],cl.getPosition()[1]); - //} + //for(Cluster cl : clusters) { + // System.out.printf("%s: cl E %f x %f y %f \n",this.getClass().getSimpleName(),cl.getEnergy(),cl.getPosition()[0],cl.getPosition()[1]); + //} + List<Cluster> unique_clusters = this.getUniqueClusters(clusters); + //System.out.printf("%s: %d unique clusters\n",this.getClass().getSimpleName(),unique_clusters.size()); + //for(Cluster cl : unique_clusters) { + // System.out.printf("%s: cl E %f x %f y %f \n",this.getClass().getSimpleName(),cl.getEnergy(),cl.getPosition()[0],cl.getPosition()[1]); + //} updateClusterQueues(unique_clusters); List<Cluster[]> clusterPairs = getClusterPairsTopBot(); @@ -122,47 +122,47 @@ private List<Cluster> getUniqueClusters(List<Cluster> clusters) { - List<Cluster> unique = new ArrayList<Cluster>(); - for(Cluster loop_cl : clusters) { - ClusterCmp loop_clCmp = new ClusterCmp(loop_cl); - boolean found = false; - for(Cluster cl : unique) { - if( loop_clCmp.compareTo(cl) == 0 ) { - found = true; - } - } - if( !found ) { - unique.add(loop_cl); - } - } - return unique; + List<Cluster> unique = new ArrayList<Cluster>(); + for(Cluster loop_cl : clusters) { + ClusterCmp loop_clCmp = new ClusterCmp(loop_cl); + boolean found = false; + for(Cluster cl : unique) { + if( loop_clCmp.compareTo(cl) == 0 ) { + found = true; + } + } + if( !found ) { + unique.add(loop_cl); + } + } + return unique; } private static class ClusterCmp implements Comparable<Cluster> { - private Cluster _cluster; - public ClusterCmp(Cluster cl) { - set_cluster(cl); - } - @Override - public int compareTo(Cluster cl) { - if(cl.getEnergy()==get_cluster().getEnergy() && cl.getPosition()[0]==get_cluster().getPosition()[0] && cl.getPosition()[1]==get_cluster().getPosition()[1] ) { - return 0; - } else { - if( cl.getEnergy() > get_cluster().getEnergy()) { - return 1; - } else { - return -1; - } - } - } - public Cluster get_cluster() { - return _cluster; - } - public void set_cluster(Cluster _cluster) { - this._cluster = _cluster; - } - + private Cluster _cluster; + public ClusterCmp(Cluster cl) { + set_cluster(cl); + } + @Override + public int compareTo(Cluster cl) { + if(cl.getEnergy()==get_cluster().getEnergy() && cl.getPosition()[0]==get_cluster().getPosition()[0] && cl.getPosition()[1]==get_cluster().getPosition()[1] ) { + return 0; + } else { + if( cl.getEnergy() > get_cluster().getEnergy()) { + return 1; + } else { + return -1; + } + } + } + public Cluster get_cluster() { + return _cluster; + } + public void set_cluster(Cluster _cluster) { + this._cluster = _cluster; + } + } } Modified: java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/MollerTriggerDriver.java ============================================================================= --- java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/MollerTriggerDriver.java (original) +++ java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/MollerTriggerDriver.java Wed Mar 9 11:43:24 2016 @@ -56,8 +56,8 @@ @Override public void process(EventHeader event) { - // Run the superclass process event. - super.process(event); + // Run the superclass process event. + super.process(event); } @Override @@ -87,29 +87,29 @@ aMomentumAngle = aida.histogram2D("Trigger Plots :: Particle Momentum Distribution (t = 0, Passed All Cuts)", 500, -0.01, 0.06, 500, -0.04, 0.04); // Add the allowed seed crystal positions to the seed set. - if(useVersionOne) { - // Add the allowed seed crystal positions to the seed set. - // y = +/- 1, x = -11 -> -15 - for(int ix = -15; ix <= -11; ix++) { - allowedSeedSet.add(new Point(ix, 1)); - allowedSeedSet.add(new Point(ix, -1)); - } // y = +/- 2, x = -9 -> -15 - for(int ix = -15; ix <= -9; ix++) { - allowedSeedSet.add(new Point(ix, 2)); - allowedSeedSet.add(new Point(ix, -2)); - } - } - else { - // y = +/- 1, x = -11 -> -13 - for(int ix = -13; ix <= -11; ix++) { - allowedSeedSet.add(new Point(ix, 1)); - allowedSeedSet.add(new Point(ix, -1)); - } // y = +/- 2, x = -10 -> -14 - for(int ix = -14; ix <= -10; ix++) { - allowedSeedSet.add(new Point(ix, 2)); - allowedSeedSet.add(new Point(ix, -2)); - } - } + if(useVersionOne) { + // Add the allowed seed crystal positions to the seed set. + // y = +/- 1, x = -11 -> -15 + for(int ix = -15; ix <= -11; ix++) { + allowedSeedSet.add(new Point(ix, 1)); + allowedSeedSet.add(new Point(ix, -1)); + } // y = +/- 2, x = -9 -> -15 + for(int ix = -15; ix <= -9; ix++) { + allowedSeedSet.add(new Point(ix, 2)); + allowedSeedSet.add(new Point(ix, -2)); + } + } + else { + // y = +/- 1, x = -11 -> -13 + for(int ix = -13; ix <= -11; ix++) { + allowedSeedSet.add(new Point(ix, 1)); + allowedSeedSet.add(new Point(ix, -1)); + } // y = +/- 2, x = -10 -> -14 + for(int ix = -14; ix <= -10; ix++) { + allowedSeedSet.add(new Point(ix, 2)); + allowedSeedSet.add(new Point(ix, -2)); + } + } } @Override @@ -201,31 +201,31 @@ // Require that the cluster pass each of the cuts in // order to qualify for a trigger. if(totalEnergyCut && seedEnergyCut && hitCountCut && positionCut) { - // Increment the number of events that have passed - // the cuts. - passedEvents++; - - // If the number of passed events exceeds the prescaling - // threshold, throw a trigger. - if(passedEvents >= prescale) { - // Reset the number of passed events. - passedEvents = 0; - - // Add the clusters to the cut histograms. - aClusterHitCount.fill(cluster.getCalorimeterHits().size()); - aClusterTotalEnergy.fill(cluster.getEnergy()); - aClusterSeedEnergy.fill(cluster.getCalorimeterHits().get(0).getCorrectedEnergy()); - aClusterDistribution.fill(ix > 0 ? ix - 1 : ix, iy, 1); - - // Increment the trigger count. - triggers++; - - // VERBOSE :: Indicate that a trigger occurred. - if(verbose) { System.out.printf("\tTriggered!%n%n"); } - - // Return a trigger. - return true; - } + // Increment the number of events that have passed + // the cuts. + passedEvents++; + + // If the number of passed events exceeds the prescaling + // threshold, throw a trigger. + if(passedEvents >= prescale) { + // Reset the number of passed events. + passedEvents = 0; + + // Add the clusters to the cut histograms. + aClusterHitCount.fill(cluster.getCalorimeterHits().size()); + aClusterTotalEnergy.fill(cluster.getEnergy()); + aClusterSeedEnergy.fill(cluster.getCalorimeterHits().get(0).getCorrectedEnergy()); + aClusterDistribution.fill(ix > 0 ? ix - 1 : ix, iy, 1); + + // Increment the trigger count. + triggers++; + + // VERBOSE :: Indicate that a trigger occurred. + if(verbose) { System.out.printf("\tTriggered!%n%n"); } + + // Return a trigger. + return true; + } } } @@ -371,7 +371,7 @@ * will be thrown. */ public void setPrescale(int prescale) { - this.prescale = prescale; + this.prescale = prescale; } /** @@ -383,7 +383,7 @@ public void setVerbose(boolean verbose) { this.verbose = verbose; } - + /** * Toggles whether the more inclusive acceptance region version 1 * is used, or the slightly smaller and more exclusive acceptance @@ -392,9 +392,9 @@ * 1 of the acceptance region should be used and <code>false</code> * that version 2 should be used. */ - public void setUseVersionOne(boolean useVersionOne) { - this.useVersionOne = useVersionOne; - } + public void setUseVersionOne(boolean useVersionOne) { + this.useVersionOne = useVersionOne; + } // ================================================================== // ==== AIDA Plots ================================================== Modified: java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/OccupancyAnalysisDriver.java ============================================================================= --- java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/OccupancyAnalysisDriver.java (original) +++ java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/OccupancyAnalysisDriver.java Wed Mar 9 11:43:24 2016 @@ -12,19 +12,19 @@ import org.lcsim.util.aida.AIDA; public class OccupancyAnalysisDriver extends Driver { - // Internal variables. - private double scalingFactor = 0.05; - private double seedThreshold = 0.050; - private double beamRatio = 1.92 / 2.2; - private double clusterThreshold = 0.200; + // Internal variables. + private double scalingFactor = 0.05; + private double seedThreshold = 0.050; + private double beamRatio = 1.92 / 2.2; + private double clusterThreshold = 0.200; private AIDA aida = AIDA.defaultInstance(); - private boolean ignoreBeamGapRows = false; - + private boolean ignoreBeamGapRows = false; + // LCIO Collection Names private String clusterCollectionName = "EcalClusters"; private String hitCollectionName = "EcalCorrectedHits"; - // Trigger plots. + // Trigger plots. IHistogram2D occupancyDistribution; IHistogram2D[] clusterDistribution = new IHistogram2D[2]; IHistogram1D[] clusterHitDistribution = new IHistogram1D[2]; @@ -32,129 +32,129 @@ IHistogram1D[] clusterEnergyDistribution = new IHistogram1D[2]; public void setIgnoreBeamGapRows(boolean ignoreBeamGapRows) { - this.ignoreBeamGapRows = ignoreBeamGapRows; + this.ignoreBeamGapRows = ignoreBeamGapRows; } public void setBeamRatio(double beamRatio) { - this.beamRatio = beamRatio; + this.beamRatio = beamRatio; } public void setScalingFactor(double scalingFactor) { - this.scalingFactor = scalingFactor; + this.scalingFactor = scalingFactor; } public void setSeedThreshold(double seedThreshold) { - this.seedThreshold = seedThreshold; + this.seedThreshold = seedThreshold; } public void setClusterThreshold(double clusterThreshold) { - this.clusterThreshold = clusterThreshold; + this.clusterThreshold = clusterThreshold; } public void setClusterCollectionName(String clusterCollectionName) { - this.clusterCollectionName = clusterCollectionName; + this.clusterCollectionName = clusterCollectionName; } public void setHitCollectionName(String hitCollectionName) { - this.hitCollectionName = hitCollectionName; + this.hitCollectionName = hitCollectionName; } @Override public void process(EventHeader event) { - // If clusters are present, process them. - if(event.hasCollection(Cluster.class, clusterCollectionName)) { - // Get the list of clusters. - List<Cluster> clusterList = event.get(Cluster.class, clusterCollectionName); - - // Use the clusters to populate the cluster plots. - for(Cluster cluster : clusterList) { - // Get the ix and iy values for the cluster. - int ix = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"); - int iy = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy"); - - // If we want to ignore the beam gap rows, make sure - // that iy exceeds two. - if(!ignoreBeamGapRows || (Math.abs(iy) > 2)) { - // If the cluster passes the seed threshold, place it in - // the level 1 plots. - if(cluster.getCalorimeterHits().get(0).getCorrectedEnergy() >= seedThreshold) { - clusterDistribution[0].fill(ix, iy, scalingFactor); - clusterHitDistribution[0].fill(cluster.getCalorimeterHits().size(), scalingFactor); - clusterEnergyDistribution[0].fill(cluster.getEnergy() * beamRatio, scalingFactor); - } - - // If the cluster energy passes the cluster threshold, - // populate the level 2 plots. - if(cluster.getEnergy() >= clusterThreshold) { - clusterDistribution[1].fill(ix, iy, scalingFactor); - clusterHitDistribution[1].fill(cluster.getCalorimeterHits().size(), scalingFactor); - clusterEnergyDistribution[1].fill(cluster.getEnergy() * beamRatio, scalingFactor); - } - } - } - } - - // If the event has hits, process them. - if(event.hasCollection(CalorimeterHit.class, hitCollectionName)) { - // Get the list of hits. - List<CalorimeterHit> hitList = event.get(CalorimeterHit.class, hitCollectionName); - - // Track the energy in the top and bottom of the calorimeter. - double[] energy = { 0.0, 0.0 }; - - // Iterate over the hits. - for(CalorimeterHit hit : hitList) { - // Get the ix and iy values. - int ix = hit.getIdentifierFieldValue("ix"); - int iy = hit.getIdentifierFieldValue("iy"); - - // If we want to ignore beam gap rows, ensure that iy - // is greater than 2. - if(!ignoreBeamGapRows || Math.abs(iy) > 2) { - // Add the energy to the appropriate energy tracking - // variable for the calorimeter halves. - if(iy > 0) { energy[0] += hit.getCorrectedEnergy() * beamRatio; } - else { energy[1] += hit.getCorrectedEnergy() * beamRatio; } - - // Populate the occupancy distribution. - occupancyDistribution.fill(ix, iy, scalingFactor); - } - } - - // Populate the total calorimeter energy plot. - totalEnergyDistribution[0].fill(energy[0], scalingFactor); - totalEnergyDistribution[1].fill(energy[1], scalingFactor); - } + // If clusters are present, process them. + if(event.hasCollection(Cluster.class, clusterCollectionName)) { + // Get the list of clusters. + List<Cluster> clusterList = event.get(Cluster.class, clusterCollectionName); + + // Use the clusters to populate the cluster plots. + for(Cluster cluster : clusterList) { + // Get the ix and iy values for the cluster. + int ix = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"); + int iy = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy"); + + // If we want to ignore the beam gap rows, make sure + // that iy exceeds two. + if(!ignoreBeamGapRows || (Math.abs(iy) > 2)) { + // If the cluster passes the seed threshold, place it in + // the level 1 plots. + if(cluster.getCalorimeterHits().get(0).getCorrectedEnergy() >= seedThreshold) { + clusterDistribution[0].fill(ix, iy, scalingFactor); + clusterHitDistribution[0].fill(cluster.getCalorimeterHits().size(), scalingFactor); + clusterEnergyDistribution[0].fill(cluster.getEnergy() * beamRatio, scalingFactor); + } + + // If the cluster energy passes the cluster threshold, + // populate the level 2 plots. + if(cluster.getEnergy() >= clusterThreshold) { + clusterDistribution[1].fill(ix, iy, scalingFactor); + clusterHitDistribution[1].fill(cluster.getCalorimeterHits().size(), scalingFactor); + clusterEnergyDistribution[1].fill(cluster.getEnergy() * beamRatio, scalingFactor); + } + } + } + } + + // If the event has hits, process them. + if(event.hasCollection(CalorimeterHit.class, hitCollectionName)) { + // Get the list of hits. + List<CalorimeterHit> hitList = event.get(CalorimeterHit.class, hitCollectionName); + + // Track the energy in the top and bottom of the calorimeter. + double[] energy = { 0.0, 0.0 }; + + // Iterate over the hits. + for(CalorimeterHit hit : hitList) { + // Get the ix and iy values. + int ix = hit.getIdentifierFieldValue("ix"); + int iy = hit.getIdentifierFieldValue("iy"); + + // If we want to ignore beam gap rows, ensure that iy + // is greater than 2. + if(!ignoreBeamGapRows || Math.abs(iy) > 2) { + // Add the energy to the appropriate energy tracking + // variable for the calorimeter halves. + if(iy > 0) { energy[0] += hit.getCorrectedEnergy() * beamRatio; } + else { energy[1] += hit.getCorrectedEnergy() * beamRatio; } + + // Populate the occupancy distribution. + occupancyDistribution.fill(ix, iy, scalingFactor); + } + } + + // Populate the total calorimeter energy plot. + totalEnergyDistribution[0].fill(energy[0], scalingFactor); + totalEnergyDistribution[1].fill(energy[1], scalingFactor); + } } @Override public void startOfData() { - // Define the cluster distribution plots. - String[] clusterDistName = { String.format("Comp Plots :: Cluster Seed Distribution [Seed Threshold %.3f GeV]", seedThreshold), - String.format("Comp Plots :: Cluster Seed Distribution [Cluster Threshold %.3f GeV]", clusterThreshold) }; + // Define the cluster distribution plots. + String[] clusterDistName = { String.format("Comp Plots :: Cluster Seed Distribution [Seed Threshold %.3f GeV]", seedThreshold), + String.format("Comp Plots :: Cluster Seed Distribution [Cluster Threshold %.3f GeV]", clusterThreshold) }; clusterDistribution[0] = aida.histogram2D(clusterDistName[0], 46, -23, 23, 11, -5.5, 5.5); clusterDistribution[1] = aida.histogram2D(clusterDistName[1], 46, -23, 23, 11, -5.5, 5.5); - // Define the occupancy distribution plots. - String occupancyDistName = String.format("Comp Plots :: Crystal Occupancy"); - occupancyDistribution = aida.histogram2D(occupancyDistName, 46, -23, 23, 11, -5.5, 5.5); - + // Define the occupancy distribution plots. + String occupancyDistName = String.format("Comp Plots :: Crystal Occupancy"); + occupancyDistribution = aida.histogram2D(occupancyDistName, 46, -23, 23, 11, -5.5, 5.5); + // Define the cluster hit count distribution. - String[] clusterHitDistName = { String.format("Comp Plots :: Cluster Hit Count Distribution [Seed Threshold %.3f GeV]", seedThreshold), - String.format("Comp Plots :: Cluster Hit Count Distribution [Cluster Threshold %.3f GeV]", clusterThreshold) }; - clusterHitDistribution[0] = aida.histogram1D(clusterHitDistName[0], 9, 1, 10); - clusterHitDistribution[1] = aida.histogram1D(clusterHitDistName[1], 9, 1, 10); - + String[] clusterHitDistName = { String.format("Comp Plots :: Cluster Hit Count Distribution [Seed Threshold %.3f GeV]", seedThreshold), + String.format("Comp Plots :: Cluster Hit Count Distribution [Cluster Threshold %.3f GeV]", clusterThreshold) }; + clusterHitDistribution[0] = aida.histogram1D(clusterHitDistName[0], 9, 1, 10); + clusterHitDistribution[1] = aida.histogram1D(clusterHitDistName[1], 9, 1, 10); + // Define the cluster total energy distribution. - String[] clusterEnergyDistName = { String.format("Comp Plots :: Cluster Total Energy Distribution [Seed Threshold %.3f GeV]", seedThreshold), - String.format("Comp Plots :: Cluster Total Energy Distribution [Cluster Threshold %.3f GeV]", clusterThreshold) }; - clusterEnergyDistribution[0] = aida.histogram1D(clusterEnergyDistName[0], 176, 0.0, 2.2); - clusterEnergyDistribution[1] = aida.histogram1D(clusterEnergyDistName[1], 176, 0.0, 2.2); - + String[] clusterEnergyDistName = { String.format("Comp Plots :: Cluster Total Energy Distribution [Seed Threshold %.3f GeV]", seedThreshold), + String.format("Comp Plots :: Cluster Total Energy Distribution [Cluster Threshold %.3f GeV]", clusterThreshold) }; + clusterEnergyDistribution[0] = aida.histogram1D(clusterEnergyDistName[0], 176, 0.0, 2.2); + clusterEnergyDistribution[1] = aida.histogram1D(clusterEnergyDistName[1], 176, 0.0, 2.2); + // Define the calorimeter total energy distribution. - String[] totalEnergyDistName = { String.format("Comp Plots :: Calorimeter Event Energy Distribution [Top]"), - String.format("Comp Plots :: Calorimeter Event Energy Distribution [Bottom]") }; - totalEnergyDistribution[0] = aida.histogram1D(totalEnergyDistName[0], 500, 0.0, 10.0); - totalEnergyDistribution[1] = aida.histogram1D(totalEnergyDistName[1], 500, 0.0, 10.0); + String[] totalEnergyDistName = { String.format("Comp Plots :: Calorimeter Event Energy Distribution [Top]"), + String.format("Comp Plots :: Calorimeter Event Energy Distribution [Bottom]") }; + totalEnergyDistribution[0] = aida.histogram1D(totalEnergyDistName[0], 500, 0.0, 10.0); + totalEnergyDistribution[1] = aida.histogram1D(totalEnergyDistName[1], 500, 0.0, 10.0); } } Modified: java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/ReadoutTrigger.java ============================================================================= --- java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/ReadoutTrigger.java (original) +++ java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/ReadoutTrigger.java Wed Mar 9 11:43:24 2016 @@ -22,16 +22,16 @@ * @author Kyle McCarty <[log in to unmask]> */ public class ReadoutTrigger extends Driver { - // Define settable parameters. - private double energySlopeParamF = 0.0055; - private String clusterCollectionName = "EcalClusters"; - - // Define internal variables. - private TriggerModule trigger = new TriggerModule(); - - // Define output plots. - private static final int NO_CUTS = 0; - private static final int ALL_CUTS = 1; + // Define settable parameters. + private double energySlopeParamF = 0.0055; + private String clusterCollectionName = "EcalClusters"; + + // Define internal variables. + private TriggerModule trigger = new TriggerModule(); + + // Define output plots. + private static final int NO_CUTS = 0; + private static final int ALL_CUTS = 1; private AIDA aida = AIDA.defaultInstance(); private IHistogram1D[] clusterSeedEnergy; private IHistogram1D[] clusterHitCount; @@ -46,267 +46,267 @@ private IHistogram2D[] clusterDistribution; private IHistogram2D[] pairEnergySum2D; private IHistogram2D[] pairEnergySlope2D; - + /** * Instantiates cluster plots. */ @Override public void startOfData() { - // Define plot type names. - String[] plotType = new String[2]; - plotType[NO_CUTS] = ""; - plotType[ALL_CUTS] = " (Passed All Cuts)"; - - // Define plot type directories. - String[] plotDir = new String[2]; - plotDir[NO_CUTS] = "NoCuts/"; - plotDir[ALL_CUTS] = "PassedAll/"; - - // Instantiate the plots. - for(int i = 0; i < 2; i++) { - System.out.println(plotDir[i] + "Cluster Seed Energy" + plotType[i]); - clusterSeedEnergy[i] = aida.histogram1D(plotDir[i] + "Cluster Seed Energy" + plotType[i], 88, 0.0, 1.1); - clusterSeedEnergy[i].annotation().addItem("xAxisLabel", "Seed Energy (GeV)"); - clusterSeedEnergy[i].annotation().addItem("yAxisLabel", "Count"); - - clusterHitCount[i] = aida.histogram1D(plotDir[i] + "Cluster Hit Count" + plotType[i], 9, 0.5, 9.5); - clusterHitCount[i].annotation().addItem("xAxisLabel", "Hit Count"); - clusterHitCount[i].annotation().addItem("yAxisLabel", "Count"); - - clusterTotalEnergy[i] = aida.histogram1D(plotDir[i] + "Cluster Total Energy" + plotType[i], 88, 0.0, 1.1); - clusterTotalEnergy[i].annotation().addItem("xAxisLabel", "Cluster Energy (GeV)"); - clusterTotalEnergy[i].annotation().addItem("yAxisLabel", "Count"); - - clusterTime[i] = aida.histogram1D(plotDir[i] + "Cluster Time" + plotType[i], 100, 0.0, 400); - clusterTime[i].annotation().addItem("xAxisLabel", "Cluster Time (ns)"); - clusterTime[i].annotation().addItem("yAxisLabel", "Count"); - - pairEnergySum[i] = aida.histogram1D(plotDir[i] + "Pair Energy Sum" + plotType[i], 88, 0.0, 2.2); - pairEnergySum[i].annotation().addItem("xAxisLabel", "Energy Sum (GeV)"); - pairEnergySum[i].annotation().addItem("yAxisLabel", "Count"); - - pairEnergyDifference[i] = aida.histogram1D(plotDir[i] + "Pair Energy Difference" + plotType[i], 88, 0.0, 1.1); - pairEnergyDifference[i].annotation().addItem("xAxisLabel", "Energy Difference (GeV)"); - pairEnergyDifference[i].annotation().addItem("yAxisLabel", "Count"); - - pairCoplanarity[i] = aida.histogram1D(plotDir[i] + "Pair Coplanarity" + plotType[i], 180, 0.0, 180.0); - pairCoplanarity[i].annotation().addItem("xAxisLabel", "Coplanarity Angle (Degrees)"); - pairCoplanarity[i].annotation().addItem("yAxisLabel", "Count"); - - pairEnergySlope[i] = aida.histogram1D(plotDir[i] + "Pair Energy Slope" + plotType[i], 200, 0.0, 4.0); - pairEnergySlope[i].annotation().addItem("xAxisLabel", "Energy Slope (GeV)"); - pairEnergySlope[i].annotation().addItem("yAxisLabel", "Count"); - - pairTime[i] = aida.histogram1D(plotDir[i] + "Pair Time" + plotType[i], 100, 0.0, 400); - pairTime[i].annotation().addItem("xAxisLabel", "Cluster Time (ns)"); - pairTime[i].annotation().addItem("yAxisLabel", "Count"); - - pairCoincidence[i] = aida.histogram1D(plotDir[i] + "Pair Coincidence" + plotType[i], 8, 0.0, 32); - pairCoincidence[i].annotation().addItem("xAxisLabel", "Coincidence Time (ns)"); - pairCoincidence[i].annotation().addItem("yAxisLabel", "Count"); - - clusterDistribution[i] = aida.histogram2D(plotDir[i] + "Cluster Seed Distribution" + plotType[i], 46, -23, 23, 11, -5.5, 5.5); - clusterDistribution[i].annotation().addItem("xAxisLabel", "x-Index"); - clusterDistribution[i].annotation().addItem("yAxisLabel", "y-Index"); - - pairEnergySum2D[i] = aida.histogram2D(plotDir[i] + "Pair Energy Sum 2D" + plotType[i], 88, 0.0, 2.2, 88, 0.0, 2.2); - pairEnergySum2D[i].annotation().addItem("xAxisLabel", "E1"); - pairEnergySum2D[i].annotation().addItem("yAxisLabel", "E2"); - - pairEnergySlope2D[i] = aida.histogram2D(plotDir[i] + "Pair Energy Slope 2D" + plotType[i], 88, 0.0, 1.1, 200, 0.0, 400); - pairEnergySlope2D[i].annotation().addItem("xAxisLabel", "E1"); - pairEnergySlope2D[i].annotation().addItem("yAxisLabel", "E2"); - } + // Define plot type names. + String[] plotType = new String[2]; + plotType[NO_CUTS] = ""; + plotType[ALL_CUTS] = " (Passed All Cuts)"; + + // Define plot type directories. + String[] plotDir = new String[2]; + plotDir[NO_CUTS] = "NoCuts/"; + plotDir[ALL_CUTS] = "PassedAll/"; + + // Instantiate the plots. + for(int i = 0; i < 2; i++) { + System.out.println(plotDir[i] + "Cluster Seed Energy" + plotType[i]); + clusterSeedEnergy[i] = aida.histogram1D(plotDir[i] + "Cluster Seed Energy" + plotType[i], 88, 0.0, 1.1); + clusterSeedEnergy[i].annotation().addItem("xAxisLabel", "Seed Energy (GeV)"); + clusterSeedEnergy[i].annotation().addItem("yAxisLabel", "Count"); + + clusterHitCount[i] = aida.histogram1D(plotDir[i] + "Cluster Hit Count" + plotType[i], 9, 0.5, 9.5); + clusterHitCount[i].annotation().addItem("xAxisLabel", "Hit Count"); + clusterHitCount[i].annotation().addItem("yAxisLabel", "Count"); + + clusterTotalEnergy[i] = aida.histogram1D(plotDir[i] + "Cluster Total Energy" + plotType[i], 88, 0.0, 1.1); + clusterTotalEnergy[i].annotation().addItem("xAxisLabel", "Cluster Energy (GeV)"); + clusterTotalEnergy[i].annotation().addItem("yAxisLabel", "Count"); + + clusterTime[i] = aida.histogram1D(plotDir[i] + "Cluster Time" + plotType[i], 100, 0.0, 400); + clusterTime[i].annotation().addItem("xAxisLabel", "Cluster Time (ns)"); + clusterTime[i].annotation().addItem("yAxisLabel", "Count"); + + pairEnergySum[i] = aida.histogram1D(plotDir[i] + "Pair Energy Sum" + plotType[i], 88, 0.0, 2.2); + pairEnergySum[i].annotation().addItem("xAxisLabel", "Energy Sum (GeV)"); + pairEnergySum[i].annotation().addItem("yAxisLabel", "Count"); + + pairEnergyDifference[i] = aida.histogram1D(plotDir[i] + "Pair Energy Difference" + plotType[i], 88, 0.0, 1.1); + pairEnergyDifference[i].annotation().addItem("xAxisLabel", "Energy Difference (GeV)"); + pairEnergyDifference[i].annotation().addItem("yAxisLabel", "Count"); + + pairCoplanarity[i] = aida.histogram1D(plotDir[i] + "Pair Coplanarity" + plotType[i], 180, 0.0, 180.0); + pairCoplanarity[i].annotation().addItem("xAxisLabel", "Coplanarity Angle (Degrees)"); + pairCoplanarity[i].annotation().addItem("yAxisLabel", "Count"); + + pairEnergySlope[i] = aida.histogram1D(plotDir[i] + "Pair Energy Slope" + plotType[i], 200, 0.0, 4.0); + pairEnergySlope[i].annotation().addItem("xAxisLabel", "Energy Slope (GeV)"); + pairEnergySlope[i].annotation().addItem("yAxisLabel", "Count"); + + pairTime[i] = aida.histogram1D(plotDir[i] + "Pair Time" + plotType[i], 100, 0.0, 400); + pairTime[i].annotation().addItem("xAxisLabel", "Cluster Time (ns)"); + pairTime[i].annotation().addItem("yAxisLabel", "Count"); + + pairCoincidence[i] = aida.histogram1D(plotDir[i] + "Pair Coincidence" + plotType[i], 8, 0.0, 32); + pairCoincidence[i].annotation().addItem("xAxisLabel", "Coincidence Time (ns)"); + pairCoincidence[i].annotation().addItem("yAxisLabel", "Count"); + + clusterDistribution[i] = aida.histogram2D(plotDir[i] + "Cluster Seed Distribution" + plotType[i], 46, -23, 23, 11, -5.5, 5.5); + clusterDistribution[i].annotation().addItem("xAxisLabel", "x-Index"); + clusterDistribution[i].annotation().addItem("yAxisLabel", "y-Index"); + + pairEnergySum2D[i] = aida.histogram2D(plotDir[i] + "Pair Energy Sum 2D" + plotType[i], 88, 0.0, 2.2, 88, 0.0, 2.2); + pairEnergySum2D[i].annotation().addItem("xAxisLabel", "E1"); + pairEnergySum2D[i].annotation().addItem("yAxisLabel", "E2"); + + pairEnergySlope2D[i] = aida.histogram2D(plotDir[i] + "Pair Energy Slope 2D" + plotType[i], 88, 0.0, 1.1, 200, 0.0, 400); + pairEnergySlope2D[i].annotation().addItem("xAxisLabel", "E1"); + pairEnergySlope2D[i].annotation().addItem("yAxisLabel", "E2"); + } } /** * Produces both uncut and cut distributions from clusters. */ - @Override - public void process(EventHeader event) { - // Check for a collection of clusters. - if(event.hasCollection(Cluster.class, clusterCollectionName)) { - // Get the list of clusters. - List<Cluster> clusters = event.get(Cluster.class, clusterCollectionName); - - // Track which clusters have already been plotted. - Set<Cluster> plottedClustersUncut = new HashSet<Cluster>(clusters.size()); - Set<Cluster> plottedClustersCut = new HashSet<Cluster>(clusters.size()); - - // Populate a list of cluster pairs. - List<Cluster[]> pairs = getClusterPairs(clusters); - - // Process all cluster pairs. - pairLoop: - for(Cluster[] pair : pairs) { - // Get the x and y indices for each cluster in the pair. - int[] ix = { pair[0].getCalorimeterHits().get(0).getIdentifierFieldValue("ix"), - pair[1].getCalorimeterHits().get(0).getIdentifierFieldValue("ix") }; - int[] iy = { pair[0].getCalorimeterHits().get(0).getIdentifierFieldValue("iy"), - pair[1].getCalorimeterHits().get(0).getIdentifierFieldValue("iy") }; - - // Iterate over the clusters in the pair and plot the - // cluster singles distributions. - for(int clusterIndex = 0; clusterIndex < 2; clusterIndex++) { - // Only plot cluster singles distributions for - // clusters if they have not already been plotted. - // Note that this is needed because the same cluster - // can appear across multiple pairs. - if(!plottedClustersUncut.contains(pair[clusterIndex])) { - clusterSeedEnergy[NO_CUTS].fill(TriggerModule.getValueClusterSeedEnergy(pair[clusterIndex])); - clusterTotalEnergy[NO_CUTS].fill(TriggerModule.getValueClusterTotalEnergy(pair[clusterIndex])); - clusterHitCount[NO_CUTS].fill(TriggerModule.getValueClusterHitCount(pair[clusterIndex])); - clusterDistribution[NO_CUTS].fill(ix[clusterIndex], iy[clusterIndex]); - clusterTime[NO_CUTS].fill(pair[clusterIndex].getCalorimeterHits().get(0).getTime()); - plottedClustersUncut.add(pair[clusterIndex]); - } - } - - // Plot the cluster pair distributions. - pairEnergySum[NO_CUTS].fill(TriggerModule.getValueEnergySum(pair)); - pairEnergyDifference[NO_CUTS].fill(TriggerModule.getValueEnergyDifference(pair)); - pairEnergySlope[NO_CUTS].fill(TriggerModule.getValueEnergySlope(pair, energySlopeParamF)); - pairCoplanarity[NO_CUTS].fill(TriggerModule.getValueCoplanarity(pair)); - pairTime[NO_CUTS].fill(pair[1].getCalorimeterHits().get(0).getTime()); - pairCoincidence[NO_CUTS].fill(TriggerModule.getValueTimeCoincidence(pair)); - pairEnergySum2D[NO_CUTS].fill(pair[0].getEnergy(), pair[1].getEnergy()); - if(pair[0].getEnergy() < pair[1].getEnergy()) { - pairEnergySlope2D[NO_CUTS].fill(pair[0].getEnergy(), TriggerModule.getClusterDistance(pair[0])); - } else { - pairEnergySlope2D[NO_CUTS].fill(pair[1].getEnergy(), TriggerModule.getClusterDistance(pair[1])); - } - - // Perform the cluster singles cuts. - if(!(trigger.clusterHitCountCut(pair[0]) && trigger.clusterHitCountCut(pair[1]))) { - continue pairLoop; - } if(!(trigger.clusterTotalEnergyCut(pair[0]) && trigger.clusterTotalEnergyCut(pair[1]))) { - continue pairLoop; - } if(!(trigger.clusterSeedEnergyCut(pair[0]) && trigger.clusterSeedEnergyCut(pair[1]))) { - continue pairLoop; - } - - // Perform the cluster pair cuts. - if(!trigger.pairCoplanarityCut(pair)) { - continue pairLoop; - } if(!trigger.pairEnergyDifferenceCut(pair)) { - continue pairLoop; - } if(!trigger.pairEnergySlopeCut(pair)) { - continue pairLoop; - } if(!trigger.pairEnergySumCut(pair)) { - continue pairLoop; - } - - // Iterate over the clusters in the pair and plot the - // cluster singles distributions. - for(int clusterIndex = 0; clusterIndex < 2; clusterIndex++) { - // Only plot cluster singles distributions for - // clusters if they have not already been plotted. - // Note that this is needed because the same cluster - // can appear across multiple pairs. - if(!plottedClustersCut.contains(pair[clusterIndex])) { - clusterSeedEnergy[ALL_CUTS].fill(TriggerModule.getValueClusterSeedEnergy(pair[clusterIndex])); - clusterTotalEnergy[ALL_CUTS].fill(TriggerModule.getValueClusterTotalEnergy(pair[clusterIndex])); - clusterHitCount[ALL_CUTS].fill(TriggerModule.getValueClusterHitCount(pair[clusterIndex])); - clusterDistribution[ALL_CUTS].fill(ix[clusterIndex], iy[clusterIndex]); - clusterTime[ALL_CUTS].fill(pair[clusterIndex].getCalorimeterHits().get(0).getTime()); - plottedClustersCut.add(pair[clusterIndex]); - } - } - - // Plot the cluster pair distributions. - pairEnergySum[ALL_CUTS].fill(TriggerModule.getValueEnergySum(pair)); - pairEnergyDifference[ALL_CUTS].fill(TriggerModule.getValueEnergyDifference(pair)); - pairEnergySlope[ALL_CUTS].fill(TriggerModule.getValueEnergySlope(pair, energySlopeParamF)); - pairCoplanarity[ALL_CUTS].fill(TriggerModule.getValueCoplanarity(pair)); - pairTime[ALL_CUTS].fill(pair[1].getCalorimeterHits().get(0).getTime()); - pairCoincidence[ALL_CUTS].fill(TriggerModule.getValueTimeCoincidence(pair)); - pairEnergySum2D[ALL_CUTS].fill(pair[0].getEnergy(), pair[1].getEnergy()); - if(pair[0].getEnergy() < pair[1].getEnergy()) { - pairEnergySlope2D[ALL_CUTS].fill(pair[0].getEnergy(), TriggerModule.getClusterDistance(pair[0])); - } else { - pairEnergySlope2D[ALL_CUTS].fill(pair[1].getEnergy(), TriggerModule.getClusterDistance(pair[1])); - } - - } - } - } - - public void setClusterCollectionName(String clusterCollectionName) { - this.clusterCollectionName = clusterCollectionName; - } - - public void setEnergySlopeParamF(double energySlopeParamF) { - this.energySlopeParamF = energySlopeParamF; - trigger.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_F, energySlopeParamF); - } - - public void setSeedEnergyLow(double value) { - trigger.setCutValue(TriggerModule.CLUSTER_SEED_ENERGY_LOW, value); - } - - public void setClusterEnergyLow(double value) { - trigger.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, value); - } - - public void setClusterEnergyHigh(double value) { - trigger.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, value); - } - - public void setHitCountLow(double value) { - trigger.setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, value); - } - - public void setEnergySumLow(double value) { - trigger.setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, value); - } - - public void setEnergySumHigh(double value) { - trigger.setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, value); - } - - public void setEnergyDifferenceHigh(double value) { - trigger.setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, value); - } - - public void setEnergySlopeLow(double value) { - trigger.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, value); - } - - public void setCoplanarityHigh(double value) { - trigger.setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, value); - } - - public void setTimeCoincidence(double value) { - trigger.setCutValue(TriggerModule.PAIR_TIME_COINCIDENCE, value); - } - - /** - * Creates all top/bottom pairs from the event data. - * @param clusters - A list of clusters from which to form pairs. - * @return Returns a <code>List</code> collection that contains - * <code>Cluster</code> arrays of size two. - */ - private List<Cluster[]> getClusterPairs(List<Cluster> clusters) { - // Separate the clusters into top nad bottom clusters. - List<Cluster> topList = new ArrayList<Cluster>(); - List<Cluster> botList = new ArrayList<Cluster>(); - for(Cluster cluster : clusters) { - if(cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy") > 0) { - topList.add(cluster); - } else { - botList.add(cluster); - } - } - - // Create all possible top/bottom cluster pairs. - List<Cluster[]> pairList = new ArrayList<Cluster[]>(); - for(Cluster topCluster : topList) { - for(Cluster botCluster : botList) { - pairList.add(new Cluster[] { topCluster, botCluster }); - } - } - - // Return the pairs. - return pairList; - } + @Override + public void process(EventHeader event) { + // Check for a collection of clusters. + if(event.hasCollection(Cluster.class, clusterCollectionName)) { + // Get the list of clusters. + List<Cluster> clusters = event.get(Cluster.class, clusterCollectionName); + + // Track which clusters have already been plotted. + Set<Cluster> plottedClustersUncut = new HashSet<Cluster>(clusters.size()); + Set<Cluster> plottedClustersCut = new HashSet<Cluster>(clusters.size()); + + // Populate a list of cluster pairs. + List<Cluster[]> pairs = getClusterPairs(clusters); + + // Process all cluster pairs. + pairLoop: + for(Cluster[] pair : pairs) { + // Get the x and y indices for each cluster in the pair. + int[] ix = { pair[0].getCalorimeterHits().get(0).getIdentifierFieldValue("ix"), + pair[1].getCalorimeterHits().get(0).getIdentifierFieldValue("ix") }; + int[] iy = { pair[0].getCalorimeterHits().get(0).getIdentifierFieldValue("iy"), + pair[1].getCalorimeterHits().get(0).getIdentifierFieldValue("iy") }; + + // Iterate over the clusters in the pair and plot the + // cluster singles distributions. + for(int clusterIndex = 0; clusterIndex < 2; clusterIndex++) { + // Only plot cluster singles distributions for + // clusters if they have not already been plotted. + // Note that this is needed because the same cluster + // can appear across multiple pairs. + if(!plottedClustersUncut.contains(pair[clusterIndex])) { + clusterSeedEnergy[NO_CUTS].fill(TriggerModule.getValueClusterSeedEnergy(pair[clusterIndex])); + clusterTotalEnergy[NO_CUTS].fill(TriggerModule.getValueClusterTotalEnergy(pair[clusterIndex])); + clusterHitCount[NO_CUTS].fill(TriggerModule.getValueClusterHitCount(pair[clusterIndex])); + clusterDistribution[NO_CUTS].fill(ix[clusterIndex], iy[clusterIndex]); + clusterTime[NO_CUTS].fill(pair[clusterIndex].getCalorimeterHits().get(0).getTime()); + plottedClustersUncut.add(pair[clusterIndex]); + } + } + + // Plot the cluster pair distributions. + pairEnergySum[NO_CUTS].fill(TriggerModule.getValueEnergySum(pair)); + pairEnergyDifference[NO_CUTS].fill(TriggerModule.getValueEnergyDifference(pair)); + pairEnergySlope[NO_CUTS].fill(TriggerModule.getValueEnergySlope(pair, energySlopeParamF)); + pairCoplanarity[NO_CUTS].fill(TriggerModule.getValueCoplanarity(pair)); + pairTime[NO_CUTS].fill(pair[1].getCalorimeterHits().get(0).getTime()); + pairCoincidence[NO_CUTS].fill(TriggerModule.getValueTimeCoincidence(pair)); + pairEnergySum2D[NO_CUTS].fill(pair[0].getEnergy(), pair[1].getEnergy()); + if(pair[0].getEnergy() < pair[1].getEnergy()) { + pairEnergySlope2D[NO_CUTS].fill(pair[0].getEnergy(), TriggerModule.getClusterDistance(pair[0])); + } else { + pairEnergySlope2D[NO_CUTS].fill(pair[1].getEnergy(), TriggerModule.getClusterDistance(pair[1])); + } + + // Perform the cluster singles cuts. + if(!(trigger.clusterHitCountCut(pair[0]) && trigger.clusterHitCountCut(pair[1]))) { + continue pairLoop; + } if(!(trigger.clusterTotalEnergyCut(pair[0]) && trigger.clusterTotalEnergyCut(pair[1]))) { + continue pairLoop; + } if(!(trigger.clusterSeedEnergyCut(pair[0]) && trigger.clusterSeedEnergyCut(pair[1]))) { + continue pairLoop; + } + + // Perform the cluster pair cuts. + if(!trigger.pairCoplanarityCut(pair)) { + continue pairLoop; + } if(!trigger.pairEnergyDifferenceCut(pair)) { + continue pairLoop; + } if(!trigger.pairEnergySlopeCut(pair)) { + continue pairLoop; + } if(!trigger.pairEnergySumCut(pair)) { + continue pairLoop; + } + + // Iterate over the clusters in the pair and plot the + // cluster singles distributions. + for(int clusterIndex = 0; clusterIndex < 2; clusterIndex++) { + // Only plot cluster singles distributions for + // clusters if they have not already been plotted. + // Note that this is needed because the same cluster + // can appear across multiple pairs. + if(!plottedClustersCut.contains(pair[clusterIndex])) { + clusterSeedEnergy[ALL_CUTS].fill(TriggerModule.getValueClusterSeedEnergy(pair[clusterIndex])); + clusterTotalEnergy[ALL_CUTS].fill(TriggerModule.getValueClusterTotalEnergy(pair[clusterIndex])); + clusterHitCount[ALL_CUTS].fill(TriggerModule.getValueClusterHitCount(pair[clusterIndex])); + clusterDistribution[ALL_CUTS].fill(ix[clusterIndex], iy[clusterIndex]); + clusterTime[ALL_CUTS].fill(pair[clusterIndex].getCalorimeterHits().get(0).getTime()); + plottedClustersCut.add(pair[clusterIndex]); + } + } + + // Plot the cluster pair distributions. + pairEnergySum[ALL_CUTS].fill(TriggerModule.getValueEnergySum(pair)); + pairEnergyDifference[ALL_CUTS].fill(TriggerModule.getValueEnergyDifference(pair)); + pairEnergySlope[ALL_CUTS].fill(TriggerModule.getValueEnergySlope(pair, energySlopeParamF)); + pairCoplanarity[ALL_CUTS].fill(TriggerModule.getValueCoplanarity(pair)); + pairTime[ALL_CUTS].fill(pair[1].getCalorimeterHits().get(0).getTime()); + pairCoincidence[ALL_CUTS].fill(TriggerModule.getValueTimeCoincidence(pair)); + pairEnergySum2D[ALL_CUTS].fill(pair[0].getEnergy(), pair[1].getEnergy()); + if(pair[0].getEnergy() < pair[1].getEnergy()) { + pairEnergySlope2D[ALL_CUTS].fill(pair[0].getEnergy(), TriggerModule.getClusterDistance(pair[0])); + } else { + pairEnergySlope2D[ALL_CUTS].fill(pair[1].getEnergy(), TriggerModule.getClusterDistance(pair[1])); + } + + } + } + } + + public void setClusterCollectionName(String clusterCollectionName) { + this.clusterCollectionName = clusterCollectionName; + } + + public void setEnergySlopeParamF(double energySlopeParamF) { + this.energySlopeParamF = energySlopeParamF; + trigger.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_F, energySlopeParamF); + } + + public void setSeedEnergyLow(double value) { + trigger.setCutValue(TriggerModule.CLUSTER_SEED_ENERGY_LOW, value); + } + + public void setClusterEnergyLow(double value) { + trigger.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, value); + } + + public void setClusterEnergyHigh(double value) { + trigger.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, value); + } + + public void setHitCountLow(double value) { + trigger.setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, value); + } + + public void setEnergySumLow(double value) { + trigger.setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, value); + } + + public void setEnergySumHigh(double value) { + trigger.setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, value); + } + + public void setEnergyDifferenceHigh(double value) { + trigger.setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, value); + } + + public void setEnergySlopeLow(double value) { + trigger.setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, value); + } + + public void setCoplanarityHigh(double value) { + trigger.setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, value); + } + + public void setTimeCoincidence(double value) { + trigger.setCutValue(TriggerModule.PAIR_TIME_COINCIDENCE, value); + } + + /** + * Creates all top/bottom pairs from the event data. + * @param clusters - A list of clusters from which to form pairs. + * @return Returns a <code>List</code> collection that contains + * <code>Cluster</code> arrays of size two. + */ + private List<Cluster[]> getClusterPairs(List<Cluster> clusters) { + // Separate the clusters into top nad bottom clusters. + List<Cluster> topList = new ArrayList<Cluster>(); + List<Cluster> botList = new ArrayList<Cluster>(); + for(Cluster cluster : clusters) { + if(cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy") > 0) { + topList.add(cluster); + } else { + botList.add(cluster); + } + } + + // Create all possible top/bottom cluster pairs. + List<Cluster[]> pairList = new ArrayList<Cluster[]>(); + for(Cluster topCluster : topList) { + for(Cluster botCluster : botList) { + pairList.add(new Cluster[] { topCluster, botCluster }); + } + } + + // Return the pairs. + return pairList; + } } Modified: java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/RingBuffer.java ============================================================================= --- java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/RingBuffer.java (original) +++ java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/RingBuffer.java Wed Mar 9 11:43:24 2016 @@ -8,46 +8,46 @@ */ public class RingBuffer { - protected double[] array; - protected int ptr; + protected double[] array; + protected int ptr; - public RingBuffer(int size) { - array = new double[size]; //initialized to 0 - ptr = 0; - } + public RingBuffer(int size) { + array = new double[size]; //initialized to 0 + ptr = 0; + } - /** - * - * @return value stored at current cell - */ - public double currentValue() { - return array[ptr]; - } + /** + * + * @return value stored at current cell + */ + public double currentValue() { + return array[ptr]; + } - //return content of specified cell (pos=0 for current cell) - public double getValue(int pos) { - return array[((ptr + pos) % array.length + array.length) % array.length]; - } + //return content of specified cell (pos=0 for current cell) + public double getValue(int pos) { + return array[((ptr + pos) % array.length + array.length) % array.length]; + } - /** - * Clear value at current cell and step to the next one - */ - public void step() { - array[ptr] = 0; - ptr++; - if (ptr == array.length) { - ptr = 0; - } - } + /** + * Clear value at current cell and step to the next one + */ + public void step() { + array[ptr] = 0; + ptr++; + if (ptr == array.length) { + ptr = 0; + } + } - /** - * Add given value to specified cell - * @param pos Target position relative to current cell (pos=0 for current cell) - * @param val - */ - public void addToCell(int pos, double val) { - array[(ptr + pos) % array.length] += val; - } + /** + * Add given value to specified cell + * @param pos Target position relative to current cell (pos=0 for current cell) + * @param val + */ + public void addToCell(int pos, double val) { + array[(ptr + pos) % array.length] += val; + } public int getLength() { return array.length; Modified: java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/TimeEvolutionEcalReadoutDriver.java ============================================================================= --- java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/TimeEvolutionEcalReadoutDriver.java (original) +++ java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/TimeEvolutionEcalReadoutDriver.java Wed Mar 9 11:43:24 2016 @@ -23,7 +23,7 @@ double t0 = 18.0; public TimeEvolutionEcalReadoutDriver() { - hitClass = CalorimeterHit.class; + hitClass = CalorimeterHit.class; } public void setT0(double t0) { @@ -39,8 +39,8 @@ protected void readHits(List<CalorimeterHit> hits) { for (Long cellID : eDepMap.keySet()) { RingBuffer eDepBuffer = eDepMap.get(cellID); - if (eDepBuffer.currentValue() > threshold) { - hits.add(CalorimeterHitUtilities.create(eDepBuffer.currentValue(), readoutTime(), cellID, hitType)); + if (eDepBuffer.currentValue() > threshold) { + hits.add(CalorimeterHitUtilities.create(eDepBuffer.currentValue(), readoutTime(), cellID, hitType)); } eDepBuffer.step(); } Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalCalibrationsDriver.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalCalibrationsDriver.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalCalibrationsDriver.java Wed Mar 9 11:43:24 2016 @@ -222,9 +222,9 @@ // Create a new calibration object and add it to the collection, using mean for pedestal // and sigma for noise. try { - calibrations.add(new EcalCalibration(channelId, mean, sigma)); + calibrations.add(new EcalCalibration(channelId, mean, sigma)); } catch (ConditionsObjectException e) { - throw new RuntimeException("Error adding new calibration object.", e); + throw new RuntimeException("Error adding new calibration object.", e); } } Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalConverterDriver.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalConverterDriver.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalConverterDriver.java Wed Mar 9 11:43:24 2016 @@ -17,8 +17,8 @@ * @version $Id: EcalConverterDriver.java,v 1.1 2013/02/25 22:39:24 meeg Exp $ */ public class EcalConverterDriver extends Driver { - - Detector detector = null; + + Detector detector = null; String rawCollectionName; String ecalReadoutName = "EcalHits"; @@ -59,7 +59,7 @@ @Override public void detectorChanged(Detector detector) { - this.detector = detector; + this.detector = detector; } @Override @@ -87,8 +87,8 @@ } private CalorimeterHit HitDtoA(RawCalorimeterHit hit) { - double energy = DtoA(hit.getAmplitude(), hit.getCellID()); - return CalorimeterHitUtilities.create(energy, period * hit.getTimeStamp() + dt, hit.getCellID()); + double energy = DtoA(hit.getAmplitude(), hit.getCellID()); + return CalorimeterHitUtilities.create(energy, period * hit.getTimeStamp() + dt, hit.getCellID()); } // private RawCalorimeterHit HitAtoD(CalorimeterHit hit) { Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalEdepToTriggerConverterDriver.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalEdepToTriggerConverterDriver.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalEdepToTriggerConverterDriver.java Wed Mar 9 11:43:24 2016 @@ -29,11 +29,11 @@ * @author Holly Szumila <[log in to unmask]> */ public class EcalEdepToTriggerConverterDriver extends Driver { - + private EcalConditions ecalConditions = null; private static final boolean isBadChannelLoaded = true; - + private final String ecalReadoutName = "EcalHits"; private String inputCollection = "EcalHits"; private String readoutCollection = "EcalCalHits"; @@ -94,7 +94,7 @@ @Override public void detectorChanged(Detector detector) { - + // ECAL combined conditions object. ecalConditions = DatabaseConditionsManager.getInstance().getEcalConditions(); @@ -104,7 +104,7 @@ public boolean isBadCrystal(CalorimeterHit hit) { // Get the channel data. EcalChannelConstants channelData = findChannel(hit.getCellID()); - + return isBadChannelLoaded ? channelData.isBadChannel() : false; } @@ -165,8 +165,8 @@ // System.out.format("trigger: %f %f\n", amplitude, triggerIntegral); int truncatedIntegral = (int) Math.floor(triggerIntegral / truncateScale); - if (truncatedIntegral > 0) { - return CalorimeterHitUtilities.create(truncatedIntegral, hit.getTime(), hit.getCellID()); + if (truncatedIntegral > 0) { + return CalorimeterHitUtilities.create(truncatedIntegral, hit.getTime(), hit.getCellID()); } return null; } Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalOnlineRawConverter.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalOnlineRawConverter.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalOnlineRawConverter.java Wed Mar 9 11:43:24 2016 @@ -27,28 +27,28 @@ private int nPeak = 3; public EcalOnlineRawConverter() { - // Track changes in the DAQ configuration. - ConfigurationManager.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - // Get the FADC configuration. - config = ConfigurationManager.getInstance().getFADCConfig(); - // Get the number of peaks. - if(config.getMode() == 1) nPeak = Integer.MAX_VALUE; - else nPeak = config.getMaxPulses(); - // Print the FADC configuration. - System.out.println(); - System.out.println(); - System.out.printf("NSA :: %d ns%n", config.getNSA()); - System.out.printf("NSB :: %d ns%n", config.getNSB()); - System.out.printf("Window Samples :: %d clock-cycles%n", config.getWindowWidth()); - System.out.printf("Max Peaks :: %d peaks%n", nPeak); - System.out.println("======================================================================"); - System.out.println("=== FADC Pulse-Processing Settings ==================================="); - System.out.println("======================================================================"); - config.printConfig(System.out); - } - }); + // Track changes in the DAQ configuration. + ConfigurationManager.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + // Get the FADC configuration. + config = ConfigurationManager.getInstance().getFADCConfig(); + // Get the number of peaks. + if(config.getMode() == 1) nPeak = Integer.MAX_VALUE; + else nPeak = config.getMaxPulses(); + // Print the FADC configuration. + System.out.println(); + System.out.println(); + System.out.printf("NSA :: %d ns%n", config.getNSA()); + System.out.printf("NSB :: %d ns%n", config.getNSB()); + System.out.printf("Window Samples :: %d clock-cycles%n", config.getWindowWidth()); + System.out.printf("Max Peaks :: %d peaks%n", nPeak); + System.out.println("======================================================================"); + System.out.println("=== FADC Pulse-Processing Settings ==================================="); + System.out.println("======================================================================"); + config.printConfig(System.out); + } + }); } /** @@ -137,10 +137,10 @@ // search for next threshold crossing begins at end of this pulse: if (ConfigurationManager.getInstance().getFADCConfig().getMode() == 1) { // special case, emulating SSP: - ii += 8; + ii += 8; } else { // "normal" case, emulating FADC250: - ii += config.getNSA()/nsPerSample - 1; + ii += config.getNSA()/nsPerSample - 1; } // firmware limit on # of peaks: Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalOnlineRawConverterDriver.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalOnlineRawConverterDriver.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalOnlineRawConverterDriver.java Wed Mar 9 11:43:24 2016 @@ -85,12 +85,12 @@ @Override public void process(EventHeader event) { - // Do not process the event if the DAQ configuration should be - // used for value, but is not initialized. - if(!ConfigurationManager.isInitialized()) { - return; - } - + // Do not process the event if the DAQ configuration should be + // used for value, but is not initialized. + if(!ConfigurationManager.isInitialized()) { + return; + } + double timeOffset = 0.0; int flags = 0; flags += 1 << LCIOConstants.RCHBIT_TIME; //store hit time @@ -102,12 +102,12 @@ * This is for FADC Mode-1 data: */ if (event.hasCollection(RawTrackerHit.class, rawCollectionName)) { - List<RawTrackerHit> hits = event.get(RawTrackerHit.class, rawCollectionName); + List<RawTrackerHit> hits = event.get(RawTrackerHit.class, rawCollectionName); - for (RawTrackerHit hit : hits) { - newHits.addAll(converter.HitDtoA(event,hit)); - } - event.put(ecalCollectionName, newHits, CalorimeterHit.class, flags, ecalReadoutName); + for (RawTrackerHit hit : hits) { + newHits.addAll(converter.HitDtoA(event,hit)); + } + event.put(ecalCollectionName, newHits, CalorimeterHit.class, flags, ecalReadoutName); } /* @@ -115,26 +115,26 @@ */ if (event.hasCollection(RawCalorimeterHit.class, rawCollectionName)) { - /* - * This is for FADC Mode-7 data: - */ - if (event.hasCollection(LCRelation.class, extraDataRelationsName)) { // extra information available from mode 7 readout - List<LCRelation> extraDataRelations = event.get(LCRelation.class, extraDataRelationsName); - for (LCRelation rel : extraDataRelations) { - RawCalorimeterHit hit = (RawCalorimeterHit) rel.getFrom(); - GenericObject extraData = (GenericObject) rel.getTo(); - newHits.add(converter.HitDtoA(event,hit, extraData, timeOffset)); - } - } else { - /* - * This is for FADC Mode-3 data: - */ - List<RawCalorimeterHit> hits = event.get(RawCalorimeterHit.class, rawCollectionName); - for (RawCalorimeterHit hit : hits) { - newHits.add(converter.HitDtoA(event, hit, timeOffset)); - } - } - event.put(ecalCollectionName, newHits, CalorimeterHit.class, flags, ecalReadoutName); + /* + * This is for FADC Mode-7 data: + */ + if (event.hasCollection(LCRelation.class, extraDataRelationsName)) { // extra information available from mode 7 readout + List<LCRelation> extraDataRelations = event.get(LCRelation.class, extraDataRelationsName); + for (LCRelation rel : extraDataRelations) { + RawCalorimeterHit hit = (RawCalorimeterHit) rel.getFrom(); + GenericObject extraData = (GenericObject) rel.getTo(); + newHits.add(converter.HitDtoA(event,hit, extraData, timeOffset)); + } + } else { + /* + * This is for FADC Mode-3 data: + */ + List<RawCalorimeterHit> hits = event.get(RawCalorimeterHit.class, rawCollectionName); + for (RawCalorimeterHit hit : hits) { + newHits.add(converter.HitDtoA(event, hit, timeOffset)); + } + } + event.put(ecalCollectionName, newHits, CalorimeterHit.class, flags, ecalReadoutName); } } Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalPedestalCalculator.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalPedestalCalculator.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalPedestalCalculator.java Wed Mar 9 11:43:24 2016 @@ -114,11 +114,11 @@ } } if (uploadToDB) { - try { - uploadToDB(); - } catch (DatabaseObjectException | ConditionsObjectException | SQLException e) { - throw new RuntimeException("Error uploading to database.", e); - } + try { + uploadToDB(); + } catch (DatabaseObjectException | ConditionsObjectException | SQLException e) { + throw new RuntimeException("Error uploading to database.", e); + } } else { System.out.println("!!!!!!!!!!!!!!!!!!!!!!! Not Writing Database !!!!!!!!!!!!!!!!!!!!!!!!!!"); } Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverter.java Wed Mar 9 11:43:24 2016 @@ -41,9 +41,9 @@ */ public class EcalRawConverter { - /** - * If true, time walk correction is performed. - */ + /** + * If true, time walk correction is performed. + */ private boolean useTimeWalkCorrection = true; /** @@ -149,42 +149,42 @@ * for trigger emulation. */ public EcalRawConverter() { - // Track changes in the DAQ configuration. - ConfigurationManager.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - // If the DAQ configuration should be used, load the - // relevant settings into the driver. - if(useDAQConfig) { - // Get the FADC configuration. - config = ConfigurationManager.getInstance().getFADCConfig(); - - // Load the settings. - NSB = config.getNSB(); - NSA = config.getNSA(); - windowSamples = config.getWindowWidth() / 4; - - // Get the number of peaks. - if(config.getMode() == 1) { - nPeak = Integer.MAX_VALUE; - } else { - nPeak = config.getMaxPulses(); - } - - // Print the FADC configuration. - System.out.println(); - System.out.println(); - System.out.printf("NSA :: %d ns%n", NSA); - System.out.printf("NSB :: %d ns%n", NSB); - System.out.printf("Window Samples :: %d clock-cycles%n", windowSamples); - System.out.printf("Max Peaks :: %d peaks%n", nPeak); - System.out.println("======================================================================"); - System.out.println("=== FADC Pulse-Processing Settings ==================================="); - System.out.println("======================================================================"); - config.printConfig(System.out); - } - } - }); + // Track changes in the DAQ configuration. + ConfigurationManager.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + // If the DAQ configuration should be used, load the + // relevant settings into the driver. + if(useDAQConfig) { + // Get the FADC configuration. + config = ConfigurationManager.getInstance().getFADCConfig(); + + // Load the settings. + NSB = config.getNSB(); + NSA = config.getNSA(); + windowSamples = config.getWindowWidth() / 4; + + // Get the number of peaks. + if(config.getMode() == 1) { + nPeak = Integer.MAX_VALUE; + } else { + nPeak = config.getMaxPulses(); + } + + // Print the FADC configuration. + System.out.println(); + System.out.println(); + System.out.printf("NSA :: %d ns%n", NSA); + System.out.printf("NSB :: %d ns%n", NSB); + System.out.printf("Window Samples :: %d clock-cycles%n", windowSamples); + System.out.printf("Max Peaks :: %d peaks%n", nPeak); + System.out.println("======================================================================"); + System.out.println("=== FADC Pulse-Processing Settings ==================================="); + System.out.println("======================================================================"); + config.printConfig(System.out); + } + } + }); } @@ -313,7 +313,7 @@ * for trigger emulation. */ public void setUseDAQConfig(boolean state) { - useDAQConfig = state; + useDAQConfig = state; } @@ -325,10 +325,10 @@ EcalChannelConstants channelData = findChannel(hit.getCellID()); double pedestal; if(useDAQConfig) { - //EcalChannel channel = ecalConditions.getChannelCollection().findGeometric(hit.getCellID()); - pedestal = config.getPedestal(hit.getCellID()); + //EcalChannel channel = ecalConditions.getChannelCollection().findGeometric(hit.getCellID()); + pedestal = config.getPedestal(hit.getCellID()); } else { - pedestal = channelData.getCalibration().getPedestal(); + pedestal = channelData.getCalibration().getPedestal(); } int sum = 0; @@ -356,10 +356,10 @@ * Choose whether to use static pedestal from database or running pedestal from mode-7. */ public double getSingleSamplePedestal(EventHeader event,long cellID) { - if(useDAQConfig) { - //EcalChannel channel = ecalConditions.getChannelCollection().findGeometric(cellID); - return config.getPedestal(cellID); - } + if(useDAQConfig) { + //EcalChannel channel = ecalConditions.getChannelCollection().findGeometric(cellID); + return config.getPedestal(cellID); + } if (useRunningPedestal && event!=null) { if (event.hasItem("EcalRunningPedestals")) { Map<EcalChannel, Double> runningPedMap = (Map<EcalChannel, Double>) event.get("EcalRunningPedestals"); @@ -536,12 +536,12 @@ // threshold is pedestal plus threshold configuration parameter: final int absoluteThreshold; if(useDAQConfig) { - //EcalChannel channel = ecalConditions.getChannelCollection().findGeometric(hit.getCellID()); - //int leadingEdgeThreshold = ConfigurationManager.getInstance().getFADCConfig().getThreshold(channel.getChannelId()); - int leadingEdgeThreshold = config.getThreshold(cellID); - absoluteThreshold = (int) (getSingleSamplePedestal(event, cellID) + leadingEdgeThreshold); + //EcalChannel channel = ecalConditions.getChannelCollection().findGeometric(hit.getCellID()); + //int leadingEdgeThreshold = ConfigurationManager.getInstance().getFADCConfig().getThreshold(channel.getChannelId()); + int leadingEdgeThreshold = config.getThreshold(cellID); + absoluteThreshold = (int) (getSingleSamplePedestal(event, cellID) + leadingEdgeThreshold); } else { - absoluteThreshold = (int) (getSingleSamplePedestal(event, cellID) + leadingEdgeThreshold); + absoluteThreshold = (int) (getSingleSamplePedestal(event, cellID) + leadingEdgeThreshold); } ArrayList <Integer> thresholdCrossings = new ArrayList<Integer>(); @@ -562,10 +562,10 @@ // search for next threshold crossing begins at end of this pulse: if(useDAQConfig && ConfigurationManager.getInstance().getFADCConfig().getMode() == 1) { // special case, emulating SSP: - ii += 8; + ii += 8; } else { // "normal" case, emulating FADC250: - ii += NSA/nsPerSample - 1; + ii += NSA/nsPerSample - 1; } // firmware limit on # of peaks: @@ -674,8 +674,8 @@ EcalChannelConstants channelData = findChannel(cellID); if(useDAQConfig) { - //float gain = ConfigurationManager.getInstance().getFADCConfig().getGain(ecalConditions.getChannelCollection().findGeometric(cellID)); - return config.getGain(cellID) * adcSum * EcalUtils.MeV; + //float gain = ConfigurationManager.getInstance().getFADCConfig().getGain(ecalConditions.getChannelCollection().findGeometric(cellID)); + return config.getGain(cellID) * adcSum * EcalUtils.MeV; } else if(use2014Gain) { if (constantGain) { return adcSum * EcalUtils.gainFactor * EcalUtils.ecalReadoutPeriod; Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalRawConverterDriver.java Wed Mar 9 11:43:24 2016 @@ -380,8 +380,8 @@ * conditions database. */ public void setUseDAQConfig(boolean state) { - useDAQConfig = state; - converter.setUseDAQConfig(state); + useDAQConfig = state; + converter.setUseDAQConfig(state); } @Override @@ -437,12 +437,12 @@ @Override public void process(EventHeader event) { - // Do not process the event if the DAQ configuration should be - // used for value, but is not initialized. - if(useDAQConfig && !ConfigurationManager.isInitialized()) { - return; - } - + // Do not process the event if the DAQ configuration should be + // used for value, but is not initialized. + if(useDAQConfig && !ConfigurationManager.isInitialized()) { + return; + } + final int SYSTEM_TRIGGER = 0; // final int SYSTEM_TRACKER = 1; final int SYSTEM_ECAL = 2; Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalTimeWalk.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalTimeWalk.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalTimeWalk.java Wed Mar 9 11:43:24 2016 @@ -39,11 +39,11 @@ * Time walk parameters for pulse fitting */ private static final double[] par = { - 0.9509, - -33.21, - 0.2614, - -0.9128, - 0.6251 + 0.9509, + -33.21, + 0.2614, + -0.9128, + 0.6251 }; /** @@ -53,9 +53,9 @@ * @return corrected time (ns) */ public static final double correctTimeWalkPulseFitting(double time, double energy) { - final double polyA = par[0] + par[1]*energy; - final double polyB = par[2] + par[3] * energy + par[4] * Math.pow(energy, 2); - return time - (Math.exp(polyA) + polyB); + final double polyA = par[0] + par[1]*energy; + final double polyB = par[2] + par[3] * energy + par[4] * Math.pow(energy, 2); + return time - (Math.exp(polyA) + polyB); } Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/IterateGainFactorDriver.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/IterateGainFactorDriver.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/IterateGainFactorDriver.java Wed Mar 9 11:43:24 2016 @@ -26,15 +26,15 @@ */ public class IterateGainFactorDriver extends Driver { - - private EcalConditions ecalConditions = null; - - /** + + private EcalConditions ecalConditions = null; + + /** * Set the input collection name (source). * * @param inputCollectionName the input collection name */ - private String inputCollectionName = "EcalCalHits"; + private String inputCollectionName = "EcalCalHits"; public void setInputCollectionName(final String inputCollectionName) { this.inputCollectionName = inputCollectionName; } @@ -116,14 +116,14 @@ * @return the output hit collection with gain corrected energies */ public List<CalorimeterHit> iterateHits(final List<CalorimeterHit> hits) { - ArrayList<CalorimeterHit> newHits = new ArrayList<CalorimeterHit>(); + ArrayList<CalorimeterHit> newHits = new ArrayList<CalorimeterHit>(); for (final CalorimeterHit hit : hits) { - double time = hit.getTime(); - long cellID = hit.getCellID(); - double energy = hit.getCorrectedEnergy()*gainFileGains.get(findChannelId(cellID)); - CalorimeterHit newHit = CalorimeterHitUtilities.create(energy, time, cellID); - newHits.add(newHit); - + double time = hit.getTime(); + long cellID = hit.getCellID(); + double energy = hit.getCorrectedEnergy()*gainFileGains.get(findChannelId(cellID)); + CalorimeterHit newHit = CalorimeterHitUtilities.create(energy, time, cellID); + newHits.add(newHit); + } return newHits; } @@ -134,26 +134,26 @@ */ @Override public void process(final EventHeader event) { - readGainFile(); - - // Check if output collection already exists in event which is an error. + readGainFile(); + + // Check if output collection already exists in event which is an error. if (event.hasItem(outputCollectionName)) { throw new RuntimeException("collection " + outputCollectionName + " already exists in event"); } // Get the input collection. if (event.hasCollection(CalorimeterHit.class,inputCollectionName)){ - final List<CalorimeterHit> inputHitCollection = event.get(CalorimeterHit.class, inputCollectionName); + final List<CalorimeterHit> inputHitCollection = event.get(CalorimeterHit.class, inputCollectionName); - // Iterate the gain correction coefficient on each hit. - final List<CalorimeterHit> outputHitCollection = this.iterateHits(inputHitCollection); - + // Iterate the gain correction coefficient on each hit. + final List<CalorimeterHit> outputHitCollection = this.iterateHits(inputHitCollection); + int flags = 0; flags += 1 << LCIOConstants.RCHBIT_TIME; //store hit time flags += 1 << LCIOConstants.RCHBIT_LONG; //store hit position; this flag has no effect for RawCalorimeterHits - - // Put the collection into the event. - event.put(outputCollectionName, outputHitCollection, CalorimeterHit.class, flags, ecalReadoutName); + + // Put the collection into the event. + event.put(outputCollectionName, outputHitCollection, CalorimeterHit.class, flags, ecalReadoutName); } } Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterEnergyCorrection.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterEnergyCorrection.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterEnergyCorrection.java Wed Mar 9 11:43:24 2016 @@ -19,9 +19,9 @@ * @author Jeremy McCormick <[log in to unmask]> */ public final class ClusterEnergyCorrection { - - // Variables for electron energy corrections. - static final double par0_em = -0.017; + + // Variables for electron energy corrections. + static final double par0_em = -0.017; static final double par1_em[] = {35,-0.06738,-0.0005613,16.42,0.3431,-2.021,74.85,-0.3626}; static final double par2_em[] = {35, 0.933, 0.003234, 18.06, 0.24, 8.586, 75.08, -0.39}; @@ -84,55 +84,55 @@ private static double computeCorrectedEnergy(HPSEcal3 ecal, int pdg, double rawEnergy, double xpos, double ypos) { //distance to beam gap edge - double r; - //Get these values from the Ecal geometry: - HPSEcalDetectorElement detElement = (HPSEcalDetectorElement) ecal.getDetectorElement(); + double r; + //Get these values from the Ecal geometry: + HPSEcalDetectorElement detElement = (HPSEcalDetectorElement) ecal.getDetectorElement(); // double BEAMGAPTOP = 22.3;//ecal.getNode().getChild("layout").getAttribute("beamgapTop").getDoubleValue();//mm double BEAMGAPTOP=20.0; - try { - BEAMGAPTOP = ecal.getNode().getChild("layout").getAttribute("beamgapTop").getDoubleValue(); - } catch (DataConversionException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - }//mm + try { + BEAMGAPTOP = ecal.getNode().getChild("layout").getAttribute("beamgapTop").getDoubleValue(); + } catch (DataConversionException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }//mm double BEAMGAPBOT=-20.0; - try { - BEAMGAPBOT = -ecal.getNode().getChild("layout").getAttribute("beamgapBottom").getDoubleValue(); - } catch (DataConversionException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - }//mm + try { + BEAMGAPBOT = -ecal.getNode().getChild("layout").getAttribute("beamgapBottom").getDoubleValue(); + } catch (DataConversionException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }//mm double BEAMGAPTOPC = BEAMGAPTOP + 13.0;//mm double BEAMGAPBOTC = BEAMGAPBOT - 13.0;//mm - // x-coordinates of crystals on either side of row 1 cut out + // x-coordinates of crystals on either side of row 1 cut out EcalCrystal crystalM = detElement.getCrystal(-11, 1); Hep3Vector posM = crystalM.getPositionFront(); EcalCrystal crystalP = detElement.getCrystal(-1, 1); Hep3Vector posP = crystalP.getPositionFront(); - if ((xpos<posM.x())||(xpos>posP.x())){ - if (ypos>0){ - r = Math.abs(ypos-BEAMGAPTOP);} - else{ - r = Math.abs(ypos-BEAMGAPBOT);} + if ((xpos<posM.x())||(xpos>posP.x())){ + if (ypos>0){ + r = Math.abs(ypos-BEAMGAPTOP);} + else{ + r = Math.abs(ypos-BEAMGAPBOT);} } - // crystals above row 1 cut out + // crystals above row 1 cut out else { - if (ypos>0){ - if (ypos>(par1_em[0]+BEAMGAPTOP)){ - r = Math.abs(ypos-BEAMGAPTOP);} - else{ - r = Math.abs(ypos-BEAMGAPTOPC);} - } - else { - if (ypos>(-par1_em[0]+BEAMGAPBOT)){ - r = Math.abs(ypos-BEAMGAPBOTC);} - else { - r = Math.abs(ypos-BEAMGAPBOT);} - } + if (ypos>0){ + if (ypos>(par1_em[0]+BEAMGAPTOP)){ + r = Math.abs(ypos-BEAMGAPTOP);} + else{ + r = Math.abs(ypos-BEAMGAPTOPC);} + } + else { + if (ypos>(-par1_em[0]+BEAMGAPBOT)){ + r = Math.abs(ypos-BEAMGAPBOTC);} + else { + r = Math.abs(ypos-BEAMGAPBOT);} + } } - - switch(pdg) { + + switch(pdg) { case 11: // electron return computeCorrectedEnergy(r, rawEnergy, par0_em, par1_em, par2_em); @@ -158,8 +158,8 @@ */ private static double computeCorrectedEnergy(double y, double rawEnergy, double varA, double varB[], double varC[]){ int ii = y<varB[0] ? 2 : 5; - double corrEnergy = rawEnergy / (varA / rawEnergy + (varB[1]-varB[ii]*Math.exp(-(y-varB[ii+1])*varB[ii+2])) / (Math.sqrt(rawEnergy)) + - (varC[1]-varC[ii]*Math.exp(-(y-varC[ii+1])*varC[ii+2]))); + double corrEnergy = rawEnergy / (varA / rawEnergy + (varB[1]-varB[ii]*Math.exp(-(y-varB[ii+1])*varB[ii+2])) / (Math.sqrt(rawEnergy)) + + (varC[1]-varC[ii]*Math.exp(-(y-varC[ii+1])*varC[ii+2]))); return corrEnergy; } } Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterPositionCorrection.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterPositionCorrection.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterPositionCorrection.java Wed Mar 9 11:43:24 2016 @@ -95,6 +95,6 @@ */ private static double positionCorrection(double xCl, double rawEnergy, double varA1, double varA2, double varB1, double varB2, double varB3) { //return ((xCl - (varB1 * rawEnergy + varB2 / Math.sqrt(rawEnergy) + varB3))/(varA1 / Math.sqrt(rawEnergy) + varA2 + 1)); - return ((xCl - (varB1 * rawEnergy + varB2 / Math.sqrt(rawEnergy) + varB3))/(varA1 / Math.sqrt(rawEnergy) + varA2 + 1)); + return ((xCl - (varB1 * rawEnergy + varB2 / Math.sqrt(rawEnergy) + varB3))/(varA1 / Math.sqrt(rawEnergy) + varA2 + 1)); } } Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterDriver.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterDriver.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterDriver.java Wed Mar 9 11:43:24 2016 @@ -22,8 +22,8 @@ * @see GTPClusterer */ public class GTPClusterDriver extends ClusterDriver { - /** An instance of the clustering algorithm object for producing - * cluster objects. */ + /** An instance of the clustering algorithm object for producing + * cluster objects. */ private final GTPClusterer gtp; /** @@ -112,11 +112,11 @@ */ @Override public void setWriteClusterCollection(boolean state) { - // Set the flag as appropriate with the superclass. - super.setWriteClusterCollection(state); - - // Also tell the clusterer whether it should persist its hit - // collection or not. - gtp.setWriteHitCollection(state); + // Set the flag as appropriate with the superclass. + super.setWriteClusterCollection(state); + + // Also tell the clusterer whether it should persist its hit + // collection or not. + gtp.setWriteHitCollection(state); } } Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterer.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterer.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPClusterer.java Wed Mar 9 11:43:24 2016 @@ -146,24 +146,24 @@ // stored in LCIO format properly, it needs to separately store // its clusters' hits in a collection. if(writeHitCollection) { - // Create a set to store the hits so that each one may be - // stored only once. - Set<CalorimeterHit> hitSet = new HashSet<CalorimeterHit>(); - - // Loop over all clusters and add their hits to the set. - for(Cluster cluster : clusterList) { - for(CalorimeterHit hit : cluster.getCalorimeterHits()) { - hitSet.add(hit); - } - } - - // Convert the set into a List object so that it can be stored - // in LCIO. - List<CalorimeterHit> clusterHits = new ArrayList<CalorimeterHit>(hitSet.size()); - clusterHits.addAll(hitSet); - - // Place the list of hits into the event stream. - event.put("GTPHits", hits, CalorimeterHit.class, 0); + // Create a set to store the hits so that each one may be + // stored only once. + Set<CalorimeterHit> hitSet = new HashSet<CalorimeterHit>(); + + // Loop over all clusters and add their hits to the set. + for(Cluster cluster : clusterList) { + for(CalorimeterHit hit : cluster.getCalorimeterHits()) { + hitSet.add(hit); + } + } + + // Convert the set into a List object so that it can be stored + // in LCIO. + List<CalorimeterHit> clusterHits = new ArrayList<CalorimeterHit>(hitSet.size()); + clusterHits.addAll(hitSet); + + // Place the list of hits into the event stream. + event.put("GTPHits", hits, CalorimeterHit.class, 0); } // Return the clusters. @@ -260,7 +260,7 @@ * should not. */ void setVerbose(boolean verbose) { - this.verbose = verbose; + this.verbose = verbose; } /** @@ -271,7 +271,7 @@ * persisted and <code>false</code> that they will not. */ void setWriteHitCollection(boolean state) { - writeHitCollection = state; + writeHitCollection = state; } /** @@ -291,7 +291,7 @@ // VERBOSE :: Print the cluster window. if(verbose) { - // Print the event header. + // Print the event header. System.out.printf("%n%nEvent:%n"); // Calculate some constants. @@ -304,9 +304,9 @@ CalorimeterHit hit = null; for(Entry<Long, CalorimeterHit> entry : bufferMap.entrySet()) { - hit = entry.getValue(); - System.out.printf("\t(%3d, %3d) --> %.4f (%.4f)%n", hit.getIdentifierFieldValue("ix"), - hit.getIdentifierFieldValue("iy"), hit.getCorrectedEnergy(), hit.getRawEnergy()); + hit = entry.getValue(); + System.out.printf("\t(%3d, %3d) --> %.4f (%.4f)%n", hit.getIdentifierFieldValue("ix"), + hit.getIdentifierFieldValue("iy"), hit.getCorrectedEnergy(), hit.getRawEnergy()); } bufferNum++; @@ -327,8 +327,8 @@ // VERBOSE :: Print the current cluster. if(verbose) { System.out.printf("Cluster Check:%n"); - System.out.printf("\t(%3d, %3d) --> %.4f%n", currentHit.getIdentifierFieldValue("ix"), - currentHit.getIdentifierFieldValue("iy"), currentHit.getCorrectedEnergy()); + System.out.printf("\t(%3d, %3d) --> %.4f%n", currentHit.getIdentifierFieldValue("ix"), + currentHit.getIdentifierFieldValue("iy"), currentHit.getCorrectedEnergy()); } // Store the energy of the current hit. @@ -337,11 +337,11 @@ // If the hit energy is lower than the minimum threshold, // then we immediately reject this hit as a possible cluster. if (currentEnergy < seedEnergyThreshold) { - // VERBOSE :: Note the reason the potential seed was - // rejected. - if(verbose) { System.out.printf("\tREJECT :: Does not exceed seed threshold %.4f.%n", seedEnergyThreshold); } - - // Skip to the next potential seed. + // VERBOSE :: Note the reason the potential seed was + // rejected. + if(verbose) { System.out.printf("\tREJECT :: Does not exceed seed threshold %.4f.%n", seedEnergyThreshold); } + + // Skip to the next potential seed. continue seedLoop; } @@ -368,16 +368,16 @@ // is larger than then original hit. If it is, we may // stop the comparison because this is not a cluster. if (bufferHitEnergy > currentEnergy) { - // VERBOSE :: Output the reason the potential - // seed was rejected along with the - // hit that caused it. - if(verbose) { - System.out.printf("\tREJECT :: Buffer hit surpasses hit energy."); - System.out.printf("\tBUFFER HIT :: (%3d, %3d) --> %.4f%n", bufferHit.getIdentifierFieldValue("ix"), - bufferHit.getIdentifierFieldValue("iy"), bufferHit.getCorrectedEnergy(), bufferHit.getRawEnergy()); - } - - // Skip to the next potential seed. + // VERBOSE :: Output the reason the potential + // seed was rejected along with the + // hit that caused it. + if(verbose) { + System.out.printf("\tREJECT :: Buffer hit surpasses hit energy."); + System.out.printf("\tBUFFER HIT :: (%3d, %3d) --> %.4f%n", bufferHit.getIdentifierFieldValue("ix"), + bufferHit.getIdentifierFieldValue("iy"), bufferHit.getCorrectedEnergy(), bufferHit.getRawEnergy()); + } + + // Skip to the next potential seed. continue seedLoop; } @@ -403,16 +403,16 @@ // If it is, we may stop the comparison because this // is not a cluster. if (neighborHitEnergy > currentEnergy) { - // VERBOSE :: Output the reason the potential - // seed was rejected along with the - // hit that caused it. - if(verbose) { - System.out.printf("\tREJECT :: Buffer hit surpasses hit energy.%n"); - System.out.printf("\tBUFFER HIT :: (%3d, %3d) --> %.4f%n", neighborHit.getIdentifierFieldValue("ix"), - neighborHit.getIdentifierFieldValue("iy"), neighborHit.getCorrectedEnergy(), neighborHit.getRawEnergy()); - } - - // Skip to the next potential seed. + // VERBOSE :: Output the reason the potential + // seed was rejected along with the + // hit that caused it. + if(verbose) { + System.out.printf("\tREJECT :: Buffer hit surpasses hit energy.%n"); + System.out.printf("\tBUFFER HIT :: (%3d, %3d) --> %.4f%n", neighborHit.getIdentifierFieldValue("ix"), + neighborHit.getIdentifierFieldValue("iy"), neighborHit.getCorrectedEnergy(), neighborHit.getRawEnergy()); + } + + // Skip to the next potential seed. continue seedLoop; } @@ -436,10 +436,10 @@ if(verbose) { System.out.printf("Cluster added.%n"); System.out.printf("\t(%3d, %3d) --> %.4f GeV --> %d hits%n", cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"), - cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy"), cluster.getEnergy(), cluster.getCalorimeterHits().size()); + cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy"), cluster.getEnergy(), cluster.getCalorimeterHits().size()); for(CalorimeterHit hit : cluster.getCalorimeterHits()) { - System.out.printf("\t\tCLUSTER HIT :: (%3d, %3d) --> %.4f%n", hit.getIdentifierFieldValue("ix"), - hit.getIdentifierFieldValue("iy"), hit.getCorrectedEnergy(), hit.getRawEnergy()); + System.out.printf("\t\tCLUSTER HIT :: (%3d, %3d) --> %.4f%n", hit.getIdentifierFieldValue("ix"), + hit.getIdentifierFieldValue("iy"), hit.getCorrectedEnergy(), hit.getRawEnergy()); } } } Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPOnlineClusterDriver.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPOnlineClusterDriver.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPOnlineClusterDriver.java Wed Mar 9 11:43:24 2016 @@ -39,8 +39,8 @@ * @see org.hps.record.daqconfig.DAQConfigDriver */ public class GTPOnlineClusterDriver extends ClusterDriver { - /** An instance of the clustering algorithm object for producing - * cluster objects. */ + /** An instance of the clustering algorithm object for producing + * cluster objects. */ private final GTPOnlineClusterer gtp; /** Indicates whether the <code>ConfigurationManager</code> object * should be used for clustering settings or not. */ @@ -53,29 +53,29 @@ * @see GTPOnlineClusterer */ public GTPOnlineClusterDriver() { - // Instantiate the clusterer. + // Instantiate the clusterer. clusterer = ClustererFactory.create("GTPOnlineClusterer"); gtp = (GTPOnlineClusterer) clusterer; // Track the DAQ configuration status. ConfigurationManager.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - // If DAQ configuration settings should be used, then - // update the clusterer. - if(useDAQConfig) { - // Get the GTP settings. - GTPConfig config = ConfigurationManager.getInstance().getGTPConfig(); - - // Send the DAQ configuration settings to the clusterer. - gtp.setSeedLowThreshold(config.getSeedEnergyCutConfig().getLowerBound()); - gtp.setWindowAfter(config.getTimeWindowAfter()); - gtp.setWindowBefore(config.getTimeWindowBefore()); - - // Print the updated settings. - logSettings(); - } - } + @Override + public void actionPerformed(ActionEvent e) { + // If DAQ configuration settings should be used, then + // update the clusterer. + if(useDAQConfig) { + // Get the GTP settings. + GTPConfig config = ConfigurationManager.getInstance().getGTPConfig(); + + // Send the DAQ configuration settings to the clusterer. + gtp.setSeedLowThreshold(config.getSeedEnergyCutConfig().getLowerBound()); + gtp.setWindowAfter(config.getTimeWindowAfter()); + gtp.setWindowBefore(config.getTimeWindowBefore()); + + // Print the updated settings. + logSettings(); + } + } }); } @@ -90,11 +90,11 @@ */ @Override public void process(EventHeader event) { - // Only process an event if either the DAQ configuration is not - // in use or if it has been initialized. - if((useDAQConfig && ConfigurationManager.isInitialized()) || !useDAQConfig) { - super.process(event); - } + // Only process an event if either the DAQ configuration is not + // in use or if it has been initialized. + if((useDAQConfig && ConfigurationManager.isInitialized()) || !useDAQConfig) { + super.process(event); + } } /** @@ -103,8 +103,8 @@ */ @Override public void startOfData() { - // VERBOSE :: Output the driver settings. - if(gtp.isVerbose()) { logSettings(); } + // VERBOSE :: Output the driver settings. + if(gtp.isVerbose()) { logSettings(); } } /** @@ -168,23 +168,23 @@ * @see org.hps.record.daqconfig.DAQConfigDriver */ public void setUseDAQConfig(boolean state) { - useDAQConfig = state; + useDAQConfig = state; } /** * Outputs the current GTP settings to the terminal. */ private void logSettings() { - // Print the cluster driver header. - System.out.println(); - System.out.println(); - System.out.println("======================================================================"); - System.out.println("=== GTP Readout Clusterer Settings ==================================="); - System.out.println("======================================================================"); - - // Output the driver settings. - System.out.printf("Seed Energy Threshold :: %.3f GeV%n", gtp.getSeedLowThreshold()); - System.out.printf("Time Window (Before) :: %.0f ns%n", gtp.getWindowBefore()); - System.out.printf("Time Window (After) :: %.0f ns%n", gtp.getWindowAfter()); + // Print the cluster driver header. + System.out.println(); + System.out.println(); + System.out.println("======================================================================"); + System.out.println("=== GTP Readout Clusterer Settings ==================================="); + System.out.println("======================================================================"); + + // Output the driver settings. + System.out.printf("Seed Energy Threshold :: %.3f GeV%n", gtp.getSeedLowThreshold()); + System.out.printf("Time Window (Before) :: %.0f ns%n", gtp.getWindowBefore()); + System.out.printf("Time Window (After) :: %.0f ns%n", gtp.getWindowAfter()); } } Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPOnlineClusterer.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPOnlineClusterer.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/GTPOnlineClusterer.java Wed Mar 9 11:43:24 2016 @@ -69,10 +69,10 @@ * @see GTPClusterer */ public class GTPOnlineClusterer extends AbstractClusterer { - /** - * The length of the temporal window for inclusing clusters that - * occur before the seed hit. - */ + /** + * The length of the temporal window for inclusing clusters that + * occur before the seed hit. + */ private double timeBefore = 4; /** @@ -128,29 +128,29 @@ */ @Override public List<Cluster> createClusters(EventHeader event, List<CalorimeterHit> hitList) { - // VERBOSE :: Print the driver header. - if(verbose) { - System.out.println(); - System.out.println(); - System.out.println("======================================================================"); - System.out.println("=== GTP Readout Clusterer ============================================"); - System.out.println("======================================================================"); - - // Sort the hits by x-index and then by y-index. - Collections.sort(hitList, new Comparator<CalorimeterHit>() { - @Override - public int compare(CalorimeterHit firstHit, CalorimeterHit secondHit) { - int[] ix = { firstHit.getIdentifierFieldValue("ix"), secondHit.getIdentifierFieldValue("ix") }; - if(ix[0] != ix[1]) { return Integer.compare(ix[0], ix[1]); } - else { - int iy[] = { firstHit.getIdentifierFieldValue("iy"), secondHit.getIdentifierFieldValue("iy") }; - return Integer.compare(iy[0], iy[1]); - } - } - }); - - // Print the hit collection. - System.out.println("Event Hit Collection:"); + // VERBOSE :: Print the driver header. + if(verbose) { + System.out.println(); + System.out.println(); + System.out.println("======================================================================"); + System.out.println("=== GTP Readout Clusterer ============================================"); + System.out.println("======================================================================"); + + // Sort the hits by x-index and then by y-index. + Collections.sort(hitList, new Comparator<CalorimeterHit>() { + @Override + public int compare(CalorimeterHit firstHit, CalorimeterHit secondHit) { + int[] ix = { firstHit.getIdentifierFieldValue("ix"), secondHit.getIdentifierFieldValue("ix") }; + if(ix[0] != ix[1]) { return Integer.compare(ix[0], ix[1]); } + else { + int iy[] = { firstHit.getIdentifierFieldValue("iy"), secondHit.getIdentifierFieldValue("iy") }; + return Integer.compare(iy[0], iy[1]); + } + } + }); + + // Print the hit collection. + System.out.println("Event Hit Collection:"); for(CalorimeterHit hit : hitList) { int ix = hit.getIdentifierFieldValue("ix"); int iy = hit.getIdentifierFieldValue("iy"); @@ -161,7 +161,7 @@ } System.out.println(); } - + // Track the valid clusters. List<Cluster> clusterList = new ArrayList<Cluster>(); @@ -183,10 +183,10 @@ // Iterate over each hit and see if it qualifies as a seed hit. seedLoop: for(CalorimeterHit seed : hitList) { - // Put the hit energy into the hit energy distribution. - hitEnergy.fill(seed.getCorrectedEnergy()); - hitDistribution.fill(seed.getIdentifierFieldValue("ix"), seed.getIdentifierFieldValue("iy")); - + // Put the hit energy into the hit energy distribution. + hitEnergy.fill(seed.getCorrectedEnergy()); + hitDistribution.fill(seed.getIdentifierFieldValue("ix"), seed.getIdentifierFieldValue("iy")); + // Check whether the potential seed passes the seed // energy cut. if(seed.getCorrectedEnergy() < seedThreshold) { @@ -204,16 +204,16 @@ // energies. hitLoop: for(CalorimeterHit hit : hitList) { - // Negative energy hits are never valid. Skip them. - if(hit.getCorrectedEnergy() < 0) { - continue hitLoop; - } - - // Do not compare the potential seed hit to itself. - if(hit == seed) { - continue hitLoop; - } - + // Negative energy hits are never valid. Skip them. + if(hit.getCorrectedEnergy() < 0) { + continue hitLoop; + } + + // Do not compare the potential seed hit to itself. + if(hit == seed) { + continue hitLoop; + } + // Check if the hit is within the spatiotemporal // clustering window. if(withinTimeVerificationWindow(seed, hit) && withinSpatialWindow(seed, hit)) { @@ -246,25 +246,25 @@ clusterTotalEnergy.fill(protoCluster.getEnergy()); clusterHitCount.fill(protoCluster.getCalorimeterHits().size()); clusterDistribution.fill(protoCluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"), - protoCluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy")); + protoCluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy")); // Determine how much energy in the cluster is negative // and how is positive. double nenergy = 0.0; double penergy = 0.0; for(CalorimeterHit hit : protoCluster.getCalorimeterHits()) { - if(hit.getCorrectedEnergy() > 0) { penergy += hit.getCorrectedEnergy(); } - else { nenergy += hit.getCorrectedEnergy(); } + if(hit.getCorrectedEnergy() > 0) { penergy += hit.getCorrectedEnergy(); } + else { nenergy += hit.getCorrectedEnergy(); } } energyDistribution.fill(Math.abs(nenergy) / (penergy + Math.abs(nenergy))); } // VERBOSE :: Print out all the clusters in the event. if(verbose) { - // Print the clusters. - System.out.println("Event Cluster Collection:"); + // Print the clusters. + System.out.println("Event Cluster Collection:"); for(Cluster cluster : clusterList) { - // Output basic cluster positional and energy data. + // Output basic cluster positional and energy data. CalorimeterHit seedHit = cluster.getCalorimeterHits().get(0); int ix = seedHit.getIdentifierFieldValue("ix"); int iy = seedHit.getIdentifierFieldValue("iy"); @@ -281,7 +281,7 @@ System.out.printf("\t\tCompHit --> %.3f GeV at (%3d, %3d) and at t = %.2f%n", henergy, hix, hiy, htime); } } - System.out.println(); + System.out.println(); } // VERBOSE :: Print a new line. @@ -366,11 +366,11 @@ * the seed hit in clock cycles. */ void setWindowBefore(int cyclesBefore) { - // The cluster window can not be negative. - if(cyclesBefore < 0) { cyclesBefore = 0; } - - // Convert the window to nanoseconds and set the two time - // windows appropriately. + // The cluster window can not be negative. + if(cyclesBefore < 0) { cyclesBefore = 0; } + + // Convert the window to nanoseconds and set the two time + // windows appropriately. timeBefore = cyclesBefore * 4; timeWindow = Math.max(timeBefore, timeAfter); } @@ -384,11 +384,11 @@ * the seed hit in clock cycles. */ void setWindowAfter(int cyclesAfter) { - // The cluster window can not be negative. - if(cyclesAfter < 0) { cyclesAfter = 0; } - - // Convert the window to nanoseconds and set the two time - // windows appropriately. + // The cluster window can not be negative. + if(cyclesAfter < 0) { cyclesAfter = 0; } + + // Convert the window to nanoseconds and set the two time + // windows appropriately. timeAfter = cyclesAfter * 4; timeWindow = Math.max(timeBefore, timeAfter); } @@ -494,9 +494,9 @@ // considered to be adjacent to ix = -1 rather than the // expected ix = 0. (ix = 0 does not exist.) else { - // ix = -1 is adjacent to ix = 1 and vice versa. + // ix = -1 is adjacent to ix = 1 and vice versa. if((six == -1 && hix == 1) || (six == 1 && hix == -1)) { - return true; + return true; } // Any other combination that reaches this point is not Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ReconClusterer.java ============================================================================= --- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ReconClusterer.java (original) +++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ReconClusterer.java Wed Mar 9 11:43:24 2016 @@ -289,7 +289,7 @@ // If the neighboring crystal exists and is not already // in a cluster, add it to the list of neighboring hits. if (secondaryNeighborHit != null && !hitToSeed.containsKey(secondaryNeighborHit) - && hitList.contains(secondaryNeighborHit)) { + && hitList.contains(secondaryNeighborHit)) { secondaryNeighborHits.add(secondaryNeighborHit); } } @@ -325,7 +325,7 @@ // If it exists, add it to the neighboring hit list. if (clusteredNeighborHit != null && hitToSeed.get(clusteredNeighborHit) != null - && hitList.contains(clusteredNeighborHit)) { + && hitList.contains(clusteredNeighborHit)) { clusteredNeighborHits.add(clusteredNeighborHit); } } @@ -383,32 +383,32 @@ // Consider time cut-is this hit in same time window as seed? if (useTimeCut){ - if(Math.abs(ihit.getTime() - iseed.getTime()) < timeWindow) - { - icluster.addHit(ihit); - } + if(Math.abs(ihit.getTime() - iseed.getTime()) < timeWindow) + { + icluster.addHit(ihit); + } } // end of using time cut else {icluster.addHit(ihit);} } // Add common hits for (Map.Entry<CalorimeterHit, List<CalorimeterHit>> commHit : commonHits.entrySet()) { - // Check that the common hit is in both time windows to their clusters - CalorimeterHit seedA = commHit.getValue().get(0); + // Check that the common hit is in both time windows to their clusters + CalorimeterHit seedA = commHit.getValue().get(0); CalorimeterHit seedB = commHit.getValue().get(1); - + boolean inTimeWithA = false; boolean inTimeWithB = false; - // In time window with seedA? + // In time window with seedA? if (Math.abs(commHit.getKey().getTime() - seedA.getTime()) < timeWindow){ - inTimeWithA = true; + inTimeWithA = true; } // In time window with seedB? if (Math.abs(commHit.getKey().getTime() - seedB.getTime()) < timeWindow){ - inTimeWithB = true; - } - + inTimeWithB = true; + } + double eclusterA = seedToCluster.get(seedA).getEnergy(); double eclusterB = seedToCluster.get(seedB).getEnergy(); double fractionA = eclusterA / (eclusterA + eclusterB); @@ -420,25 +420,25 @@ BaseCluster clusterB = seedToCluster.get(seedB); if (useTimeCut){ - // Do this if the hit is in both cluster's windows - if (inTimeWithA && inTimeWithB){ - clusterA.addHit(commHit.getKey(), hitcontributionA); - clusterB.addHit(commHit.getKey(), hitcontributionB); - } + // Do this if the hit is in both cluster's windows + if (inTimeWithA && inTimeWithB){ + clusterA.addHit(commHit.getKey(), hitcontributionA); + clusterB.addHit(commHit.getKey(), hitcontributionB); + } - //If the hit is only in 1 cluster's window, add the full contribution - else if(inTimeWithA ^ inTimeWithB){ - if(inTimeWithA){ - clusterA.addHit(commHit.getKey()); - } - else{ - clusterB.addHit(commHit.getKey()); - } - } + //If the hit is only in 1 cluster's window, add the full contribution + else if(inTimeWithA ^ inTimeWithB){ + if(inTimeWithA){ + clusterA.addHit(commHit.getKey()); + } + else{ + clusterB.addHit(commHit.getKey()); + } + } } // end of using time cut else{ - clusterA.addHit(commHit.getKey(), hitcontributionA); - clusterB.addHit(commHit.getKey(), hitcontributionB); + clusterA.addHit(commHit.getKey(), hitcontributionA); + clusterB.addHit(commHit.getKey(), hitcontributionB); } } Modified: java/trunk/evio/src/main/java/org/hps/evio/DummyEventBuilder.java ============================================================================= --- java/trunk/evio/src/main/java/org/hps/evio/DummyEventBuilder.java (original) +++ java/trunk/evio/src/main/java/org/hps/evio/DummyEventBuilder.java Wed Mar 9 11:43:24 2016 @@ -41,7 +41,7 @@ public void readEvioEvent(EvioEvent evioEvent) { } - @Override - public void conditionsChanged(ConditionsEvent conditionsEvent) { - } + @Override + public void conditionsChanged(ConditionsEvent conditionsEvent) { + } } Modified: java/trunk/evio/src/main/java/org/hps/evio/EcalHitWriter.java ============================================================================= --- java/trunk/evio/src/main/java/org/hps/evio/EcalHitWriter.java (original) +++ java/trunk/evio/src/main/java/org/hps/evio/EcalHitWriter.java Wed Mar 9 11:43:24 2016 @@ -212,10 +212,10 @@ Map<Integer, List<Long>> slotMap = new HashMap<Integer, List<Long>>(); for (Long id : hitMap.keySet()) { dec.setID(id); -// System.out.println(dec.getIDDescription()); -// System.out.printf("ix = %d, iy = %d\n", dec.getValue("ix"), dec.getValue("iy")); +// System.out.println(dec.getIDDescription()); +// System.out.printf("ix = %d, iy = %d\n", dec.getValue("ix"), dec.getValue("iy")); // Long daqID = EcalConditions.physicalToDaqID(id); -// System.out.printf("physicalID %d, daqID %d\n", id, daqID); +// System.out.printf("physicalID %d, daqID %d\n", id, daqID); int slot = getSlot(id); if (slotMap.get(slot) == null) { slotMap.put(slot, new ArrayList<Long>()); @@ -231,7 +231,7 @@ for (int slot : slotMap.keySet()) { data.addUchar((byte) slot); // slot # data.addUint(0); // trigger # - data.addUlong(0); // timestamp + data.addUlong(0); // timestamp List<Long> hitIDs = slotMap.get(slot); int nhits = hitIDs.size(); data.addN(nhits); // number of channels @@ -285,10 +285,10 @@ Map<Integer, List<Long>> slotMap = new HashMap<Integer, List<Long>>(); for (Long id : hitMap.keySet()) { dec.setID(id); -// System.out.println(dec.getIDDescription()); -// System.out.printf("ix = %d, iy = %d\n", dec.getValue("ix"), dec.getValue("iy")); +// System.out.println(dec.getIDDescription()); +// System.out.printf("ix = %d, iy = %d\n", dec.getValue("ix"), dec.getValue("iy")); // Long daqID = EcalConditions.physicalToDaqID(id); -// System.out.printf("physicalID %d, daqID %d\n", id, daqID); +// System.out.printf("physicalID %d, daqID %d\n", id, daqID); int slot = getSlot(id); if (slotMap.get(slot) == null) { slotMap.put(slot, new ArrayList<Long>()); @@ -304,7 +304,7 @@ for (int slot : slotMap.keySet()) { data.addUchar((byte) slot); // slot # data.addUint(0); // trigger # - data.addUlong(0); // timestamp + data.addUlong(0); // timestamp List<Long> hitIDs = slotMap.get(slot); int nhits = hitIDs.size(); data.addN(nhits); // number of channels @@ -358,10 +358,10 @@ Map<Integer, List<Long>> slotMap = new HashMap<Integer, List<Long>>(); for (Long id : hitMap.keySet()) { dec.setID(id); -// System.out.println(dec.getIDDescription()); -// System.out.printf("ix = %d, iy = %d\n", dec.getValue("ix"), dec.getValue("iy")); +// System.out.println(dec.getIDDescription()); +// System.out.printf("ix = %d, iy = %d\n", dec.getValue("ix"), dec.getValue("iy")); // Long daqID = EcalConditions.physicalToDaqID(id); -// System.out.printf("physicalID %d, daqID %d\n", id, daqID); +// System.out.printf("physicalID %d, daqID %d\n", id, daqID); int slot = getSlot(id); if (slotMap.get(slot) == null) { slotMap.put(slot, new ArrayList<Long>()); @@ -380,7 +380,7 @@ // EvioBank slotBank = new EvioBank(EventConstants.ECAL_WINDOW_BANK_TAG, DataType.COMPOSITE, slot); data.addUchar((byte) slot); // slot # data.addUint(0); // trigger # - data.addUlong(0); // timestamp + data.addUlong(0); // timestamp List<Long> hitIDs = slotMap.get(slot); int nhits = hitIDs.size(); data.addN(nhits); // number of channels Modified: java/trunk/evio/src/main/java/org/hps/evio/EvioReader.java ============================================================================= --- java/trunk/evio/src/main/java/org/hps/evio/EvioReader.java (original) +++ java/trunk/evio/src/main/java/org/hps/evio/EvioReader.java Wed Mar 9 11:43:24 2016 @@ -5,45 +5,45 @@ import org.lcsim.event.EventHeader; /** - * Abstract class containing shared methods used by EVIO readers. + * Abstract class containing shared methods used by EVIO readers. * - * @author Sho Uemura <[log in to unmask]> + * @author Sho Uemura <[log in to unmask]> */ public abstract class EvioReader { - // Debug flag - protected boolean debug = false; - - // Name of the hit collection that will be created - protected String hitCollectionName = null; + // Debug flag + protected boolean debug = false; + + // Name of the hit collection that will be created + protected String hitCollectionName = null; - /** - * Make a LCIO hit collection (e.g. {@link RawTrackerHit}, - * {@link CalorimeterHit} from raw EVIO data. - * - * @param event : The EVIO event to read the raw data from - * @param lcsimEvent : The LCSim event to write the collections to - * @return True if the appropriate EVIO bank is found, false otherwise - * @throws Exception - * - */ - abstract boolean makeHits(EvioEvent event, EventHeader lcsimEvent) throws Exception; + /** + * Make a LCIO hit collection (e.g. {@link RawTrackerHit}, + * {@link CalorimeterHit} from raw EVIO data. + * + * @param event : The EVIO event to read the raw data from + * @param lcsimEvent : The LCSim event to write the collections to + * @return True if the appropriate EVIO bank is found, false otherwise + * @throws Exception + * + */ + abstract boolean makeHits(EvioEvent event, EventHeader lcsimEvent) throws Exception; - /** - * Set the hit collection name. - * - * @param hitCollectionName : Name of the hit collection - */ - public void setHitCollectionName(String hitCollectionName) { - this.hitCollectionName = hitCollectionName; - } + /** + * Set the hit collection name. + * + * @param hitCollectionName : Name of the hit collection + */ + public void setHitCollectionName(String hitCollectionName) { + this.hitCollectionName = hitCollectionName; + } - /** - * Enable/disable debug output. - * - * @param debug : Set to true to enable, false to disable. - */ - public void setDebug(boolean debug) { - this.debug = debug; - } + /** + * Enable/disable debug output. + * + * @param debug : Set to true to enable, false to disable. + */ + public void setDebug(boolean debug) { + this.debug = debug; + } } Modified: java/trunk/evio/src/main/java/org/hps/evio/RfFitFunction.java ============================================================================= --- java/trunk/evio/src/main/java/org/hps/evio/RfFitFunction.java (original) +++ java/trunk/evio/src/main/java/org/hps/evio/RfFitFunction.java Wed Mar 9 11:43:24 2016 @@ -7,29 +7,29 @@ * Straight line fit */ public class RfFitFunction extends AbstractIFunction { - protected double intercept=0; - protected double slope=0; - public RfFitFunction() { - this(""); - } - public RfFitFunction(String title) { - super(); - this.variableNames=new String[]{"time"}; - this.parameterNames=new String[]{"intercept","slope"}; + protected double intercept=0; + protected double slope=0; + public RfFitFunction() { + this(""); + } + public RfFitFunction(String title) { + super(); + this.variableNames=new String[]{"time"}; + this.parameterNames=new String[]{"intercept","slope"}; - init(title); - } - public double value(double [] v) { - return intercept + (v[0])*slope; - } - public void setParameters(double[] pars) throws IllegalArgumentException { - super.setParameters(pars); - intercept=pars[0]; - slope=pars[1]; - } - public void setParameter(String key,double value) throws IllegalArgumentException{ - super.setParameter(key,value); - if (key.equals("intercept")) intercept=value; - else if (key.equals("slope")) slope=value; - } + init(title); + } + public double value(double [] v) { + return intercept + (v[0])*slope; + } + public void setParameters(double[] pars) throws IllegalArgumentException { + super.setParameters(pars); + intercept=pars[0]; + slope=pars[1]; + } + public void setParameter(String key,double value) throws IllegalArgumentException{ + super.setParameter(key,value); + if (key.equals("intercept")) intercept=value; + else if (key.equals("slope")) slope=value; + } } Modified: java/trunk/evio/src/main/java/org/hps/evio/RfHit.java ============================================================================= --- java/trunk/evio/src/main/java/org/hps/evio/RfHit.java (original) +++ java/trunk/evio/src/main/java/org/hps/evio/RfHit.java Wed Mar 9 11:43:24 2016 @@ -6,13 +6,13 @@ * class to store RF times after extracting from waveform. */ public class RfHit implements GenericObject { - private double[] times; - public RfHit(double[] times) { this.times=times; } - public int getNInt() { return 0; } - public int getNFloat() { return 0; } - public int getNDouble() { return times.length; } - public double getDoubleVal(int ii) { return times[ii]; } - public float getFloatVal (int ii) { return 0; } - public int getIntVal (int ii) { return 0; } - public boolean isFixedSize() { return false; } + private double[] times; + public RfHit(double[] times) { this.times=times; } + public int getNInt() { return 0; } + public int getNFloat() { return 0; } + public int getNDouble() { return times.length; } + public double getDoubleVal(int ii) { return times[ii]; } + public float getFloatVal (int ii) { return 0; } + public int getIntVal (int ii) { return 0; } + public boolean isFixedSize() { return false; } } Modified: java/trunk/evio/src/main/java/org/hps/evio/TestRunReconToEvio.java ============================================================================= --- java/trunk/evio/src/main/java/org/hps/evio/TestRunReconToEvio.java (original) +++ java/trunk/evio/src/main/java/org/hps/evio/TestRunReconToEvio.java Wed Mar 9 11:43:24 2016 @@ -21,96 +21,96 @@ */ public class TestRunReconToEvio extends Driver { - EventWriter writer; - String rawCalorimeterHitCollectionName = "EcalDigitizedHits"; - String evioOutputFile = "TestRunData.evio"; - EventBuilder builder = null; - private int eventsWritten = 0; - EcalHitWriter ecalWriter = null; - SVTHitWriter svtWriter = null; - - Detector detector = null; + EventWriter writer; + String rawCalorimeterHitCollectionName = "EcalDigitizedHits"; + String evioOutputFile = "TestRunData.evio"; + EventBuilder builder = null; + private int eventsWritten = 0; + EcalHitWriter ecalWriter = null; + SVTHitWriter svtWriter = null; + + Detector detector = null; - public TestRunReconToEvio() { - } - + public TestRunReconToEvio() { + } + @Override - public void detectorChanged(Detector detector) { - // set the detector + public void detectorChanged(Detector detector) { + // set the detector this.detector = detector; } - public void setEvioOutputFile(String evioOutputFile) { - this.evioOutputFile = evioOutputFile; - } + public void setEvioOutputFile(String evioOutputFile) { + this.evioOutputFile = evioOutputFile; + } - public void setRawCalorimeterHitCollectionName(String rawCalorimeterHitCollectionName) { - this.rawCalorimeterHitCollectionName = rawCalorimeterHitCollectionName; - if (ecalWriter != null) { - ecalWriter.setHitCollectionName(rawCalorimeterHitCollectionName); - } - } + public void setRawCalorimeterHitCollectionName(String rawCalorimeterHitCollectionName) { + this.rawCalorimeterHitCollectionName = rawCalorimeterHitCollectionName; + if (ecalWriter != null) { + ecalWriter.setHitCollectionName(rawCalorimeterHitCollectionName); + } + } - protected void startOfData() { - try { - writer = new EventWriter(evioOutputFile); - } catch (EvioException e) { - throw new RuntimeException(e); - } + protected void startOfData() { + try { + writer = new EventWriter(evioOutputFile); + } catch (EvioException e) { + throw new RuntimeException(e); + } - ecalWriter = new EcalHitWriter(); - ecalWriter.setDetector(detector); - ecalWriter.setHitCollectionName(rawCalorimeterHitCollectionName); + ecalWriter = new EcalHitWriter(); + ecalWriter.setDetector(detector); + ecalWriter.setHitCollectionName(rawCalorimeterHitCollectionName); - svtWriter = new SVTHitWriter(); - } + svtWriter = new SVTHitWriter(); + } - protected void endOfData() { - System.out.println(this.getClass().getSimpleName() + " - wrote " + eventsWritten + " EVIO events in job."); - writer.close(); - } + protected void endOfData() { + System.out.println(this.getClass().getSimpleName() + " - wrote " + eventsWritten + " EVIO events in job."); + writer.close(); + } - protected void process(EventHeader event) { + protected void process(EventHeader event) { - if (!svtWriter.hasData(event)) { - return; - } + if (!svtWriter.hasData(event)) { + return; + } - // Make a new EVIO event. - builder = new EventBuilder(0, DataType.BANK, event.getEventNumber()); + // Make a new EVIO event. + builder = new EventBuilder(0, DataType.BANK, event.getEventNumber()); - // Write SVTData. - svtWriter.writeData(event, builder); + // Write SVTData. + svtWriter.writeData(event, builder); - // Write RawCalorimeterHit collection. - ecalWriter.writeData(event, builder); -// writeRawCalorimeterHits(event); + // Write RawCalorimeterHit collection. + ecalWriter.writeData(event, builder); +// writeRawCalorimeterHits(event); - // Write this EVIO event. - writeEvioEvent(); - } + // Write this EVIO event. + writeEvioEvent(); + } - private void writeEvioEvent() { - EvioBank eventIDBank = new EvioBank(EvioEventConstants.EVENTID_BANK_TAG, DataType.UINT32, 0); - int[] eventID = new int[3]; - eventID[0] = eventsWritten; - eventID[1] = 0; //trigger type - eventID[2] = 0; //status + private void writeEvioEvent() { + EvioBank eventIDBank = new EvioBank(EvioEventConstants.EVENTID_BANK_TAG, DataType.UINT32, 0); + int[] eventID = new int[3]; + eventID[0] = eventsWritten; + eventID[1] = 0; //trigger type + eventID[2] = 0; //status - try { - eventIDBank.appendIntData(eventID); - builder.addChild(builder.getEvent(), eventIDBank); - } catch (EvioException e) { - throw new RuntimeException(e); - } - builder.setAllHeaderLengths(); - try { - writer.writeEvent(builder.getEvent()); - ++eventsWritten; - } catch (EvioException e) { - throw new RuntimeException(e); - } catch (IOException e) { - throw new RuntimeException(e); - } - } + try { + eventIDBank.appendIntData(eventID); + builder.addChild(builder.getEvent(), eventIDBank); + } catch (EvioException e) { + throw new RuntimeException(e); + } + builder.setAllHeaderLengths(); + try { + writer.writeEvent(builder.getEvent()); + ++eventsWritten; + } catch (EvioException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } } Modified: java/trunk/evio/src/test/java/org/hps/evio/LCSimEngRunEventBuilderTest.java ============================================================================= --- java/trunk/evio/src/test/java/org/hps/evio/LCSimEngRunEventBuilderTest.java (original) +++ java/trunk/evio/src/test/java/org/hps/evio/LCSimEngRunEventBuilderTest.java Wed Mar 9 11:43:24 2016 @@ -24,60 +24,60 @@ */ public class LCSimEngRunEventBuilderTest extends TestCase { - public void testLCSimEngRunEventBuilder() throws Exception { - - // Setup database conditions. - DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance(); - conditionsManager.setXmlConfig("/org/hps/conditions/config/conditions_dev.xml"); - conditionsManager.setDetector("HPS-Proposal2014-v8-6pt6", 2000); + public void testLCSimEngRunEventBuilder() throws Exception { + + // Setup database conditions. + DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance(); + conditionsManager.setXmlConfig("/org/hps/conditions/config/conditions_dev.xml"); + conditionsManager.setDetector("HPS-Proposal2014-v8-6pt6", 2000); - // Configure LCIO writer. - new TestOutputFile(getClass().getSimpleName()).mkdirs(); - File lcioFile = new TestOutputFile(getClass().getSimpleName() + File.separator + getClass().getSimpleName() + "_output.slcio"); - LCIOWriter writer; - try { - writer = new LCIOWriter(lcioFile); - } catch (IOException e) { - throw new RuntimeException(e); - } + // Configure LCIO writer. + new TestOutputFile(getClass().getSimpleName()).mkdirs(); + File lcioFile = new TestOutputFile(getClass().getSimpleName() + File.separator + getClass().getSimpleName() + "_output.slcio"); + LCIOWriter writer; + try { + writer = new LCIOWriter(lcioFile); + } catch (IOException e) { + throw new RuntimeException(e); + } - // Create event builder. - LCSimEventBuilder builder = new LCSimEngRunEventBuilder(); - conditionsManager.addConditionsListener(builder); - //builder.setDetectorName("HPS-Proposal2014-v8-6pt6"); - conditionsManager.setDetector("HPS-Proposal2014-v8-6pt6", 2744); + // Create event builder. + LCSimEventBuilder builder = new LCSimEngRunEventBuilder(); + conditionsManager.addConditionsListener(builder); + //builder.setDetectorName("HPS-Proposal2014-v8-6pt6"); + conditionsManager.setDetector("HPS-Proposal2014-v8-6pt6", 2744); - // Get remote test file. - FileCache cache = new FileCache(); - File evioFile = cache.getCachedFile(new URL("http://www.lcsim.org/test/hps-java/LCSimEngRunEventBuilderTest/hps_002744.evio.0")); + // Get remote test file. + FileCache cache = new FileCache(); + File evioFile = cache.getCachedFile(new URL("http://www.lcsim.org/test/hps-java/LCSimEngRunEventBuilderTest/hps_002744.evio.0")); - // Open the EVIO reader. - System.out.println("Opening file " + evioFile); - EvioReader reader = null; - try { - reader = new EvioReader(evioFile); - } catch (Exception e) { - throw new RuntimeException(e); - } + // Open the EVIO reader. + System.out.println("Opening file " + evioFile); + EvioReader reader = null; + try { + reader = new EvioReader(evioFile); + } catch (Exception e) { + throw new RuntimeException(e); + } - // Run the event builder on the EVIO. - EvioEvent evioEvent = null; - while ((evioEvent = reader.nextEvent()) != null) { - reader.parseEvent(evioEvent); - builder.readEvioEvent(evioEvent); - if (EvioEventUtilities.isPhysicsEvent(evioEvent)) { - try { - EventHeader lcsimEvent = builder.makeLCSimEvent(evioEvent); - System.out.println("created LCSim event #" + lcsimEvent.getEventNumber()); - writer.write(lcsimEvent); - } catch (Exception e) { - e.printStackTrace(); - } - } - } + // Run the event builder on the EVIO. + EvioEvent evioEvent = null; + while ((evioEvent = reader.nextEvent()) != null) { + reader.parseEvent(evioEvent); + builder.readEvioEvent(evioEvent); + if (EvioEventUtilities.isPhysicsEvent(evioEvent)) { + try { + EventHeader lcsimEvent = builder.makeLCSimEvent(evioEvent); + System.out.println("created LCSim event #" + lcsimEvent.getEventNumber()); + writer.write(lcsimEvent); + } catch (Exception e) { + e.printStackTrace(); + } + } + } - // Close the LCIO writer. - writer.flush(); - writer.close(); - } + // Close the LCIO writer. + writer.flush(); + writer.close(); + } } Modified: java/trunk/evio/src/test/java/org/hps/evio/LCSimTestRunEventBuilderTest.java ============================================================================= --- java/trunk/evio/src/test/java/org/hps/evio/LCSimTestRunEventBuilderTest.java (original) +++ java/trunk/evio/src/test/java/org/hps/evio/LCSimTestRunEventBuilderTest.java Wed Mar 9 11:43:24 2016 @@ -15,60 +15,60 @@ import org.hps.record.evio.EvioEventUtilities; /** - * Integration test to check the conversion of test run EVIO to LCIO + * Integration test to check the conversion of test run EVIO to LCIO * - * @author Omar Moreno <[log in to unmask]> - * @date November 20, 2014 + * @author Omar Moreno <[log in to unmask]> + * @date November 20, 2014 */ public class LCSimTestRunEventBuilderTest extends TestCase { - //-----------------// - //--- Constants ---// - //-----------------// - private static final String DB_CONFIGURATION - = "/org/hps/conditions/config/conditions_database_testrun_2012.xml"; - - public void testLCSimTestRunEventBuilder() throws Exception { - - // Configure the conditions system to retrieve test run conditions fo run 1351. - DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance(); - conditionsManager.setXmlConfig(DB_CONFIGURATION); - - // Create the test run event builder - LCSimTestRunEventBuilder builder = new LCSimTestRunEventBuilder(); - conditionsManager.addConditionsListener(builder); + //-----------------// + //--- Constants ---// + //-----------------// + private static final String DB_CONFIGURATION + = "/org/hps/conditions/config/conditions_database_testrun_2012.xml"; + + public void testLCSimTestRunEventBuilder() throws Exception { + + // Configure the conditions system to retrieve test run conditions fo run 1351. + DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance(); + conditionsManager.setXmlConfig(DB_CONFIGURATION); + + // Create the test run event builder + LCSimTestRunEventBuilder builder = new LCSimTestRunEventBuilder(); + conditionsManager.addConditionsListener(builder); - conditionsManager.setDetector("HPS-TestRun-v5", 1351); + conditionsManager.setDetector("HPS-TestRun-v5", 1351); - // Retrieve the remote test file. The file currently being contains a - // subset of events from run 1351 - FileCache cache = new FileCache(); - File evioFile = cache.getCachedFile(new URL("http://www.lcsim.org/test/hps-java/hps1351_test.evio")); - - // Instantiate the EVIO reader and open the test file. If the file - // can't be found, throw a runtime exception - EvioReader reader = null; - try { - reader = new EvioReader(evioFile); - } catch (Exception e) { - throw new RuntimeException( - "[ " + this.getClass().getSimpleName() + " ]: EVIO file couldn't be opened."); - } - - // Loop through all EVIO events in the file and process them using the - // event builder. If the event is a physics event, process the event - // using the subdetector readers. - EvioEvent evioEvent = null; - while ((evioEvent = reader.nextEvent()) != null) { - reader.parseEvent(evioEvent); - builder.readEvioEvent(evioEvent); - if (EvioEventUtilities.isPhysicsEvent(evioEvent)) { - EventHeader lcsimEvent = builder.makeLCSimEvent(evioEvent); - System.out.println("[ " + this.getClass().getSimpleName() + " ]: Created event number " + lcsimEvent.getEventNumber()); - } - } - - // Close the EVIO reader - reader.close(); - } + // Retrieve the remote test file. The file currently being contains a + // subset of events from run 1351 + FileCache cache = new FileCache(); + File evioFile = cache.getCachedFile(new URL("http://www.lcsim.org/test/hps-java/hps1351_test.evio")); + + // Instantiate the EVIO reader and open the test file. If the file + // can't be found, throw a runtime exception + EvioReader reader = null; + try { + reader = new EvioReader(evioFile); + } catch (Exception e) { + throw new RuntimeException( + "[ " + this.getClass().getSimpleName() + " ]: EVIO file couldn't be opened."); + } + + // Loop through all EVIO events in the file and process them using the + // event builder. If the event is a physics event, process the event + // using the subdetector readers. + EvioEvent evioEvent = null; + while ((evioEvent = reader.nextEvent()) != null) { + reader.parseEvent(evioEvent); + builder.readEvioEvent(evioEvent); + if (EvioEventUtilities.isPhysicsEvent(evioEvent)) { + EventHeader lcsimEvent = builder.makeLCSimEvent(evioEvent); + System.out.println("[ " + this.getClass().getSimpleName() + " ]: Created event number " + lcsimEvent.getEventNumber()); + } + } + + // Close the EVIO reader + reader.close(); + } } Modified: java/trunk/evio/src/test/java/org/hps/evio/SvtEvioReaderTest.java ============================================================================= --- java/trunk/evio/src/test/java/org/hps/evio/SvtEvioReaderTest.java (original) +++ java/trunk/evio/src/test/java/org/hps/evio/SvtEvioReaderTest.java Wed Mar 9 11:43:24 2016 @@ -25,47 +25,47 @@ // Initialize the logger protected static Logger LOGGER = Logger.getLogger(SvtEvioReaderTest.class.getPackage().getName()); - public void testSvtEvioReaderTest() throws Exception { + public void testSvtEvioReaderTest() throws Exception { - // Get the EVIO file that will be used to test the reader - FileCache fileCache = new FileCache(); - File evioFile = fileCache.getCachedFile( - new URL("http://www.lcsim.org/test/hps-java/svt_evio_reader_test.evio")); + // Get the EVIO file that will be used to test the reader + FileCache fileCache = new FileCache(); + File evioFile = fileCache.getCachedFile( + new URL("http://www.lcsim.org/test/hps-java/svt_evio_reader_test.evio")); - LOGGER.info("Opening file " + evioFile); + LOGGER.info("Opening file " + evioFile); - // Instantiate the EVIO reader and open the file - EvioReader evioReader = new EvioReader(evioFile); - - // Instantiate the SVT EVIO reader - SvtEvioReader svtReader = new SvtEvioReader(); + // Instantiate the EVIO reader and open the file + EvioReader evioReader = new EvioReader(evioFile); + + // Instantiate the SVT EVIO reader + SvtEvioReader svtReader = new SvtEvioReader(); - // Setup the database conditions - DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance(); - conditionsManager.setDetector("HPS-Proposal2014-v9-2pt2", 2000); + // Setup the database conditions + DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance(); + conditionsManager.setDetector("HPS-Proposal2014-v9-2pt2", 2000); - // Instantiate the event builder - LCSimEventBuilder eventBuilder = new LCSimEngRunEventBuilder(); + // Instantiate the event builder + LCSimEventBuilder eventBuilder = new LCSimEngRunEventBuilder(); - // Check that the file contains the expected number of events - int eventCount = evioReader.getEventCount(); - LOGGER.info("File " + evioFile + " contains " + eventCount + " events."); + // Check that the file contains the expected number of events + int eventCount = evioReader.getEventCount(); + LOGGER.info("File " + evioFile + " contains " + eventCount + " events."); - // Loop through the EVIO events and process them. - EvioEvent evioEvent = null; - while ((evioEvent = evioReader.nextEvent()) != null) { - evioReader.parseEvent(evioEvent); + // Loop through the EVIO events and process them. + EvioEvent evioEvent = null; + while ((evioEvent = evioReader.nextEvent()) != null) { + evioReader.parseEvent(evioEvent); - // Only process physics events - if (!EvioEventUtilities.isPhysicsEvent(evioEvent)) continue; - LOGGER.info("Found physics event."); - - EventHeader lcsimEvent = eventBuilder.makeLCSimEvent(evioEvent); - LOGGER.info("Created LCSim event # " + lcsimEvent.getEventNumber()); + // Only process physics events + if (!EvioEventUtilities.isPhysicsEvent(evioEvent)) continue; + LOGGER.info("Found physics event."); + + EventHeader lcsimEvent = eventBuilder.makeLCSimEvent(evioEvent); + LOGGER.info("Created LCSim event # " + lcsimEvent.getEventNumber()); - // Process the event using the SVT evio reader - svtReader.processEvent(evioEvent, lcsimEvent); - } - } + // Process the event using the SVT evio reader + svtReader.processEvent(evioEvent, lcsimEvent); + } + } } Modified: java/trunk/integration-tests/src/test/java/org/hps/test/it/SimpleSvtReadoutTest.java ============================================================================= --- java/trunk/integration-tests/src/test/java/org/hps/test/it/SimpleSvtReadoutTest.java (original) +++ java/trunk/integration-tests/src/test/java/org/hps/test/it/SimpleSvtReadoutTest.java Wed Mar 9 11:43:24 2016 @@ -26,14 +26,14 @@ // Collection Names static final String rawTrackerHitCollectionName = "SVTRawTrackerHits"; - public void testSimpleSvtReadout() throws Exception { - - File inputFile = new TestDataUtility().getTestData("ReadoutToLcioTest.slcio"); - + public void testSimpleSvtReadout() throws Exception { + + File inputFile = new TestDataUtility().getTestData("ReadoutToLcioTest.slcio"); + outputDir.mkdirs(); if(!outputDir.exists()){ - this.printDebug("Failed to create directory " + outputDir.getPath()); - throw new RuntimeException("Failed to create output directory."); + this.printDebug("Failed to create directory " + outputDir.getPath()); + throw new RuntimeException("Failed to create output directory."); } FinalCheckDriver checker = new FinalCheckDriver(); @@ -54,25 +54,25 @@ this.printDebug(""); this.printDebug("==============================="); - } - - class FinalCheckDriver extends Driver { - - private int totalRawTrackerHits = 0; - - public void process(EventHeader event){ - if(!event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) return; - List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName); - - totalRawTrackerHits += rawHits.size(); - } - - public int getTotalNumberOfRawTrackerHits(){ - return totalRawTrackerHits; - } - } - - private void printDebug(String message){ - System.out.println("[ SimpleSvtReadoutTest ]: " + message); - } + } + + class FinalCheckDriver extends Driver { + + private int totalRawTrackerHits = 0; + + public void process(EventHeader event){ + if(!event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) return; + List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName); + + totalRawTrackerHits += rawHits.size(); + } + + public int getTotalNumberOfRawTrackerHits(){ + return totalRawTrackerHits; + } + } + + private void printDebug(String message){ + System.out.println("[ SimpleSvtReadoutTest ]: " + message); + } } Modified: java/trunk/integration-tests/src/test/resources/org/hps/ecalreadoutsim/EcalReadoutSimTest.lcsim ============================================================================= --- java/trunk/integration-tests/src/test/resources/org/hps/ecalreadoutsim/EcalReadoutSimTest.lcsim (original) +++ java/trunk/integration-tests/src/test/resources/org/hps/ecalreadoutsim/EcalReadoutSimTest.lcsim Wed Mar 9 11:43:24 2016 @@ -32,7 +32,7 @@ <driver name="TestRunReconToLcio" type="org.hps.evio.TestRunTriggeredReconToLcio"> <outputFile>${outputFile}.slcio</outputFile> </driver> - + <driver name="EcalReadout" type="org.hps.readout.ecal.FADCEcalReadoutDriver"> <coincidenceWindow>1</coincidenceWindow> <ecalName>Ecal</ecalName> @@ -50,7 +50,7 @@ <applyBadCrystalMap>false</applyBadCrystalMap> <use2014Gain>true</use2014Gain> <!-- <debug>true</debug>--> - </driver> + </driver> <driver name="EcalClusterer" type="org.hps.recon.ecal.GTPEcalClusterer"> <ecalName>Ecal</ecalName> @@ -63,7 +63,7 @@ <deadTime>10</deadTime> <pairCoincidence>2</pairCoincidence> <outputFileName>${outputFile}.triggers</outputFileName> - </driver> + </driver> <driver name="SimpleSVTReadout" type="org.hps.readout.svt.SimpleSvtReadout"> <addNoise>false</addNoise> </driver> @@ -74,4 +74,4 @@ </driver> </drivers> </lcsim> - + Modified: java/trunk/integration-tests/src/test/resources/org/hps/steering/test/Dummy.lcsim ============================================================================= --- java/trunk/integration-tests/src/test/resources/org/hps/steering/test/Dummy.lcsim (original) +++ java/trunk/integration-tests/src/test/resources/org/hps/steering/test/Dummy.lcsim Wed Mar 9 11:43:24 2016 @@ -10,4 +10,4 @@ <driver name="DummyDriver" type="org.hps.test.util.DummyDriver"/> </drivers> </lcsim> - + Modified: java/trunk/integration-tests/src/test/resources/org/hps/steering/test/EcalReadoutSimTest.lcsim ============================================================================= --- java/trunk/integration-tests/src/test/resources/org/hps/steering/test/EcalReadoutSimTest.lcsim (original) +++ java/trunk/integration-tests/src/test/resources/org/hps/steering/test/EcalReadoutSimTest.lcsim Wed Mar 9 11:43:24 2016 @@ -28,7 +28,7 @@ <driver name="TestRunReconToLcio" type="org.hps.evio.TestRunTriggeredReconToLcio"> <outputFile>${outputFile}.slcio</outputFile> </driver> - + <driver name="EcalReadout" type="org.hps.readout.ecal.FADCEcalReadoutDriver"> <coincidenceWindow>1</coincidenceWindow> <ecalName>Ecal</ecalName> @@ -46,7 +46,7 @@ <applyBadCrystalMap>false</applyBadCrystalMap> <use2014Gain>true</use2014Gain> <!-- <debug>true</debug>--> - </driver> + </driver> <driver name="EcalClusterer" type="org.hps.recon.ecal.GTPEcalClusterer"> <ecalName>Ecal</ecalName> @@ -59,7 +59,7 @@ <deadTime>10</deadTime> <pairCoincidence>2</pairCoincidence> <outputFileName>${outputFile}.triggers</outputFileName> - </driver> + </driver> <driver name="SimpleSVTReadout" type="org.hps.readout.svt.SimpleSvtReadout"> <addNoise>false</addNoise> </driver> @@ -70,4 +70,4 @@ </driver> </drivers> </lcsim> - + Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTCellIDPrintDriver.java ============================================================================= --- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTCellIDPrintDriver.java (original) +++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTCellIDPrintDriver.java Wed Mar 9 11:43:24 2016 @@ -17,52 +17,52 @@ */ public class SVTCellIDPrintDriver extends Driver { - String rawTrackerHitCollectionName = "SVTData"; - String outputFileName; - PrintWriter outputStream = null; + String rawTrackerHitCollectionName = "SVTData"; + String outputFileName; + PrintWriter outputStream = null; - public SVTCellIDPrintDriver() { - } + public SVTCellIDPrintDriver() { + } - public void setRawTrackerHitCollectionName(String rawTrackerHitCollectionName) { - this.rawTrackerHitCollectionName = rawTrackerHitCollectionName; - } + public void setRawTrackerHitCollectionName(String rawTrackerHitCollectionName) { + this.rawTrackerHitCollectionName = rawTrackerHitCollectionName; + } - public void setOutputFileName(String outputFileName) { - this.outputFileName = outputFileName; - } + public void setOutputFileName(String outputFileName) { + this.outputFileName = outputFileName; + } - public void startOfData() { - if (rawTrackerHitCollectionName == null) { - throw new RuntimeException("The parameter ecalCollectionName was not set!"); - } + public void startOfData() { + if (rawTrackerHitCollectionName == null) { + throw new RuntimeException("The parameter ecalCollectionName was not set!"); + } - if (outputFileName != null) { - try { - outputStream = new PrintWriter(outputFileName); - } catch (IOException ex) { - throw new RuntimeException("Invalid outputFilePath!"); - } - } else { - outputStream = new PrintWriter(System.out, true); - } - } + if (outputFileName != null) { + try { + outputStream = new PrintWriter(outputFileName); + } catch (IOException ex) { + throw new RuntimeException("Invalid outputFilePath!"); + } + } else { + outputStream = new PrintWriter(System.out, true); + } + } - public void process(EventHeader event) { - // Get the list of ECal hits. - if (event.hasCollection(SVTData.class, rawTrackerHitCollectionName)) { - List<SVTData> hits = event.get(SVTData.class, rawTrackerHitCollectionName); - //outputStream.println("Reading RawCalorimeterHit from event " + event.getEventNumber()); - for (SVTData hit : hits) { - outputStream.printf("FPGA=%d\thybrid=%d\tchannel=%d\n", hit.getFPGAAddress(), hit.getHybridNumber(), hit.getChannelNumber()); - } - } - if (event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) { - List<RawTrackerHit> hits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName); - //outputStream.println("Reading RawCalorimeterHit from event " + event.getEventNumber()); - for (RawTrackerHit hit : hits) { - outputStream.printf("name=%s\tside=%d\tstrip=%d\n", hit.getDetectorElement().getName(), hit.getIdentifierFieldValue("side"), hit.getIdentifierFieldValue("strip")); - } - } - } + public void process(EventHeader event) { + // Get the list of ECal hits. + if (event.hasCollection(SVTData.class, rawTrackerHitCollectionName)) { + List<SVTData> hits = event.get(SVTData.class, rawTrackerHitCollectionName); + //outputStream.println("Reading RawCalorimeterHit from event " + event.getEventNumber()); + for (SVTData hit : hits) { + outputStream.printf("FPGA=%d\thybrid=%d\tchannel=%d\n", hit.getFPGAAddress(), hit.getHybridNumber(), hit.getChannelNumber()); + } + } + if (event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) { + List<RawTrackerHit> hits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName); + //outputStream.println("Reading RawCalorimeterHit from event " + event.getEventNumber()); + for (RawTrackerHit hit : hits) { + outputStream.printf("name=%s\tside=%d\tstrip=%d\n", hit.getDetectorElement().getName(), hit.getIdentifierFieldValue("side"), hit.getIdentifierFieldValue("strip")); + } + } + } } Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTHitRecoCorrelations.java ============================================================================= --- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTHitRecoCorrelations.java (original) +++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTHitRecoCorrelations.java Wed Mar 9 11:43:24 2016 @@ -32,7 +32,7 @@ */ public class SVTHitRecoCorrelations extends Driver { - //private List<AIDAFrame> plotterFrame = new ArrayList<AIDAFrame>(); + //private List<AIDAFrame> plotterFrame = new ArrayList<AIDAFrame>(); private List<IPlotter> plotters = new ArrayList<IPlotter>(); private AIDA aida = AIDA.defaultInstance(); private String rawTrackerHitCollectionName = "SVTRawTrackerHits"; @@ -225,7 +225,7 @@ */ //for(int i=0;i<2;++i) { - //plotterFrame.get(i).pack(); + //plotterFrame.get(i).pack(); // plotterFrame.get(i).setVisible(true); //} } Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTHitReconstructionPlots.java ============================================================================= --- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTHitReconstructionPlots.java (original) +++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SVTHitReconstructionPlots.java Wed Mar 9 11:43:24 2016 @@ -38,7 +38,7 @@ */ public class SVTHitReconstructionPlots extends Driver { - //private AIDAFrame plotterFrame; + //private AIDAFrame plotterFrame; private AIDA aida = AIDA.defaultInstance(); private String fittedTrackerHitCollectionName = "SVTFittedRawTrackerHits"; private String trackerHitCollectionName = "StripClusterer_SiTrackerHitStrip1D"; Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtTimingInPlots.java ============================================================================= --- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtTimingInPlots.java (original) +++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtTimingInPlots.java Wed Mar 9 11:43:24 2016 @@ -244,51 +244,51 @@ isEcalTopCluster = false; List<SSPCluster> clusters = null; SSPData sspData = null; - /*if(event.hasCollection(GenericObject.class, triggerBankCollectionName)) { - - // Get the list of trigger banks from the event - List<GenericObject> triggerBanks = event.get(GenericObject.class, triggerBankCollectionName); - - System.out.println("Total trigger banks: " + triggerBanks.size()); - - // Loop through the collection of banks and get the SSP and TI banks. - for (GenericObject triggerBank : triggerBanks) { - - // If the bank contains TI data, process it - if (AbstractIntData.getTag(triggerBank) == TIData.BANK_TAG) { - - TIData tiData = new TIData(triggerBank); - - // Check if the trigger is singles - if (tiData.isSingle0Trigger() || tiData.isSingle1Trigger()) { - isSingleClusterTrigger = true; - } - - } else if (AbstractIntData.getTag(triggerBank) == SSPData.BANK_TAG) { - - sspData = new SSPData(triggerBank); - - clusters = sspData.getClusters(); - - for (SSPCluster cluster : clusters) { - if (cluster.getYIndex() > 0) { - isEcalTopCluster = true; - } - } - } - } - - if (isSingleClusterTrigger) { - System.out.println("Total number of singles triggers: " + sspData.getSinglesTriggers().size()); - for (SSPSinglesTrigger trigger : sspData.getSinglesTriggers()) { - System.out.println("Trigger: " + trigger.toString()); - } - System.out.println("Total number of SSP clusters: " + clusters.size()); - for (SSPCluster cluster : clusters) { - System.out.println("X: " + cluster.getXIndex() + " Y: " + cluster.getYIndex() + " time: " + cluster.getTime()); - } - } - }*/ + /*if(event.hasCollection(GenericObject.class, triggerBankCollectionName)) { + + // Get the list of trigger banks from the event + List<GenericObject> triggerBanks = event.get(GenericObject.class, triggerBankCollectionName); + + System.out.println("Total trigger banks: " + triggerBanks.size()); + + // Loop through the collection of banks and get the SSP and TI banks. + for (GenericObject triggerBank : triggerBanks) { + + // If the bank contains TI data, process it + if (AbstractIntData.getTag(triggerBank) == TIData.BANK_TAG) { + + TIData tiData = new TIData(triggerBank); + + // Check if the trigger is singles + if (tiData.isSingle0Trigger() || tiData.isSingle1Trigger()) { + isSingleClusterTrigger = true; + } + + } else if (AbstractIntData.getTag(triggerBank) == SSPData.BANK_TAG) { + + sspData = new SSPData(triggerBank); + + clusters = sspData.getClusters(); + + for (SSPCluster cluster : clusters) { + if (cluster.getYIndex() > 0) { + isEcalTopCluster = true; + } + } + } + } + + if (isSingleClusterTrigger) { + System.out.println("Total number of singles triggers: " + sspData.getSinglesTriggers().size()); + for (SSPSinglesTrigger trigger : sspData.getSinglesTriggers()) { + System.out.println("Trigger: " + trigger.toString()); + } + System.out.println("Total number of SSP clusters: " + clusters.size()); + for (SSPCluster cluster : clusters) { + System.out.println("X: " + cluster.getXIndex() + " Y: " + cluster.getYIndex() + " time: " + cluster.getTime()); + } + } + }*/ // Obtain all relations between an SVT raw hit and its corresponding // fit parameters. The fit parameters are obtained from the fit to Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/BasicMonitoringPlotsDriver.java ============================================================================= --- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/BasicMonitoringPlotsDriver.java (original) +++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/BasicMonitoringPlotsDriver.java Wed Mar 9 11:43:24 2016 @@ -18,83 +18,83 @@ * @author Jeremy McCormick <[log in to unmask]> */ public class BasicMonitoringPlotsDriver extends Driver { - - private String calHitsCollectionName = "EcalCalHits"; - private String rawHitsCollectionName = "EcalReadoutHits"; - private String clustersCollectionName = "EcalClusters"; - - private IHistogram1D calHitEnergyH1D; - private IHistogram1D clusterEnergyH1D; - private IHistogram1D rawHitAmplitudeH1D; - private IHistogram2D calHitEnergyMapH2D; - - public BasicMonitoringPlotsDriver() { - } - - public void startOfData() { - - IAnalysisFactory.create().createHistogramFactory(null); - IPlotterFactory plotFactory = IAnalysisFactory.create().createPlotterFactory("ECAL Monitoring"); - IHistogramFactory histogramFactory = IAnalysisFactory.create().createHistogramFactory(null); - - calHitEnergyH1D = histogramFactory.createHistogram1D(calHitsCollectionName + ": Energy", calHitsCollectionName + ": Energy", 200, 0.0, 2.0); - calHitEnergyH1D.annotation().addItem("xAxisLabel", "GeV"); - calHitEnergyH1D.annotation().addItem("yAxisLabel", "Count"); - IPlotter plotter = plotFactory.create("CalorimeterHits"); - plotter.createRegion(); - plotter.style().gridStyle().setVisible(false); - plotter.style().dataStyle().errorBarStyle().setVisible(false); - plotter.region(0).plot(calHitEnergyH1D); - plotter.show(); - - rawHitAmplitudeH1D = histogramFactory.createHistogram1D(rawHitsCollectionName + ": Amplitude", rawHitsCollectionName + ": Amplitude", 150, 0.0, 15000.0); - rawHitAmplitudeH1D.annotation().addItem("xAxisLabel", "ADC Value"); - rawHitAmplitudeH1D.annotation().addItem("yAxisLabel", "Count"); - plotter = plotFactory.create("RawCalorimeterHits"); - plotter.createRegion(); - plotter.style().gridStyle().setVisible(false); - plotter.style().dataStyle().errorBarStyle().setVisible(false); - plotter.region(0).plot(rawHitAmplitudeH1D); - plotter.show(); - - clusterEnergyH1D = histogramFactory.createHistogram1D(clustersCollectionName + ": Energy", clustersCollectionName + ": Energy", 100, 0.0, 3.0); - clusterEnergyH1D.annotation().addItem("xAxisLabel", "GeV"); - clusterEnergyH1D.annotation().addItem("yAxisLabel", "Count"); - plotter = plotFactory.create("Clusters"); - plotter.createRegion(); - plotter.style().gridStyle().setVisible(false); - plotter.style().dataStyle().errorBarStyle().setVisible(false); - plotter.region(0).plot(clusterEnergyH1D); - plotter.show(); - - calHitEnergyMapH2D = histogramFactory.createHistogram2D(calHitsCollectionName + ": Energy Map", calHitsCollectionName + ": Energy Map", 47, -23.5, 23.5, 11, -5.5, 5.5); - plotter = plotFactory.create("CalorimeterHit Energy Map"); - plotter.createRegion(); - plotter.style().setParameter("hist2DStyle", "colorMap"); - plotter.style().gridStyle().setVisible(false); - plotter.region(0).plot(calHitEnergyMapH2D); - plotter.show(); - } - - public void process(EventHeader event) { - + + private String calHitsCollectionName = "EcalCalHits"; + private String rawHitsCollectionName = "EcalReadoutHits"; + private String clustersCollectionName = "EcalClusters"; + + private IHistogram1D calHitEnergyH1D; + private IHistogram1D clusterEnergyH1D; + private IHistogram1D rawHitAmplitudeH1D; + private IHistogram2D calHitEnergyMapH2D; + + public BasicMonitoringPlotsDriver() { + } + + public void startOfData() { + + IAnalysisFactory.create().createHistogramFactory(null); + IPlotterFactory plotFactory = IAnalysisFactory.create().createPlotterFactory("ECAL Monitoring"); + IHistogramFactory histogramFactory = IAnalysisFactory.create().createHistogramFactory(null); + + calHitEnergyH1D = histogramFactory.createHistogram1D(calHitsCollectionName + ": Energy", calHitsCollectionName + ": Energy", 200, 0.0, 2.0); + calHitEnergyH1D.annotation().addItem("xAxisLabel", "GeV"); + calHitEnergyH1D.annotation().addItem("yAxisLabel", "Count"); + IPlotter plotter = plotFactory.create("CalorimeterHits"); + plotter.createRegion(); + plotter.style().gridStyle().setVisible(false); + plotter.style().dataStyle().errorBarStyle().setVisible(false); + plotter.region(0).plot(calHitEnergyH1D); + plotter.show(); + + rawHitAmplitudeH1D = histogramFactory.createHistogram1D(rawHitsCollectionName + ": Amplitude", rawHitsCollectionName + ": Amplitude", 150, 0.0, 15000.0); + rawHitAmplitudeH1D.annotation().addItem("xAxisLabel", "ADC Value"); + rawHitAmplitudeH1D.annotation().addItem("yAxisLabel", "Count"); + plotter = plotFactory.create("RawCalorimeterHits"); + plotter.createRegion(); + plotter.style().gridStyle().setVisible(false); + plotter.style().dataStyle().errorBarStyle().setVisible(false); + plotter.region(0).plot(rawHitAmplitudeH1D); + plotter.show(); + + clusterEnergyH1D = histogramFactory.createHistogram1D(clustersCollectionName + ": Energy", clustersCollectionName + ": Energy", 100, 0.0, 3.0); + clusterEnergyH1D.annotation().addItem("xAxisLabel", "GeV"); + clusterEnergyH1D.annotation().addItem("yAxisLabel", "Count"); + plotter = plotFactory.create("Clusters"); + plotter.createRegion(); + plotter.style().gridStyle().setVisible(false); + plotter.style().dataStyle().errorBarStyle().setVisible(false); + plotter.region(0).plot(clusterEnergyH1D); + plotter.show(); + + calHitEnergyMapH2D = histogramFactory.createHistogram2D(calHitsCollectionName + ": Energy Map", calHitsCollectionName + ": Energy Map", 47, -23.5, 23.5, 11, -5.5, 5.5); + plotter = plotFactory.create("CalorimeterHit Energy Map"); + plotter.createRegion(); + plotter.style().setParameter("hist2DStyle", "colorMap"); + plotter.style().gridStyle().setVisible(false); + plotter.region(0).plot(calHitEnergyMapH2D); + plotter.show(); + } + + public void process(EventHeader event) { + if (event.hasCollection(CalorimeterHit.class, calHitsCollectionName)) { for (CalorimeterHit hit : event.get(CalorimeterHit.class, calHitsCollectionName)) { calHitEnergyH1D.fill(hit.getCorrectedEnergy()); calHitEnergyMapH2D.fill(hit.getIdentifierFieldValue("ix"), hit.getIdentifierFieldValue("iy"), hit.getCorrectedEnergy()); } } - + if (event.hasCollection(Cluster.class, clustersCollectionName)) { for (Cluster cluster : event.get(Cluster.class, clustersCollectionName)) { clusterEnergyH1D.fill(cluster.getEnergy()); } } - - if (event.hasCollection(RawCalorimeterHit.class, rawHitsCollectionName)) { - for (RawCalorimeterHit hit : event.get(RawCalorimeterHit.class, rawHitsCollectionName)) { - rawHitAmplitudeH1D.fill(hit.getAmplitude()); - } - } - } + + if (event.hasCollection(RawCalorimeterHit.class, rawHitsCollectionName)) { + for (RawCalorimeterHit hit : event.get(RawCalorimeterHit.class, rawHitsCollectionName)) { + rawHitAmplitudeH1D.fill(hit.getAmplitude()); + } + } + } } Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalClusterPlots.java ============================================================================= --- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalClusterPlots.java (original) +++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalClusterPlots.java Wed Mar 9 11:43:24 2016 @@ -49,15 +49,15 @@ * @author Kyle McCarty <[log in to unmask]> */ public class EcalClusterPlots extends Driver { - // Internal variables. + // Internal variables. private boolean hide = false; private boolean logScale = false; - private AIDA aida = AIDA.defaultInstance(); + private AIDA aida = AIDA.defaultInstance(); private double maxE = 5000 * EcalUtils.MeV; - private IPlotter[] plotter = new IPlotter[4]; - private String clusterCollectionName = "EcalClusters"; - - // Monitoring plot variables. + private IPlotter[] plotter = new IPlotter[4]; + private String clusterCollectionName = "EcalClusters"; + + // Monitoring plot variables. private IHistogram1D clusterCountPlot; private IHistogram1D clusterSizePlot; private IHistogram1D clusterEnergyPlot; @@ -79,7 +79,7 @@ private static final int TAB_CLUSTER_TIME = 2; private static final int TAB_CLUSTER_PAIR = 3; private static final String[] TAB_NAMES = { "Cluster Count Plots", "Cluster Energy Plots", - "Cluster Time Plots", "Cluster Pair Plots" }; + "Cluster Time Plots", "Cluster Pair Plots" }; /** * Resets all of the plots for the new detector. @@ -110,10 +110,10 @@ // Apply formatting that is constant across all tabs. for(int tabIndex = 0; tabIndex < plotter.length; tabIndex++) { - plotter[tabIndex] = plotterFactory.create(TAB_NAMES[tabIndex]); - plotter[tabIndex].setTitle(TAB_NAMES[tabIndex]); - plotter[tabIndex].style().dataStyle().errorBarStyle().setVisible(false); - plotter[tabIndex].style().dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString()); + plotter[tabIndex] = plotterFactory.create(TAB_NAMES[tabIndex]); + plotter[tabIndex].setTitle(TAB_NAMES[tabIndex]); + plotter[tabIndex].style().dataStyle().errorBarStyle().setVisible(false); + plotter[tabIndex].style().dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString()); if(logScale) { plotter[tabIndex].style().yAxisStyle().setParameter("scale", "log"); } } @@ -145,9 +145,9 @@ // If they should not be hidden, display the tabs. if(!hide) { - for(IPlotter tab : plotter) { - tab.show(); - } + for(IPlotter tab : plotter) { + tab.show(); + } } } @@ -157,121 +157,121 @@ */ @Override public void process(EventHeader event) { - // Check whether the event has clusters or not. - if(event.hasCollection(Cluster.class, clusterCollectionName)) { - // Get the list of clusters. - List<Cluster> clusterList = event.get(Cluster.class, clusterCollectionName); - - // Create lists to store the clusters from the top of the - // calorimeter and the bottom. - List<Cluster> topList = new ArrayList<Cluster>(); - List<Cluster> bottomList = new ArrayList<Cluster>(); - - // Track the highest energy cluster in the event. - double maxEnergy = 0.0; - - // Process each of the clusters. - for(Cluster cluster : clusterList) { - // If this cluster has a higher energy then was seen - // previously, it is now the highest energy cluster. - if (cluster.getEnergy() > maxEnergy) { - maxEnergy = cluster.getEnergy(); - } - - - // Get the list of calorimeter hits and its size. - List<CalorimeterHit> hitList = cluster.getCalorimeterHits(); - int hitCount = hitList.size(); - - // Track cluster statistics. - double xEnergyWeight = 0.0; - double yEnergyWeight = 0.0; - double[] hitTimes = new double[hitCount]; - double totalHitEnergy = 0.0; - - // Iterate over the hits and extract statistics from them. - for(int hitIndex = 0; hitIndex < hitCount; hitIndex++) { - hitTimes[hitIndex] = hitList.get(hitIndex).getTime(); - totalHitEnergy += hitList.get(hitIndex).getRawEnergy(); - xEnergyWeight += (hitList.get(hitIndex).getRawEnergy() * hitList.get(hitIndex).getIdentifierFieldValue("ix")); - yEnergyWeight += (hitList.get(hitIndex).getRawEnergy() * hitList.get(hitIndex).getIdentifierFieldValue("iy")); - } - - // If the cluster energy exceeds zero, plot the cluster - // statistics. - if(cluster.getEnergy() > 0) { - clusterSizePlot.fill(hitCount); - clusterTimes.fill(StatUtils.mean(hitTimes, 0, hitCount)); - clusterTimeSigma.fill(Math.sqrt(StatUtils.variance(hitTimes, 0, hitCount))); - edgePlot.fill(xEnergyWeight / totalHitEnergy, yEnergyWeight / totalHitEnergy); - } - - // Fill the single cluster plots. - clusterEnergyPlot.fill(cluster.getEnergy()); - - // Cluster pairs are formed from all top/bottom cluster - // combinations. To create these pairs, separate the - // clusters into two lists based on their y-indices. - if(cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix") > 0) { - topList.add(cluster); - } else { - bottomList.add(cluster); - } - } - - // Populate the event plots. - clusterCountPlot.fill(clusterList.size()); - if(maxEnergy > 0) { clusterMaxEnergyPlot.fill(maxEnergy); } - - // Create a list to store cluster pairs. - List<Cluster[]> pairList = new ArrayList<Cluster[]>(topList.size() * bottomList.size()); - - // Form pairs from all possible combinations of clusters - // from the top and bottom lists. - for(Cluster topCluster : topList) { - for(Cluster bottomCluster : bottomList) { - // Make a cluster pair array. - Cluster[] pair = new Cluster[2]; - - // The lower energy cluster goes in the second slot. - if(topCluster.getEnergy() > bottomCluster.getEnergy()) { - pair[0] = topCluster; - pair[1] = bottomCluster; - } else { - pair[0] = bottomCluster; - pair[1] = topCluster; - } - - // Add the pair to the pair list. - pairList.add(pair); - } - } - - // Iterate over each pair and calculate the pair cut values. - for(Cluster[] pair : pairList) { - // Get the energy slope value. - double energySumValue = TriggerModule.getValueEnergySum(pair); - double energyDifferenceValue = TriggerModule.getValueEnergyDifference(pair); - double energySlopeValue = TriggerModule.getValueEnergySlope(pair, 0.005500); - double coplanarityValue = TriggerModule.getValueCoplanarity(pair); - double xMean = ((pair[0].getEnergy() * pair[0].getPosition()[0]) + - (pair[1].getEnergy() * pair[1].getPosition()[0])) / energySumValue; - double yMean = ((pair[0].getEnergy() * pair[0].getPosition()[1]) + - (pair[1].getEnergy() * pair[1].getPosition()[1])) / energySumValue; - - // Populate the cluster pair plots. - pairEnergySum.fill(energySumValue, 1);; - pairEnergyDifference.fill(energyDifferenceValue, 1); - pairEnergySlope.fill(energySlopeValue, 1); - pairCoplanarity.fill(coplanarityValue, 1); - pairEnergyPositionMeanX.fill(xMean); - pairEnergyPositionMeanY.fill(yMean); - } - } - - // If the event does not contain clusters, update the "Event - // Clusters" plot accordingly. - else { clusterCountPlot.fill(0); } + // Check whether the event has clusters or not. + if(event.hasCollection(Cluster.class, clusterCollectionName)) { + // Get the list of clusters. + List<Cluster> clusterList = event.get(Cluster.class, clusterCollectionName); + + // Create lists to store the clusters from the top of the + // calorimeter and the bottom. + List<Cluster> topList = new ArrayList<Cluster>(); + List<Cluster> bottomList = new ArrayList<Cluster>(); + + // Track the highest energy cluster in the event. + double maxEnergy = 0.0; + + // Process each of the clusters. + for(Cluster cluster : clusterList) { + // If this cluster has a higher energy then was seen + // previously, it is now the highest energy cluster. + if (cluster.getEnergy() > maxEnergy) { + maxEnergy = cluster.getEnergy(); + } + + + // Get the list of calorimeter hits and its size. + List<CalorimeterHit> hitList = cluster.getCalorimeterHits(); + int hitCount = hitList.size(); + + // Track cluster statistics. + double xEnergyWeight = 0.0; + double yEnergyWeight = 0.0; + double[] hitTimes = new double[hitCount]; + double totalHitEnergy = 0.0; + + // Iterate over the hits and extract statistics from them. + for(int hitIndex = 0; hitIndex < hitCount; hitIndex++) { + hitTimes[hitIndex] = hitList.get(hitIndex).getTime(); + totalHitEnergy += hitList.get(hitIndex).getRawEnergy(); + xEnergyWeight += (hitList.get(hitIndex).getRawEnergy() * hitList.get(hitIndex).getIdentifierFieldValue("ix")); + yEnergyWeight += (hitList.get(hitIndex).getRawEnergy() * hitList.get(hitIndex).getIdentifierFieldValue("iy")); + } + + // If the cluster energy exceeds zero, plot the cluster + // statistics. + if(cluster.getEnergy() > 0) { + clusterSizePlot.fill(hitCount); + clusterTimes.fill(StatUtils.mean(hitTimes, 0, hitCount)); + clusterTimeSigma.fill(Math.sqrt(StatUtils.variance(hitTimes, 0, hitCount))); + edgePlot.fill(xEnergyWeight / totalHitEnergy, yEnergyWeight / totalHitEnergy); + } + + // Fill the single cluster plots. + clusterEnergyPlot.fill(cluster.getEnergy()); + + // Cluster pairs are formed from all top/bottom cluster + // combinations. To create these pairs, separate the + // clusters into two lists based on their y-indices. + if(cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix") > 0) { + topList.add(cluster); + } else { + bottomList.add(cluster); + } + } + + // Populate the event plots. + clusterCountPlot.fill(clusterList.size()); + if(maxEnergy > 0) { clusterMaxEnergyPlot.fill(maxEnergy); } + + // Create a list to store cluster pairs. + List<Cluster[]> pairList = new ArrayList<Cluster[]>(topList.size() * bottomList.size()); + + // Form pairs from all possible combinations of clusters + // from the top and bottom lists. + for(Cluster topCluster : topList) { + for(Cluster bottomCluster : bottomList) { + // Make a cluster pair array. + Cluster[] pair = new Cluster[2]; + + // The lower energy cluster goes in the second slot. + if(topCluster.getEnergy() > bottomCluster.getEnergy()) { + pair[0] = topCluster; + pair[1] = bottomCluster; + } else { + pair[0] = bottomCluster; + pair[1] = topCluster; + } + + // Add the pair to the pair list. + pairList.add(pair); + } + } + + // Iterate over each pair and calculate the pair cut values. + for(Cluster[] pair : pairList) { + // Get the energy slope value. + double energySumValue = TriggerModule.getValueEnergySum(pair); + double energyDifferenceValue = TriggerModule.getValueEnergyDifference(pair); + double energySlopeValue = TriggerModule.getValueEnergySlope(pair, 0.005500); + double coplanarityValue = TriggerModule.getValueCoplanarity(pair); + double xMean = ((pair[0].getEnergy() * pair[0].getPosition()[0]) + + (pair[1].getEnergy() * pair[1].getPosition()[0])) / energySumValue; + double yMean = ((pair[0].getEnergy() * pair[0].getPosition()[1]) + + (pair[1].getEnergy() * pair[1].getPosition()[1])) / energySumValue; + + // Populate the cluster pair plots. + pairEnergySum.fill(energySumValue, 1);; + pairEnergyDifference.fill(energyDifferenceValue, 1); + pairEnergySlope.fill(energySlopeValue, 1); + pairCoplanarity.fill(coplanarityValue, 1); + pairEnergyPositionMeanX.fill(xMean); + pairEnergyPositionMeanY.fill(yMean); + } + } + + // If the event does not contain clusters, update the "Event + // Clusters" plot accordingly. + else { clusterCountPlot.fill(0); } } /** Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalEventDisplayWithRawWaveform.java ============================================================================= --- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalEventDisplayWithRawWaveform.java (original) +++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalEventDisplayWithRawWaveform.java Wed Mar 9 11:43:24 2016 @@ -54,7 +54,7 @@ // Plotter objects and variables. private IPlotter plotter; private IPlotterFactory plotterFactory; - private AIDA aida = AIDA.defaultInstance(); + private AIDA aida = AIDA.defaultInstance(); // LCIO Collection names. private String inputCollection = "EcalCalHits"; @@ -69,16 +69,16 @@ private ArrayList<IHistogram2D> channelTimeVsEnergyPlot; // Internal variables. - private PEventViewer viewer; // Single event display. - private int pedSamples = 10; // - private IPlotterStyle pstyle; // The plotter style for all plots. - private long lastEventTime = 0; // Tracks the time at which the last event occurred. - private int eventRefreshRate = 1; // The number of seconds before an update occurs. - private boolean resetOnUpdate = true; // Clears the event display on each update. - private double minEch = 10 * EcalUtils.MeV; // The energy scale minimum. - private double maxEch = 3500 * EcalUtils.MeV; // The energy scale maximum. - private int[] windowRaw = new int[NUM_CHANNELS]; // The number of samples in a waveform for each channel. - private boolean[] isFirstRaw = new boolean[NUM_CHANNELS]; // Whether a waveform plot was initiated for each channel. + private PEventViewer viewer; // Single event display. + private int pedSamples = 10; // + private IPlotterStyle pstyle; // The plotter style for all plots. + private long lastEventTime = 0; // Tracks the time at which the last event occurred. + private int eventRefreshRate = 1; // The number of seconds before an update occurs. + private boolean resetOnUpdate = true; // Clears the event display on each update. + private double minEch = 10 * EcalUtils.MeV; // The energy scale minimum. + private double maxEch = 3500 * EcalUtils.MeV; // The energy scale maximum. + private int[] windowRaw = new int[NUM_CHANNELS]; // The number of samples in a waveform for each channel. + private boolean[] isFirstRaw = new boolean[NUM_CHANNELS]; // Whether a waveform plot was initiated for each channel. // Plot style and title variables. private static final String NO_TITLE = ""; Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalFeeMonitor.java ============================================================================= --- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalFeeMonitor.java (original) +++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalFeeMonitor.java Wed Mar 9 11:43:24 2016 @@ -33,80 +33,80 @@ // this has to match the one in FEEClusterPlotter: private String histoNameFormat = "%3d"; - private AIDA aida = AIDA.defaultInstance(); - private IPlotter plotter; - private IPlotterFactory plotterFactory; - private IPlotterStyle pstyle; - private PEventViewer viewer; + private AIDA aida = AIDA.defaultInstance(); + private IPlotter plotter; + private IPlotterFactory plotterFactory; + private IPlotterStyle pstyle; + private PEventViewer viewer; - static final String[] colors={"red","black","blue","green","yellow","pink","cyan","magenta","brown"}; - static final int nRows=3; - static final int nColumns=3; - private int theRegion=0; - - @Override - public void detectorChanged(Detector detector) { - plotterFactory = aida.analysisFactory().createPlotterFactory("ECal Fee"); - plotter = plotterFactory.create("ECal Fee"); - plotter.createRegions(nColumns,nRows); - // Plot dummmy histos, else null plotter regions later: - for (int ii=0; ii<nColumns*nRows; ii++) { - plotter.region(ii).plot(aida.histogram1D("ASDF"+ii,100,11e9,11e11)); - } - plotter.show(); - - pstyle=plotterFactory.createPlotterStyle(); - pstyle.xAxisStyle().labelStyle().setBold(true); - pstyle.yAxisStyle().labelStyle().setBold(true); - pstyle.xAxisStyle().tickLabelStyle().setBold(true); - pstyle.yAxisStyle().tickLabelStyle().setBold(true); - pstyle.xAxisStyle().lineStyle().setColor("black"); - pstyle.yAxisStyle().lineStyle().setColor("black"); - pstyle.xAxisStyle().lineStyle().setThickness(2); - pstyle.yAxisStyle().lineStyle().setThickness(2); - pstyle.dataStyle().errorBarStyle().setThickness(0); - pstyle.legendBoxStyle().setVisible(false); - } - - @Override - public void startOfData() { - File config = new File("ecal-mapping-config.csv"); - if(config.exists() && config.canRead()) { - try { viewer = new PDataEventViewer(config.getAbsolutePath()); } - catch (IOException e) { viewer = new PEventViewer(); } - } else { viewer = new PEventViewer(); } - viewer.addCrystalListener(this); - viewer.setVisible(true); - } - - @Override - public void actionPerformed(ActionEvent ae) { } - - @Override - public void crystalActivated(CrystalEvent e) { } - - @Override - public void crystalDeactivated(CrystalEvent e) { } + static final String[] colors={"red","black","blue","green","yellow","pink","cyan","magenta","brown"}; + static final int nRows=3; + static final int nColumns=3; + private int theRegion=0; + + @Override + public void detectorChanged(Detector detector) { + plotterFactory = aida.analysisFactory().createPlotterFactory("ECal Fee"); + plotter = plotterFactory.create("ECal Fee"); + plotter.createRegions(nColumns,nRows); + // Plot dummmy histos, else null plotter regions later: + for (int ii=0; ii<nColumns*nRows; ii++) { + plotter.region(ii).plot(aida.histogram1D("ASDF"+ii,100,11e9,11e11)); + } + plotter.show(); + + pstyle=plotterFactory.createPlotterStyle(); + pstyle.xAxisStyle().labelStyle().setBold(true); + pstyle.yAxisStyle().labelStyle().setBold(true); + pstyle.xAxisStyle().tickLabelStyle().setBold(true); + pstyle.yAxisStyle().tickLabelStyle().setBold(true); + pstyle.xAxisStyle().lineStyle().setColor("black"); + pstyle.yAxisStyle().lineStyle().setColor("black"); + pstyle.xAxisStyle().lineStyle().setThickness(2); + pstyle.yAxisStyle().lineStyle().setThickness(2); + pstyle.dataStyle().errorBarStyle().setThickness(0); + pstyle.legendBoxStyle().setVisible(false); + } + + @Override + public void startOfData() { + File config = new File("ecal-mapping-config.csv"); + if(config.exists() && config.canRead()) { + try { viewer = new PDataEventViewer(config.getAbsolutePath()); } + catch (IOException e) { viewer = new PEventViewer(); } + } else { viewer = new PEventViewer(); } + viewer.addCrystalListener(this); + viewer.setVisible(true); + } + + @Override + public void actionPerformed(ActionEvent ae) { } + + @Override + public void crystalActivated(CrystalEvent e) { } + + @Override + public void crystalDeactivated(CrystalEvent e) { } - @Override - public void crystalClicked(CrystalEvent e) { - aida.tree().cd("/"); - Point ecalPoint = Viewer.toEcalPoint(e.getCrystalID()); - if (ecalPoint.x == 0 || ecalPoint.y == 0) return; - if (EcalMonitoringUtilities.isInHole(ecalPoint.y,ecalPoint.x)) return; - final int cid=EcalMonitoringUtilities.getChannelIdFromRowColumn(ecalPoint.y,ecalPoint.x); - IHistogram1D hist=aida.histogram1D(String.format(histoNameFormat,cid)); - if (hist==null) { - System.err.println("Running the Driver?"); - } else { - hist.setTitle(String.format("(%d,%d)",ecalPoint.x,ecalPoint.y)); + @Override + public void crystalClicked(CrystalEvent e) { + aida.tree().cd("/"); + Point ecalPoint = Viewer.toEcalPoint(e.getCrystalID()); + if (ecalPoint.x == 0 || ecalPoint.y == 0) return; + if (EcalMonitoringUtilities.isInHole(ecalPoint.y,ecalPoint.x)) return; + final int cid=EcalMonitoringUtilities.getChannelIdFromRowColumn(ecalPoint.y,ecalPoint.x); + IHistogram1D hist=aida.histogram1D(String.format(histoNameFormat,cid)); + if (hist==null) { + System.err.println("Running the Driver?"); + } else { + hist.setTitle(String.format("(%d,%d)",ecalPoint.x,ecalPoint.y)); pstyle.dataStyle().lineStyle().setParameter("color", colors[theRegion%colors.length]); - plotter.region(theRegion).clear(); - plotter.region(theRegion).plot(hist,pstyle); - plotter.region(theRegion).refresh(); - theRegion=(theRegion+1)%(nColumns*nRows); - } - } - - + plotter.region(theRegion).clear(); + plotter.region(theRegion).plot(hist,pstyle); + plotter.region(theRegion).refresh(); + theRegion=(theRegion+1)%(nColumns*nRows); + } + } + + } Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalHitPlots.java ============================================================================= --- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalHitPlots.java (original) +++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalHitPlots.java Wed Mar 9 11:43:24 2016 @@ -190,17 +190,17 @@ GenericObject triggerData = triggerList.get(0); if (triggerData instanceof SSPData){ - // TODO: TOP, BOTTOM, OR, and AND triggers are test - // run specific parameters and are not supported - // by SSPData. - orTrigTime = 0; //((SSPData)triggerData).getOrTrig(); - topTrigTime = 0; //((SSPData)triggerData).getTopTrig(); - botTrigTime = 0; //((SSPData)triggerData).getBotTrig(); - - - orTrigTimePlot.fill(orTrigTime); + // TODO: TOP, BOTTOM, OR, and AND triggers are test + // run specific parameters and are not supported + // by SSPData. + orTrigTime = 0; //((SSPData)triggerData).getOrTrig(); + topTrigTime = 0; //((SSPData)triggerData).getTopTrig(); + botTrigTime = 0; //((SSPData)triggerData).getBotTrig(); + + + orTrigTimePlot.fill(orTrigTime); topTrigTimePlot.fill(topTrigTime); - botTrigTimePlot.fill(botTrigTime); + botTrigTimePlot.fill(botTrigTime); } Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalLedSequenceMonitor.java ============================================================================= --- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalLedSequenceMonitor.java (original) +++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalLedSequenceMonitor.java Wed Mar 9 11:43:24 2016 @@ -58,836 +58,836 @@ */ public class EcalLedSequenceMonitor extends Driver{ - private static final int NUM_CHANNELS = 11 * 47; - private static final String dbTag = "led"; - private static final String dbTableName = "ecal_led_calibrations"; - private static final int runNumberMax = 9999; - private static final int nDrivers = 8; - private static final int nSteps = 100; //should be 56 but here is to avoid seg fault - - - - String inputCollectionRaw = "EcalReadoutHits"; - String inputCollection = "EcalCalHits"; - AIDA aida; - - DatabaseConditionsManager conditionsManager; - - private EcalChannelCollection ChannelCollection; - private EcalLedCollection LedCollection; - private EcalConditions ecalConditions; - - Map < Integer,Integer > LedTopMap; //chid (conditions) --> LED id - Map < Integer,Integer > LedBotMap; //chid (conditions) --> LED id - - Map < Integer,Integer > LedTopMapInverted; //LED id --> chid (conditions) - Map < Integer,Integer > LedBotMapInverted; //LED id --> chid (conditions) - - private boolean useRawEnergy=false; - - String outFileName; - - - private int runNumber = 0; - private int eventN = 0; - private int id,row,column,chid,ledId,driverId; - private int[][] expectedSequence = new int[][]{ /*A.C. it is a terrible thing to have this hard-coded here!*/ - //first 4 are the flasher1 sequence, TOP controller - {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,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,-1,-1}, - {56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111}, - {112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,-1}, //missing 135 is ok - {168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223}, - //second 4 are the flasher2 sequence, BOTTOM controller - {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,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,-1,-1}, - {56,57,58,59,60,61,62,63,64,65,66,67,68,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,-1}, //missing 69 is OK - {112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167}, - {168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223}, - }; - private int[][] actualSequence=new int[nDrivers][nSteps]; - - private int[] iStep = new int[nDrivers]; - private int[] nEvents = new int[NUM_CHANNELS]; - private double[] mMean = new double[NUM_CHANNELS]; - private double[] mRMS = new double[NUM_CHANNELS]; - - private int nEventsMin=200; - private int nMinChannelsWithEvents=350; - private double energy,fillEnergy,fillTime; - private double energyCut=2; //we expect very high energy from the LEDs.. - private double skipInitial=0.05; - private double skipMin=0.3; - private long cellID; - - - - - //Histograms-functions-ntuples - private ArrayList<ITuple> iTuple; - - private IFunction fFunction,fFunction1; - private IProfile1D cProfile; - private IHistogram2D hMeanCharge2D; - private ArrayList<IHistogram1D> hCharge; - private ArrayList<IHistogram2D> hChargeVsEvn; - private IPlotterFactory factory; - private IPlotter pPlotter=null; - private IPlotter pPlotter2=null; - private IPlotterStyle style ; - private int[] fitStatus = new int[NUM_CHANNELS]; - - private boolean doFullAnalysis=false; - private boolean isMonitoringApp=false; - private boolean saveTuple=false; - - private double[] fPars; - private double[] fPrevPars; - private double[] fParErrs; - private String[] fParNames; - - - private double fEvnMinDraw=0.; - private double fEvnMaxDraw=80000.; - private double fChargeMinDraw=0.; - private double fChargeMaxDraw=100.; - - /*Components for user interaction*/ - private JDialog dialog; - private JLabel label; - private JFrame frame; - private JPanel panel; - String labelString; - private JButton okButtonRed,okButtonBlue,cancelButton; - private int m_iteration=0; - private LedColor m_ret=LedColor.UNKNOWN; //use UNKNONW as CANCEL button - static Object modalMonitor = new Object(); - - public void setUseRawEnergy(boolean useRawEnergy) { - this.useRawEnergy=useRawEnergy; - } - - public void setEnergyCut(double energyCut) { - this.energyCut=energyCut; - } - public void setSkipInitial(double skipInitial) { - this.skipInitial=skipInitial; - } - public void setSkipMin(double skipMin) { - this.skipMin=skipMin; - } - - public void setEvnMinDraw(double evnMinDraw){ - this.fEvnMinDraw=evnMinDraw; - } - public void setEvnMaxDraw(double evnMaxDraw){ - this.fEvnMaxDraw=evnMaxDraw; - } - public void setChargeMinDraw(double chargeMinDraw){ - this.fChargeMinDraw=chargeMinDraw; - } - public void setChargeMaxDraw(double chargeMaxDraw){ - this.fChargeMaxDraw=chargeMaxDraw; - } - - public void setNEventsMin(int nEeventsMin){ - this.nEventsMin=nEventsMin; - } - - public void setIsMonitoringApp(boolean app){ - this.isMonitoringApp=app; - } - - public void setDoFullAnalysis(boolean fullAnalysis){ - this.doFullAnalysis=fullAnalysis; - } - - public void setSaveTuple(boolean flag){ - this.saveTuple=flag; - } - - @Override - protected void detectorChanged(Detector detector) { - System.out.println("LedAnalysis::Detector changed was called"); - System.out.println(fEvnMinDraw+" "+fEvnMaxDraw); - for (int ii=0;ii<nDrivers;ii++){ - iStep[ii]=0; - // actualSequence[ii][iStep[ii]]=-1; - } - - // Setup conditions - - conditionsManager = DatabaseConditionsManager.getInstance(); - - LedTopMap = new HashMap< Integer , Integer >(); //key: ecal channel ID. Value: led id - LedBotMap = new HashMap< Integer , Integer >(); - - LedTopMapInverted = new HashMap< Integer , Integer >(); //key: led id. Value: ecal channel id - LedBotMapInverted = new HashMap< Integer , Integer >(); - - - ChannelCollection = conditionsManager.getCachedConditions(EcalChannelCollection.class, "ecal_channels").getCachedData(); - LedCollection = conditionsManager.getCachedConditions(EcalLedCollection.class, "ecal_leds").getCachedData(); - ecalConditions = conditionsManager.getEcalConditions(); - - for (EcalChannel channel : ChannelCollection){ - chid = channel.getChannelId(); - for (EcalLed Led : LedCollection) { - if (Led.getEcalChannelId()==chid){ - if (channel.getY()>0){ - LedTopMap.put( chid , Led.getLedNumber() ); - LedTopMapInverted.put( Led.getLedNumber(), chid ); - } - else if (channel.getY()<0){ - LedBotMap.put( chid , Led.getLedNumber() ); - LedBotMapInverted.put( Led.getLedNumber(), chid ); - } - } - } - } - - - - // Setup plots - aida = AIDA.defaultInstance(); - aida.tree().cd("/"); - hMeanCharge2D = aida.histogram2D("Average LED response", 47, -23.5, 23.5, 11, -5.5, 5.5); - - factory= aida.analysisFactory().createPlotterFactory("Ecal Led Sequence"); - pPlotter= factory.create("Drivers"); - pPlotter.createRegions(4,2); - if (isMonitoringApp){ - pPlotter2=factory.create("Sequence Map"); - pPlotter2.createRegions(1,1); - pPlotter2.region(0).plot(hMeanCharge2D); - } - iTuple = new ArrayList<ITuple>(NUM_CHANNELS); - hCharge = new ArrayList<IHistogram1D>(NUM_CHANNELS); - hChargeVsEvn = new ArrayList<IHistogram2D>(nDrivers); - - - - //pPlotter2.region(0).plot(hMeanCharge2D); - - for (int ii=0;ii<NUM_CHANNELS;ii++){ - int row = EcalMonitoringUtilities.getRowFromHistoID(ii); - int column = EcalMonitoringUtilities.getColumnFromHistoID(ii); - iTuple.add(aida.analysisFactory().createTupleFactory(aida.tree()).create("nTuple"+ii,"nTuple"+ii,"int fEvn=0 , double fCharge=0.,double fTime=0.","")); - } - - for (int ii=0;ii<nDrivers;ii++){ - hChargeVsEvn.add(aida.histogram2D("Driver"+ii,100,fEvnMinDraw,fEvnMaxDraw,100,fChargeMinDraw,fChargeMaxDraw)); - pPlotter.region(ii).plot( hChargeVsEvn.get(ii)); - } - - pPlotter.show(); - if (isMonitoringApp) pPlotter2.show(); - - } - - @Override - public void process(EventHeader event) { - runNumber = event.getRunNumber(); - eventN++; - if (event.hasCollection(CalorimeterHit.class, inputCollection)) { - //List<BassRawCalorimeterHit> hits = event.get(BaseRawCalorimeterHit.class, inputCollectionRaw); - List<CalorimeterHit> hits = event.get(CalorimeterHit.class, inputCollection); - for (CalorimeterHit hit : hits) { - - column = hit.getIdentifierFieldValue("ix"); - row = hit.getIdentifierFieldValue("iy"); - id = EcalMonitoringUtilities.getHistoIDFromRowColumn(row, column); - cellID=hit.getCellID(); - chid = ChannelCollection.findGeometric(cellID).getChannelId(); - - energy = hit.getCorrectedEnergy(); - - if (useRawEnergy){ - fillEnergy = getRawADCSum(energy,cellID); - } - else { - fillEnergy = energy; - } - fillTime = hit.getTime(); - - - //find the LED - if (row>0){ - ledId=LedTopMap.get(chid); - } - else if (row<0){ - ledId=LedBotMap.get(chid); - } - driverId=getDriver(ledId); - if (row<0) driverId+=4; - - - - /*Skip the events under thr*/ - if (energy<energyCut) continue; - - /*First, check if this led is the one in the NEXT step. Therefore, increment by 1 the step*/ - /* - * if (iStep[driverId]==0){ - - actualSequence[driverId][iStep[driverId]]=ledId; - iStep[driverId]=1; - } - else if ((iStep[driverId]==1)&&(ledId!=actualSequence[driverId][0])){ - System.out.println("LedAnalysis:: increment step ("+iStep[driverId]+") for driver "+driverId+" . Led ID: "+ledId+" Column: "+column+" Row: "+row); - if (iStep[driverId]>0) drawProfiles(actualSequence[driverId][iStep[driverId]-1],driverId); - actualSequence[driverId][iStep[driverId]]=ledId; - iStep[driverId]++; - } - else if ((iStep[driverId]>1)&&(ledId!=actualSequence[driverId][iStep[driverId]-1])&&(ledId!=actualSequence[driverId][iStep[driverId]-2])){ - System.out.println("LedAnalysis:: increment step ("+iStep[driverId]+") for driver "+driverId+" . Led ID: "+ledId+" Column: "+column+" Row: "+row); - if (iStep[driverId]>0) drawProfiles(actualSequence[driverId][iStep[driverId]-1],driverId); - actualSequence[driverId][iStep[driverId]]=ledId; - iStep[driverId]++; - } - - - // if (iStep[driverId]==-1) continue; - - */ - - if (iStep[driverId]==-1) continue; /*Not yet data*/ - - /*Put this code here, since we want to always fill the ntuple*/ - iTuple.get(id).fill(0,nEvents[id]); - iTuple.get(id).fill(1,fillEnergy); - iTuple.get(id).fill(2,fillTime); - iTuple.get(id).addRow(); - nEvents[id]++; - - - - /*Add a debug print */ - if (eventN % 10000==0){ - System.out.println("Debug. Event "+eventN+" LED ID: "+ledId+" DRIVER ID: "+driverId+" ECAL ID: "+id+" ROW: "+row+" COLUMN: "+column+ "HISTO ID: "+id); - } - } - if (eventN % 10000==0){ - System.out.println("\n"); - } - } - } - - /* - * The endOfData() method analises each ntuple to find the LED response. - * We cannot simply fit a gaussian to the energy distribution, since there is a high-energy tail due to the LED being turned on: - * When the LED turns on, it is "cold", and emits more light. Immediately, it starts to heat, and due to temperature effects the - * emitted light is less. This is clearly visible if one plots the charge VS the event number: the trend is decreasing, toward a - * plateau, that corresponds to the value at thermal equilibrium. - * - * For (few) channels, the first charge values are close to 0, then charge grows rapidly, then it returns back to the plateau. - * To handle these, I always cut the first 10% events - * To properly handle this: - * - * 1) First create a profile histogram, charge VS event number. - * 2) Fit it with something like "A*exp(-event_number/N0)+C. The function does not need to be extra-accurate at this stage - * 3) Cut the events with event_number < 5*N0. - * 4) Fit the remaining events with a gaussian. - */ - @Override - public void endOfData() { - System.out.println("LedAnalysis::end of data"); - System.out.println("LedAnalysis:: nEventsMin is: "+nEventsMin); - - double e,eMin,eMax; - double t; - int n,nBins,nSkip; - - int row, column; - - String hName; - IFunctionFactory fFactory=aida.analysisFactory().createFunctionFactory(aida.tree()); - - IFitResult fResult; - IFitter fFitter; - - for (int id = 0; id < 11 * 47; id++) { - - eMin=9999; - eMax=-9999; - row = EcalMonitoringUtilities.getRowFromHistoID(id); - column = EcalMonitoringUtilities.getColumnFromHistoID(id); - System.out.println(""); - System.out.println("Doing channel: X= "+column+" Y= "+row+ "id= "+id); - System.out.println("Number of entries in analysis ntuple: "+iTuple.get(id).rows()); - System.out.println("Number of recognized events: "+nEvents[id]); - /*Create the profile. Create it for all the channels, to keep sync.*/ - nBins=nEvents[id]/100; - if (nBins<=0) nBins=1; - - /*Clear previous*/ - - if (id>0){ - aida.tree().rm("strip"); - aida.tree().rm("fun0"); - aida.tree().rm("fun1"); - } - /*Create the profile.*/ - cProfile=aida.profile1D("strip",nBins,-0.5,nEvents[id]*(1-skipInitial)+0.5); - cProfile.reset(); - /*Create the function for the profile fit and the gaus fit*/ - fFunction=fFactory.createFunctionFromScript("fun0",1,"A*exp(-x[0]/tau)+B","A,tau,B","",null); - fFunction1=fFactory.createFunctionByName("fun1","G"); - - if (EcalMonitoringUtilities.isInHole(row,column)==true){ - System.out.println("Channel X= "+column+" Y= "+row+" is in hole. Skip"); - hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync - System.out.println("In hole, skip"); - continue; - } - else if (nEvents[id]<nEventsMin) { - hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync - System.err.println("LedAnalysis:: the channel X= "+column+" Y= "+row+" has not enough events "+nEvents[id]+" "+nEventsMin); - - continue; - } - - //Fill the profile*/ - nSkip=(int)(nEvents[id]*skipInitial); - if (nSkip>iTuple.get(id).rows()){ - System.out.println("Can't skip initial events?"); - nSkip=0; - } - iTuple.get(id).start(); - iTuple.get(id).skip(nSkip); //This is the work-around for those channels with charge starting from 0 and rapidly growing// - n=0; - iTuple.get(id).next(); - while ( iTuple.get(id).next() ){ - e=iTuple.get(id).getDouble(1); - if (e<eMin) eMin=e; - if (e>eMax) eMax=e; - cProfile.fill(1.*n,e); - n++; - } - fFitter=aida.analysisFactory().createFitFactory().createFitter("chi2","","v"); - - if (doFullAnalysis){ - //Init function parameters - double[] initialPars={eMax-eMin,nEvents[id]/10.,eMin}; - if (initialPars[0]<0) initialPars[0]=0; - fFunction.setParameters(initialPars); - - //Do the fit - System.out.println("LedAnalysis:: do profile fit "+id+" "+fFitter.engineName()+" "+fFitter.fitMethodName()); - System.out.println("LedAnalysis:: initial parameters "+initialPars[0]+" "+initialPars[1]+" "+initialPars[2]); - fResult=fFitter.fit(cProfile,fFunction); - fPars = fResult.fittedParameters(); - fParErrs = fResult.errors(); - fParNames = fResult.fittedParameterNames(); - System.out.println("LedAnalysis:: Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf()); - for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){ - System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]); - } - fFunction.setParameters(fPars); - - - //if fit failed, revert to simpler case - if ((fResult.isValid()==false)||Double.isNaN(fParErrs[0])||Double.isNaN(fParErrs[1])||Double.isNaN(fParErrs[2])){ - System.out.println("LedAnalysis:: fit failed. Reverting to simpler case"); - nSkip=(int)(nEvents[id]*(skipMin+skipInitial)); - } - else{ - //Now we have the tau parameter. Take ONLY the events that are with N>5*tau/ - //As a cross-check, also verify that tau > Nevents/10, otherwise skip the first Nevents/2 - //and emit warning - nSkip=(int)( fPars[1]*5); - if (nSkip < (nEvents[id]*skipMin)){ - System.out.println("LedAnalysis:: Skip number too low: "+nSkip+" Increment it to "+nEvents[id]/2); - nSkip=(int)(nEvents[id]*(skipMin+skipInitial)); - } - if (nSkip > nEvents[id]){ - System.out.println("LedAnalysis:: Skip number too high, reduce it"); - nSkip=(int)(nEvents[id]*(skipMin+skipInitial)); - } - } - } - else{ - nSkip=(int)(nEvents[id]*(skipMin+skipInitial)); - } - - System.out.println("LedAnalysis:: gaus fit :: Going to skip "+nSkip+" out of "+nEvents[id]); - System.out.println("eMin is: "+eMin+" eMax is: "+eMax); - hCharge.add(aida.histogram1D("charge_"+id,200,eMin*0.9,eMax*1.1)); - - - iTuple.get(id).start(); - iTuple.get(id).skip(nSkip); - n=0; - while (iTuple.get(id).next()){ - e=iTuple.get(id).getDouble(1); - t=iTuple.get(id).getDouble(2); - hCharge.get(id).fill(e); - n++; - } - - /*Finally do the fit with the gaussian*/ - double[] initialPars1={hCharge.get(id).maxBinHeight(),hCharge.get(id).mean(),hCharge.get(id).rms()}; - - System.out.println("LedAnalysis:: Gaus fit"); - System.out.println("LedAnalysis:: initial parameters "+initialPars1[0]+" "+initialPars1[1]+" "+initialPars1[2]); - - fFunction1.setParameters(initialPars1); - fResult=fFitter.fit(hCharge.get(id),fFunction1); - fPars = fResult.fittedParameters(); - fParErrs = fResult.errors(); - fParNames = fResult.fittedParameterNames(); - System.out.println("Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf()); - for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){ - System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]); - } - fFunction1.setParameters(fPars); - mMean[id]=fPars[1]; - mRMS[id]=fPars[2]; - - hMeanCharge2D.fill(column,row,mMean[id]); - System.out.println("\n"); - }//End loop on channels - - - - if ((pPlotter2!=null)&&(isMonitoringApp)){ - style = pPlotter2.region(0).style(); - style.setParameter("hist2DStyle", "colorMap"); - style.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); - style.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString()); - pPlotter2.region(0).plot(hMeanCharge2D); - pPlotter2.region(0).refresh(); - } - else{ - IPlotterStyle pstyle = aida.analysisFactory().createPlotterFactory().createPlotterStyle(); - pPlotter2 = null; - pPlotter2 = aida.analysisFactory().createPlotterFactory().create(); - pstyle.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); - pstyle.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString()); - pstyle.setParameter("hist2DStyle", "colorMap"); - if (pPlotter2!=null){ - pPlotter2.createRegion().plot(hMeanCharge2D,pstyle); - pPlotter2.show(); - } - } - - if (isMonitoringApp){ - askUploadToDBDialog(); - synchronized (modalMonitor) { - try{ - modalMonitor.wait(60000); //wait 1 minute for user interaction. - } - catch(InterruptedException excp){ - System.out.println("Got exception: "+excp); - } - } - if ((m_ret!=LedColor.UNKNOWN)){ - if (m_ret==LedColor.BLUE) System.out.println("OK, upload to DB BLUE"); - else System.out.println("OK, upload to DB RED"); - try { - uploadToDB(m_ret); - } catch (SQLException | DatabaseObjectException | ConditionsObjectException error) { - throw new RuntimeException("Error uploading to the database ", error); - } - - System.out.println("Save an Elog too"); - uploadToElog(); - } - else{ - System.out.println("Cancel pressed. Nothing to do"); - } - } - - /*Write a file with the LED values*/ - try { - if (useRawEnergy){ - outFileName=runNumber+".raw.txt"; - } - else{ - outFileName=runNumber+".energy.txt"; - } - PrintWriter writer = new PrintWriter(outFileName, "UTF-8"); - - for (int cid = 1; cid <= 442; cid++) {/*This is a loop over the channel ID, as in the conditions system*/ - EcalChannel cc = findChannel(cid); - column = cc.getX(); //This is the column - row = cc.getY(); //This is the row - id=EcalMonitoringUtilities.getHistoIDFromRowColumn(row,column); - row = EcalMonitoringUtilities.getRowFromHistoID(id); - column = EcalMonitoringUtilities.getColumnFromHistoID(id); - if (EcalMonitoringUtilities.isInHole(row, column)) continue; - if ((row == 0) || (column == 0)) continue; - - writer.print(cid+" "+column+" "+row+" "+" "+ mMean[id]+" "+mRMS[id]+"\r\n"); - - } - writer.close(); - - } - catch (FileNotFoundException fnfe) { - - System.out.println(fnfe.getMessage()); - - } - - catch (IOException ioe) { - - System.out.println(ioe.getMessage()); - - } - - - System.out.println("EcalLedSequenceMonitor endOfData clear histograms"); - for(int ii = 0; ii < NUM_CHANNELS; ii++) { - row=EcalMonitoringUtilities.getRowFromHistoID(ii); - column = EcalMonitoringUtilities.getColumnFromHistoID(ii); - hName="charge_"+ii; - try{ - aida.tree().rm(hName); - } - catch(IllegalArgumentException ee){ - System.out.println("Got exception "+ee); - } - - if (!saveTuple||(isMonitoringApp)){ - hName="nTuple"+ii; - try{ - aida.tree().rm(hName); - } - catch(IllegalArgumentException ee){ - System.out.println("Got exception "+ee); - } - } - } - System.out.println("EcalLedSequenceMonitor endOfData clear histograms done"); - System.out.println("endOfData end"); - System.out.println("The program is not stucked. It is writing the output AIDA file, this takes time!"); - }/*End endOfData*/ - - - /** - * This function returns the driver number (from 0 to 3) given the LED id. - * @param led - * @return - */ - public int getDriver(int led){ - int ret=-1; - if ((led>=2)&&(led<56)) ret=0; - else if ((led>=56)&&(led<112)) ret=1; - else if ((led>=112)&&(led<168)) ret=2; - else if ((led>=168)&&(led<224)) ret=3; - return ret; - } - - /** - * Very simple method to retrieve the pedestal-subtracted raw Energy. - * If the gain changes (because we do a re-calibration), I do not want to include this in the LED analysis - * @param energy - * @param cellID - * @return - */ - public double getRawADCSum(double energy,long cellID){ - EcalChannelConstants channelData = ecalConditions.getChannelConstants(ecalConditions.getChannelCollection().findGeometric(cellID)); - double RawSum=energy / EcalUtils.GeV; - double gain=channelData.getGain().getGain(); - double ret=RawSum/gain; - // System.out.println("A:C "+RawSum+" "+ret); - return ret; - } - - private void uploadToDB(LedColor color) throws DatabaseObjectException, ConditionsObjectException, SQLException { - int x,y,id; - double mean,rms; - System.out.println(String.format("Uploading new led data to the database, runMin=%d, runMax=%d, tag=%s ....", - runNumber,runNumberMax,dbTag)); - - conditionsManager = DatabaseConditionsManager.getInstance(); - EcalLedCalibrationCollection led_calibrations = new EcalLedCalibrationCollection(); - led_calibrations.setConnection(conditionsManager.getConnection()); - - TableMetaData tableMetaData = conditionsManager.findTableMetaData(dbTableName); - led_calibrations.setTableMetaData(tableMetaData); - - for (int cid = 1; cid <= 442; cid++) {/*This is a loop over the channel ID, as in the conditions system*/ - EcalChannel cc = findChannel(cid); - x = cc.getX(); //This is the column - y = cc.getY(); //This is the row - id=EcalMonitoringUtilities.getHistoIDFromRowColumn(y,x); - mean=mMean[id]; - rms=mRMS[id]; - led_calibrations.add(new EcalLedCalibration(cid,mean,rms,color)); - } - - int collectionId = -1; - - try { - collectionId = conditionsManager.getCollectionId(led_calibrations, "loaded by EcalLedSequenceMonitor"); - } catch (Exception e) { - System.out.println("Got exception on uploadToDB "+ e); - throw new RuntimeException(e); - } - System.err.println("CollectionID: "+collectionId); - led_calibrations.insert(); - ConditionsRecord conditionsRecord = new ConditionsRecord( - led_calibrations.getCollectionId(), runNumber, runNumberMax, dbTableName, dbTableName, - "Generated by LedAnalysis from Run #"+runNumber, dbTag); - conditionsRecord.setConnection(conditionsManager.getConnection()); - tableMetaData = conditionsManager.findTableMetaData("conditions"); - conditionsRecord.setTableMetaData(tableMetaData); - conditionsRecord.insert(); - - System.out.println("Upload to DB done"); - } - - private void uploadToElog(){ - String path,exe,command,imgpath; - path="/home/hpsrun/LedSequenceData"; - exe=path+"/doElog.csh"; - imgpath=path+"/screenshots/"+runNumber+".png"; - - File f=new File(path); - if (!f.exists()){ - System.err.println("LedMonitoringSequence:: wrong path"); - return; - } - if (pPlotter2==null){ - System.err.println("LedMonitoringSquence:: no plotter"); - return; - } - try{ - pPlotter2.writeToFile(imgpath); - } - catch(Exception e){ - System.err.println("Exception "+e); - } - File f1=new File(exe); - if (!f1.exists()){ - System.err.println("LedMonitoringSequence:: no script!"); - return; - } - command=exe+" "+imgpath; - try{ - System.out.println("LedMonitoringSequence:: try this command: "+command); - Runtime.getRuntime().exec(command); - } - catch(Exception e){ - System.err.println("Exception "+e); - } - } - - - private void drawProfiles(int ledID,int driverID){ - - int m_column,m_row,m_ledID,m_chID,m_ID,m_driverID; - - m_ledID = ledID; - m_driverID = driverID; - m_chID = 0; - - - if (m_driverID<=3) m_chID = LedTopMapInverted.get(ledID); - else m_chID = LedBotMapInverted.get(ledID); - - m_column=findChannel(m_chID).getX(); - m_row=findChannel(m_chID).getY(); - m_ID=EcalMonitoringUtilities.getHistoIDFromRowColumn(m_row, m_column); - /* + private static final int NUM_CHANNELS = 11 * 47; + private static final String dbTag = "led"; + private static final String dbTableName = "ecal_led_calibrations"; + private static final int runNumberMax = 9999; + private static final int nDrivers = 8; + private static final int nSteps = 100; //should be 56 but here is to avoid seg fault + + + + String inputCollectionRaw = "EcalReadoutHits"; + String inputCollection = "EcalCalHits"; + AIDA aida; + + DatabaseConditionsManager conditionsManager; + + private EcalChannelCollection ChannelCollection; + private EcalLedCollection LedCollection; + private EcalConditions ecalConditions; + + Map < Integer,Integer > LedTopMap; //chid (conditions) --> LED id + Map < Integer,Integer > LedBotMap; //chid (conditions) --> LED id + + Map < Integer,Integer > LedTopMapInverted; //LED id --> chid (conditions) + Map < Integer,Integer > LedBotMapInverted; //LED id --> chid (conditions) + + private boolean useRawEnergy=false; + + String outFileName; + + + private int runNumber = 0; + private int eventN = 0; + private int id,row,column,chid,ledId,driverId; + private int[][] expectedSequence = new int[][]{ /*A.C. it is a terrible thing to have this hard-coded here!*/ + //first 4 are the flasher1 sequence, TOP controller + {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,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,-1,-1}, + {56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111}, + {112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,-1}, //missing 135 is ok + {168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223}, + //second 4 are the flasher2 sequence, BOTTOM controller + {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,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,-1,-1}, + {56,57,58,59,60,61,62,63,64,65,66,67,68,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,-1}, //missing 69 is OK + {112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167}, + {168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223}, + }; + private int[][] actualSequence=new int[nDrivers][nSteps]; + + private int[] iStep = new int[nDrivers]; + private int[] nEvents = new int[NUM_CHANNELS]; + private double[] mMean = new double[NUM_CHANNELS]; + private double[] mRMS = new double[NUM_CHANNELS]; + + private int nEventsMin=200; + private int nMinChannelsWithEvents=350; + private double energy,fillEnergy,fillTime; + private double energyCut=2; //we expect very high energy from the LEDs.. + private double skipInitial=0.05; + private double skipMin=0.3; + private long cellID; + + + + + //Histograms-functions-ntuples + private ArrayList<ITuple> iTuple; + + private IFunction fFunction,fFunction1; + private IProfile1D cProfile; + private IHistogram2D hMeanCharge2D; + private ArrayList<IHistogram1D> hCharge; + private ArrayList<IHistogram2D> hChargeVsEvn; + private IPlotterFactory factory; + private IPlotter pPlotter=null; + private IPlotter pPlotter2=null; + private IPlotterStyle style ; + private int[] fitStatus = new int[NUM_CHANNELS]; + + private boolean doFullAnalysis=false; + private boolean isMonitoringApp=false; + private boolean saveTuple=false; + + private double[] fPars; + private double[] fPrevPars; + private double[] fParErrs; + private String[] fParNames; + + + private double fEvnMinDraw=0.; + private double fEvnMaxDraw=80000.; + private double fChargeMinDraw=0.; + private double fChargeMaxDraw=100.; + + /*Components for user interaction*/ + private JDialog dialog; + private JLabel label; + private JFrame frame; + private JPanel panel; + String labelString; + private JButton okButtonRed,okButtonBlue,cancelButton; + private int m_iteration=0; + private LedColor m_ret=LedColor.UNKNOWN; //use UNKNONW as CANCEL button + static Object modalMonitor = new Object(); + + public void setUseRawEnergy(boolean useRawEnergy) { + this.useRawEnergy=useRawEnergy; + } + + public void setEnergyCut(double energyCut) { + this.energyCut=energyCut; + } + public void setSkipInitial(double skipInitial) { + this.skipInitial=skipInitial; + } + public void setSkipMin(double skipMin) { + this.skipMin=skipMin; + } + + public void setEvnMinDraw(double evnMinDraw){ + this.fEvnMinDraw=evnMinDraw; + } + public void setEvnMaxDraw(double evnMaxDraw){ + this.fEvnMaxDraw=evnMaxDraw; + } + public void setChargeMinDraw(double chargeMinDraw){ + this.fChargeMinDraw=chargeMinDraw; + } + public void setChargeMaxDraw(double chargeMaxDraw){ + this.fChargeMaxDraw=chargeMaxDraw; + } + + public void setNEventsMin(int nEeventsMin){ + this.nEventsMin=nEventsMin; + } + + public void setIsMonitoringApp(boolean app){ + this.isMonitoringApp=app; + } + + public void setDoFullAnalysis(boolean fullAnalysis){ + this.doFullAnalysis=fullAnalysis; + } + + public void setSaveTuple(boolean flag){ + this.saveTuple=flag; + } + + @Override + protected void detectorChanged(Detector detector) { + System.out.println("LedAnalysis::Detector changed was called"); + System.out.println(fEvnMinDraw+" "+fEvnMaxDraw); + for (int ii=0;ii<nDrivers;ii++){ + iStep[ii]=0; + // actualSequence[ii][iStep[ii]]=-1; + } + + // Setup conditions + + conditionsManager = DatabaseConditionsManager.getInstance(); + + LedTopMap = new HashMap< Integer , Integer >(); //key: ecal channel ID. Value: led id + LedBotMap = new HashMap< Integer , Integer >(); + + LedTopMapInverted = new HashMap< Integer , Integer >(); //key: led id. Value: ecal channel id + LedBotMapInverted = new HashMap< Integer , Integer >(); + + + ChannelCollection = conditionsManager.getCachedConditions(EcalChannelCollection.class, "ecal_channels").getCachedData(); + LedCollection = conditionsManager.getCachedConditions(EcalLedCollection.class, "ecal_leds").getCachedData(); + ecalConditions = conditionsManager.getEcalConditions(); + + for (EcalChannel channel : ChannelCollection){ + chid = channel.getChannelId(); + for (EcalLed Led : LedCollection) { + if (Led.getEcalChannelId()==chid){ + if (channel.getY()>0){ + LedTopMap.put( chid , Led.getLedNumber() ); + LedTopMapInverted.put( Led.getLedNumber(), chid ); + } + else if (channel.getY()<0){ + LedBotMap.put( chid , Led.getLedNumber() ); + LedBotMapInverted.put( Led.getLedNumber(), chid ); + } + } + } + } + + + + // Setup plots + aida = AIDA.defaultInstance(); + aida.tree().cd("/"); + hMeanCharge2D = aida.histogram2D("Average LED response", 47, -23.5, 23.5, 11, -5.5, 5.5); + + factory= aida.analysisFactory().createPlotterFactory("Ecal Led Sequence"); + pPlotter= factory.create("Drivers"); + pPlotter.createRegions(4,2); + if (isMonitoringApp){ + pPlotter2=factory.create("Sequence Map"); + pPlotter2.createRegions(1,1); + pPlotter2.region(0).plot(hMeanCharge2D); + } + iTuple = new ArrayList<ITuple>(NUM_CHANNELS); + hCharge = new ArrayList<IHistogram1D>(NUM_CHANNELS); + hChargeVsEvn = new ArrayList<IHistogram2D>(nDrivers); + + + + //pPlotter2.region(0).plot(hMeanCharge2D); + + for (int ii=0;ii<NUM_CHANNELS;ii++){ + int row = EcalMonitoringUtilities.getRowFromHistoID(ii); + int column = EcalMonitoringUtilities.getColumnFromHistoID(ii); + iTuple.add(aida.analysisFactory().createTupleFactory(aida.tree()).create("nTuple"+ii,"nTuple"+ii,"int fEvn=0 , double fCharge=0.,double fTime=0.","")); + } + + for (int ii=0;ii<nDrivers;ii++){ + hChargeVsEvn.add(aida.histogram2D("Driver"+ii,100,fEvnMinDraw,fEvnMaxDraw,100,fChargeMinDraw,fChargeMaxDraw)); + pPlotter.region(ii).plot( hChargeVsEvn.get(ii)); + } + + pPlotter.show(); + if (isMonitoringApp) pPlotter2.show(); + + } + + @Override + public void process(EventHeader event) { + runNumber = event.getRunNumber(); + eventN++; + if (event.hasCollection(CalorimeterHit.class, inputCollection)) { + //List<BassRawCalorimeterHit> hits = event.get(BaseRawCalorimeterHit.class, inputCollectionRaw); + List<CalorimeterHit> hits = event.get(CalorimeterHit.class, inputCollection); + for (CalorimeterHit hit : hits) { + + column = hit.getIdentifierFieldValue("ix"); + row = hit.getIdentifierFieldValue("iy"); + id = EcalMonitoringUtilities.getHistoIDFromRowColumn(row, column); + cellID=hit.getCellID(); + chid = ChannelCollection.findGeometric(cellID).getChannelId(); + + energy = hit.getCorrectedEnergy(); + + if (useRawEnergy){ + fillEnergy = getRawADCSum(energy,cellID); + } + else { + fillEnergy = energy; + } + fillTime = hit.getTime(); + + + //find the LED + if (row>0){ + ledId=LedTopMap.get(chid); + } + else if (row<0){ + ledId=LedBotMap.get(chid); + } + driverId=getDriver(ledId); + if (row<0) driverId+=4; + + + + /*Skip the events under thr*/ + if (energy<energyCut) continue; + + /*First, check if this led is the one in the NEXT step. Therefore, increment by 1 the step*/ + /* + * if (iStep[driverId]==0){ + + actualSequence[driverId][iStep[driverId]]=ledId; + iStep[driverId]=1; + } + else if ((iStep[driverId]==1)&&(ledId!=actualSequence[driverId][0])){ + System.out.println("LedAnalysis:: increment step ("+iStep[driverId]+") for driver "+driverId+" . Led ID: "+ledId+" Column: "+column+" Row: "+row); + if (iStep[driverId]>0) drawProfiles(actualSequence[driverId][iStep[driverId]-1],driverId); + actualSequence[driverId][iStep[driverId]]=ledId; + iStep[driverId]++; + } + else if ((iStep[driverId]>1)&&(ledId!=actualSequence[driverId][iStep[driverId]-1])&&(ledId!=actualSequence[driverId][iStep[driverId]-2])){ + System.out.println("LedAnalysis:: increment step ("+iStep[driverId]+") for driver "+driverId+" . Led ID: "+ledId+" Column: "+column+" Row: "+row); + if (iStep[driverId]>0) drawProfiles(actualSequence[driverId][iStep[driverId]-1],driverId); + actualSequence[driverId][iStep[driverId]]=ledId; + iStep[driverId]++; + } + + + // if (iStep[driverId]==-1) continue; + + */ + + if (iStep[driverId]==-1) continue; /*Not yet data*/ + + /*Put this code here, since we want to always fill the ntuple*/ + iTuple.get(id).fill(0,nEvents[id]); + iTuple.get(id).fill(1,fillEnergy); + iTuple.get(id).fill(2,fillTime); + iTuple.get(id).addRow(); + nEvents[id]++; + + + + /*Add a debug print */ + if (eventN % 10000==0){ + System.out.println("Debug. Event "+eventN+" LED ID: "+ledId+" DRIVER ID: "+driverId+" ECAL ID: "+id+" ROW: "+row+" COLUMN: "+column+ "HISTO ID: "+id); + } + } + if (eventN % 10000==0){ + System.out.println("\n"); + } + } + } + + /* + * The endOfData() method analises each ntuple to find the LED response. + * We cannot simply fit a gaussian to the energy distribution, since there is a high-energy tail due to the LED being turned on: + * When the LED turns on, it is "cold", and emits more light. Immediately, it starts to heat, and due to temperature effects the + * emitted light is less. This is clearly visible if one plots the charge VS the event number: the trend is decreasing, toward a + * plateau, that corresponds to the value at thermal equilibrium. + * + * For (few) channels, the first charge values are close to 0, then charge grows rapidly, then it returns back to the plateau. + * To handle these, I always cut the first 10% events + * To properly handle this: + * + * 1) First create a profile histogram, charge VS event number. + * 2) Fit it with something like "A*exp(-event_number/N0)+C. The function does not need to be extra-accurate at this stage + * 3) Cut the events with event_number < 5*N0. + * 4) Fit the remaining events with a gaussian. + */ + @Override + public void endOfData() { + System.out.println("LedAnalysis::end of data"); + System.out.println("LedAnalysis:: nEventsMin is: "+nEventsMin); + + double e,eMin,eMax; + double t; + int n,nBins,nSkip; + + int row, column; + + String hName; + IFunctionFactory fFactory=aida.analysisFactory().createFunctionFactory(aida.tree()); + + IFitResult fResult; + IFitter fFitter; + + for (int id = 0; id < 11 * 47; id++) { + + eMin=9999; + eMax=-9999; + row = EcalMonitoringUtilities.getRowFromHistoID(id); + column = EcalMonitoringUtilities.getColumnFromHistoID(id); + System.out.println(""); + System.out.println("Doing channel: X= "+column+" Y= "+row+ "id= "+id); + System.out.println("Number of entries in analysis ntuple: "+iTuple.get(id).rows()); + System.out.println("Number of recognized events: "+nEvents[id]); + /*Create the profile. Create it for all the channels, to keep sync.*/ + nBins=nEvents[id]/100; + if (nBins<=0) nBins=1; + + /*Clear previous*/ + + if (id>0){ + aida.tree().rm("strip"); + aida.tree().rm("fun0"); + aida.tree().rm("fun1"); + } + /*Create the profile.*/ + cProfile=aida.profile1D("strip",nBins,-0.5,nEvents[id]*(1-skipInitial)+0.5); + cProfile.reset(); + /*Create the function for the profile fit and the gaus fit*/ + fFunction=fFactory.createFunctionFromScript("fun0",1,"A*exp(-x[0]/tau)+B","A,tau,B","",null); + fFunction1=fFactory.createFunctionByName("fun1","G"); + + if (EcalMonitoringUtilities.isInHole(row,column)==true){ + System.out.println("Channel X= "+column+" Y= "+row+" is in hole. Skip"); + hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync + System.out.println("In hole, skip"); + continue; + } + else if (nEvents[id]<nEventsMin) { + hCharge.add(aida.histogram1D("charge_"+id,200,0.,1.)); //create here the histogram to keep sync + System.err.println("LedAnalysis:: the channel X= "+column+" Y= "+row+" has not enough events "+nEvents[id]+" "+nEventsMin); + + continue; + } + + //Fill the profile*/ + nSkip=(int)(nEvents[id]*skipInitial); + if (nSkip>iTuple.get(id).rows()){ + System.out.println("Can't skip initial events?"); + nSkip=0; + } + iTuple.get(id).start(); + iTuple.get(id).skip(nSkip); //This is the work-around for those channels with charge starting from 0 and rapidly growing// + n=0; + iTuple.get(id).next(); + while ( iTuple.get(id).next() ){ + e=iTuple.get(id).getDouble(1); + if (e<eMin) eMin=e; + if (e>eMax) eMax=e; + cProfile.fill(1.*n,e); + n++; + } + fFitter=aida.analysisFactory().createFitFactory().createFitter("chi2","","v"); + + if (doFullAnalysis){ + //Init function parameters + double[] initialPars={eMax-eMin,nEvents[id]/10.,eMin}; + if (initialPars[0]<0) initialPars[0]=0; + fFunction.setParameters(initialPars); + + //Do the fit + System.out.println("LedAnalysis:: do profile fit "+id+" "+fFitter.engineName()+" "+fFitter.fitMethodName()); + System.out.println("LedAnalysis:: initial parameters "+initialPars[0]+" "+initialPars[1]+" "+initialPars[2]); + fResult=fFitter.fit(cProfile,fFunction); + fPars = fResult.fittedParameters(); + fParErrs = fResult.errors(); + fParNames = fResult.fittedParameterNames(); + System.out.println("LedAnalysis:: Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf()); + for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){ + System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]); + } + fFunction.setParameters(fPars); + + + //if fit failed, revert to simpler case + if ((fResult.isValid()==false)||Double.isNaN(fParErrs[0])||Double.isNaN(fParErrs[1])||Double.isNaN(fParErrs[2])){ + System.out.println("LedAnalysis:: fit failed. Reverting to simpler case"); + nSkip=(int)(nEvents[id]*(skipMin+skipInitial)); + } + else{ + //Now we have the tau parameter. Take ONLY the events that are with N>5*tau/ + //As a cross-check, also verify that tau > Nevents/10, otherwise skip the first Nevents/2 + //and emit warning + nSkip=(int)( fPars[1]*5); + if (nSkip < (nEvents[id]*skipMin)){ + System.out.println("LedAnalysis:: Skip number too low: "+nSkip+" Increment it to "+nEvents[id]/2); + nSkip=(int)(nEvents[id]*(skipMin+skipInitial)); + } + if (nSkip > nEvents[id]){ + System.out.println("LedAnalysis:: Skip number too high, reduce it"); + nSkip=(int)(nEvents[id]*(skipMin+skipInitial)); + } + } + } + else{ + nSkip=(int)(nEvents[id]*(skipMin+skipInitial)); + } + + System.out.println("LedAnalysis:: gaus fit :: Going to skip "+nSkip+" out of "+nEvents[id]); + System.out.println("eMin is: "+eMin+" eMax is: "+eMax); + hCharge.add(aida.histogram1D("charge_"+id,200,eMin*0.9,eMax*1.1)); + + + iTuple.get(id).start(); + iTuple.get(id).skip(nSkip); + n=0; + while (iTuple.get(id).next()){ + e=iTuple.get(id).getDouble(1); + t=iTuple.get(id).getDouble(2); + hCharge.get(id).fill(e); + n++; + } + + /*Finally do the fit with the gaussian*/ + double[] initialPars1={hCharge.get(id).maxBinHeight(),hCharge.get(id).mean(),hCharge.get(id).rms()}; + + System.out.println("LedAnalysis:: Gaus fit"); + System.out.println("LedAnalysis:: initial parameters "+initialPars1[0]+" "+initialPars1[1]+" "+initialPars1[2]); + + fFunction1.setParameters(initialPars1); + fResult=fFitter.fit(hCharge.get(id),fFunction1); + fPars = fResult.fittedParameters(); + fParErrs = fResult.errors(); + fParNames = fResult.fittedParameterNames(); + System.out.println("Status= "+fResult.fitStatus()+" "+fResult.isValid()+" Chi2 = "+fResult.quality()+" NDF: "+fResult.ndf()); + for(int i=0; i< fResult.fittedFunction().numberOfParameters(); i++ ){ + System.out.println(fParNames[i]+" : "+fPars[i]+" +- "+fParErrs[i]); + } + fFunction1.setParameters(fPars); + mMean[id]=fPars[1]; + mRMS[id]=fPars[2]; + + hMeanCharge2D.fill(column,row,mMean[id]); + System.out.println("\n"); + }//End loop on channels + + + + if ((pPlotter2!=null)&&(isMonitoringApp)){ + style = pPlotter2.region(0).style(); + style.setParameter("hist2DStyle", "colorMap"); + style.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); + style.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString()); + pPlotter2.region(0).plot(hMeanCharge2D); + pPlotter2.region(0).refresh(); + } + else{ + IPlotterStyle pstyle = aida.analysisFactory().createPlotterFactory().createPlotterStyle(); + pPlotter2 = null; + pPlotter2 = aida.analysisFactory().createPlotterFactory().create(); + pstyle.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); + pstyle.dataStyle().fillStyle().setParameter("showZeroHeightBins", Boolean.FALSE.toString()); + pstyle.setParameter("hist2DStyle", "colorMap"); + if (pPlotter2!=null){ + pPlotter2.createRegion().plot(hMeanCharge2D,pstyle); + pPlotter2.show(); + } + } + + if (isMonitoringApp){ + askUploadToDBDialog(); + synchronized (modalMonitor) { + try{ + modalMonitor.wait(60000); //wait 1 minute for user interaction. + } + catch(InterruptedException excp){ + System.out.println("Got exception: "+excp); + } + } + if ((m_ret!=LedColor.UNKNOWN)){ + if (m_ret==LedColor.BLUE) System.out.println("OK, upload to DB BLUE"); + else System.out.println("OK, upload to DB RED"); + try { + uploadToDB(m_ret); + } catch (SQLException | DatabaseObjectException | ConditionsObjectException error) { + throw new RuntimeException("Error uploading to the database ", error); + } + + System.out.println("Save an Elog too"); + uploadToElog(); + } + else{ + System.out.println("Cancel pressed. Nothing to do"); + } + } + + /*Write a file with the LED values*/ + try { + if (useRawEnergy){ + outFileName=runNumber+".raw.txt"; + } + else{ + outFileName=runNumber+".energy.txt"; + } + PrintWriter writer = new PrintWriter(outFileName, "UTF-8"); + + for (int cid = 1; cid <= 442; cid++) {/*This is a loop over the channel ID, as in the conditions system*/ + EcalChannel cc = findChannel(cid); + column = cc.getX(); //This is the column + row = cc.getY(); //This is the row + id=EcalMonitoringUtilities.getHistoIDFromRowColumn(row,column); + row = EcalMonitoringUtilities.getRowFromHistoID(id); + column = EcalMonitoringUtilities.getColumnFromHistoID(id); + if (EcalMonitoringUtilities.isInHole(row, column)) continue; + if ((row == 0) || (column == 0)) continue; + + writer.print(cid+" "+column+" "+row+" "+" "+ mMean[id]+" "+mRMS[id]+"\r\n"); + + } + writer.close(); + + } + catch (FileNotFoundException fnfe) { + + System.out.println(fnfe.getMessage()); + + } + + catch (IOException ioe) { + + System.out.println(ioe.getMessage()); + + } + + + System.out.println("EcalLedSequenceMonitor endOfData clear histograms"); + for(int ii = 0; ii < NUM_CHANNELS; ii++) { + row=EcalMonitoringUtilities.getRowFromHistoID(ii); + column = EcalMonitoringUtilities.getColumnFromHistoID(ii); + hName="charge_"+ii; + try{ + aida.tree().rm(hName); + } + catch(IllegalArgumentException ee){ + System.out.println("Got exception "+ee); + } + + if (!saveTuple||(isMonitoringApp)){ + hName="nTuple"+ii; + try{ + aida.tree().rm(hName); + } + catch(IllegalArgumentException ee){ + System.out.println("Got exception "+ee); + } + } + } + System.out.println("EcalLedSequenceMonitor endOfData clear histograms done"); + System.out.println("endOfData end"); + System.out.println("The program is not stucked. It is writing the output AIDA file, this takes time!"); + }/*End endOfData*/ + + + /** + * This function returns the driver number (from 0 to 3) given the LED id. + * @param led + * @return + */ + public int getDriver(int led){ + int ret=-1; + if ((led>=2)&&(led<56)) ret=0; + else if ((led>=56)&&(led<112)) ret=1; + else if ((led>=112)&&(led<168)) ret=2; + else if ((led>=168)&&(led<224)) ret=3; + return ret; + } + + /** + * Very simple method to retrieve the pedestal-subtracted raw Energy. + * If the gain changes (because we do a re-calibration), I do not want to include this in the LED analysis + * @param energy + * @param cellID + * @return + */ + public double getRawADCSum(double energy,long cellID){ + EcalChannelConstants channelData = ecalConditions.getChannelConstants(ecalConditions.getChannelCollection().findGeometric(cellID)); + double RawSum=energy / EcalUtils.GeV; + double gain=channelData.getGain().getGain(); + double ret=RawSum/gain; + // System.out.println("A:C "+RawSum+" "+ret); + return ret; + } + + private void uploadToDB(LedColor color) throws DatabaseObjectException, ConditionsObjectException, SQLException { + int x,y,id; + double mean,rms; + System.out.println(String.format("Uploading new led data to the database, runMin=%d, runMax=%d, tag=%s ....", + runNumber,runNumberMax,dbTag)); + + conditionsManager = DatabaseConditionsManager.getInstance(); + EcalLedCalibrationCollection led_calibrations = new EcalLedCalibrationCollection(); + led_calibrations.setConnection(conditionsManager.getConnection()); + + TableMetaData tableMetaData = conditionsManager.findTableMetaData(dbTableName); + led_calibrations.setTableMetaData(tableMetaData); + + for (int cid = 1; cid <= 442; cid++) {/*This is a loop over the channel ID, as in the conditions system*/ + EcalChannel cc = findChannel(cid); + x = cc.getX(); //This is the column + y = cc.getY(); //This is the row + id=EcalMonitoringUtilities.getHistoIDFromRowColumn(y,x); + mean=mMean[id]; + rms=mRMS[id]; + led_calibrations.add(new EcalLedCalibration(cid,mean,rms,color)); + } + + int collectionId = -1; + + try { + collectionId = conditionsManager.getCollectionId(led_calibrations, "loaded by EcalLedSequenceMonitor"); + } catch (Exception e) { + System.out.println("Got exception on uploadToDB "+ e); + throw new RuntimeException(e); + } + System.err.println("CollectionID: "+collectionId); + led_calibrations.insert(); + ConditionsRecord conditionsRecord = new ConditionsRecord( + led_calibrations.getCollectionId(), runNumber, runNumberMax, dbTableName, dbTableName, + "Generated by LedAnalysis from Run #"+runNumber, dbTag); + conditionsRecord.setConnection(conditionsManager.getConnection()); + tableMetaData = conditionsManager.findTableMetaData("conditions"); + conditionsRecord.setTableMetaData(tableMetaData); + conditionsRecord.insert(); + + System.out.println("Upload to DB done"); + } + + private void uploadToElog(){ + String path,exe,command,imgpath; + path="/home/hpsrun/LedSequenceData"; + exe=path+"/doElog.csh"; + imgpath=path+"/screenshots/"+runNumber+".png"; + + File f=new File(path); + if (!f.exists()){ + System.err.println("LedMonitoringSequence:: wrong path"); + return; + } + if (pPlotter2==null){ + System.err.println("LedMonitoringSquence:: no plotter"); + return; + } + try{ + pPlotter2.writeToFile(imgpath); + } + catch(Exception e){ + System.err.println("Exception "+e); + } + File f1=new File(exe); + if (!f1.exists()){ + System.err.println("LedMonitoringSequence:: no script!"); + return; + } + command=exe+" "+imgpath; + try{ + System.out.println("LedMonitoringSequence:: try this command: "+command); + Runtime.getRuntime().exec(command); + } + catch(Exception e){ + System.err.println("Exception "+e); + } + } + + + private void drawProfiles(int ledID,int driverID){ + + int m_column,m_row,m_ledID,m_chID,m_ID,m_driverID; + + m_ledID = ledID; + m_driverID = driverID; + m_chID = 0; + + + if (m_driverID<=3) m_chID = LedTopMapInverted.get(ledID); + else m_chID = LedBotMapInverted.get(ledID); + + m_column=findChannel(m_chID).getX(); + m_row=findChannel(m_chID).getY(); + m_ID=EcalMonitoringUtilities.getHistoIDFromRowColumn(m_row, m_column); + /* System.out.println("Going to draw LED id "+m_ledID+" X= "+m_column+" Y= "+m_row+" driver: "+m_driverID); System.out.println("Ch_ID: "+m_chID); System.out.println("Histo ID:"+m_ID); System.out.println("Events: "+iTuple.get(m_ID).rows()); - */ - hChargeVsEvn.get(m_driverID).reset(); - hChargeVsEvn.get(m_driverID).setTitle("Driver_"+m_driverID+" Led_"+ledID); - IEvaluator evaluatorX = aida.analysisFactory().createTupleFactory(aida.analysisFactory().createTreeFactory().create()).createEvaluator("fEvn"); - IEvaluator evaluatorY = aida.analysisFactory().createTupleFactory(aida.analysisFactory().createTreeFactory().create()).createEvaluator("fCharge"); - - iTuple.get(m_ID).project(hChargeVsEvn.get(m_driverID),evaluatorX,evaluatorY); - - pPlotter.region(m_driverID).clear(); - pPlotter.region(m_driverID).plot(hChargeVsEvn.get(m_driverID)); - pPlotter.region(m_driverID).refresh(); - - } - - private EcalChannel findChannel(int channel_id) { - return ecalConditions.getChannelCollection().findChannel(channel_id); - } - - - private void askUploadToDBDialog(){ - m_ret=LedColor.UNKNOWN; - - okButtonRed = new JButton("Yes, red"); - okButtonBlue = new JButton("Yes, blue"); - cancelButton = new JButton("Cancel"); - labelString = "<html> Update conditions to DB <br> for run: <br> "+runNumber+" - "+runNumberMax+" <br> ???? <br> " - + "Use the monitoring app to look at the map<br>" - + "(Tab LED sequence)<br>" - +"Reply in 60 seconds<br>"+"</html>"; - label = new JLabel( labelString); - - frame = new JFrame("Upload to DB?"); - frame.setSize(500,250); - panel = new JPanel(); - frame.add(panel); - - - // dialog = new JDialog((JFrame)null, "User selection"); - // dialog.setSize(200,200); - // dialog.setLayout(new FlowLayout()); - // dialog.add(label); - // dialog.add(cancelButton); - // dialog.add(okButton); - // dialog.setVisible(true); - //dialog.pack(); - panel.add(label); - panel.add(cancelButton); - panel.add(okButtonBlue); - panel.add(okButtonRed); - - - frame.setVisible(true); - okButtonBlue.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent event) - { - m_ret=LedColor.BLUE; - frame.dispose(); - synchronized(modalMonitor) - { - System.out.println("Blue pressed"); - modalMonitor.notify(); - } - } - } - ); - okButtonRed.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent event) - { - m_ret=LedColor.RED; - frame.dispose(); - synchronized(modalMonitor) - { - System.out.println("Red pressed"); - modalMonitor.notify(); - } - } - } - ); - - cancelButton.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent event) - { - m_ret=LedColor.UNKNOWN; - frame.dispose(); - synchronized(modalMonitor) - { - System.out.println("Cancel pressed"); - modalMonitor.notify(); - } - } - } - ); - - System.out.println("askUploadDB done"); - } + */ + hChargeVsEvn.get(m_driverID).reset(); + hChargeVsEvn.get(m_driverID).setTitle("Driver_"+m_driverID+" Led_"+ledID); + IEvaluator evaluatorX = aida.analysisFactory().createTupleFactory(aida.analysisFactory().createTreeFactory().create()).createEvaluator("fEvn"); + IEvaluator evaluatorY = aida.analysisFactory().createTupleFactory(aida.analysisFactory().createTreeFactory().create()).createEvaluator("fCharge"); + + iTuple.get(m_ID).project(hChargeVsEvn.get(m_driverID),evaluatorX,evaluatorY); + + pPlotter.region(m_driverID).clear(); + pPlotter.region(m_driverID).plot(hChargeVsEvn.get(m_driverID)); + pPlotter.region(m_driverID).refresh(); + + } + + private EcalChannel findChannel(int channel_id) { + return ecalConditions.getChannelCollection().findChannel(channel_id); + } + + + private void askUploadToDBDialog(){ + m_ret=LedColor.UNKNOWN; + + okButtonRed = new JButton("Yes, red"); + okButtonBlue = new JButton("Yes, blue"); + cancelButton = new JButton("Cancel"); + labelString = "<html> Update conditions to DB <br> for run: <br> "+runNumber+" - "+runNumberMax+" <br> ???? <br> " + + "Use the monitoring app to look at the map<br>" + + "(Tab LED sequence)<br>" + +"Reply in 60 seconds<br>"+"</html>"; + label = new JLabel( labelString); + + frame = new JFrame("Upload to DB?"); + frame.setSize(500,250); + panel = new JPanel(); + frame.add(panel); + + + // dialog = new JDialog((JFrame)null, "User selection"); + // dialog.setSize(200,200); + // dialog.setLayout(new FlowLayout()); + // dialog.add(label); + // dialog.add(cancelButton); + // dialog.add(okButton); + // dialog.setVisible(true); + //dialog.pack(); + panel.add(label); + panel.add(cancelButton); + panel.add(okButtonBlue); + panel.add(okButtonRed); + + + frame.setVisible(true); + okButtonBlue.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent event) + { + m_ret=LedColor.BLUE; + frame.dispose(); + synchronized(modalMonitor) + { + System.out.println("Blue pressed"); + modalMonitor.notify(); + } + } + } + ); + okButtonRed.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent event) + { + m_ret=LedColor.RED; + frame.dispose(); + synchronized(modalMonitor) + { + System.out.println("Red pressed"); + modalMonitor.notify(); + } + } + } + ); + + cancelButton.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent event) + { + m_ret=LedColor.UNKNOWN; + frame.dispose(); + synchronized(modalMonitor) + { + System.out.println("Cancel pressed"); + modalMonitor.notify(); + } + } + } + ); + + System.out.println("askUploadDB done"); + } } Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalPedestalViewer.java ============================================================================= --- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalPedestalViewer.java (original) +++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalPedestalViewer.java Wed Mar 9 11:43:24 2016 @@ -33,80 +33,80 @@ // this has to match the one in EcalPedstalCalculator: private String histoNameFormat = "Ecal/Pedestals/Mode7/ped%03d"; - private AIDA aida = AIDA.defaultInstance(); - private IPlotter plotter; - private IPlotterFactory plotterFactory; - private IPlotterStyle pstyle; - private PEventViewer viewer; + private AIDA aida = AIDA.defaultInstance(); + private IPlotter plotter; + private IPlotterFactory plotterFactory; + private IPlotterStyle pstyle; + private PEventViewer viewer; - static final String[] colors={"red","black","blue","green","yellow","pink","cyan","magenta","brown"}; - static final int nRows=3; - static final int nColumns=3; - private int theRegion=0; - - @Override - public void detectorChanged(Detector detector) { - plotterFactory = aida.analysisFactory().createPlotterFactory("ECal Peds"); - plotter = plotterFactory.create("ECal Peds"); - plotter.createRegions(nColumns,nRows); - // Plot dummmy histos, else null plotter regions later: - for (int ii=0; ii<nColumns*nRows; ii++) { - plotter.region(ii).plot(aida.histogram1D("ASDF"+ii,100,11e9,11e11)); - } - plotter.show(); - - pstyle=plotterFactory.createPlotterStyle(); - pstyle.xAxisStyle().labelStyle().setBold(true); - pstyle.yAxisStyle().labelStyle().setBold(true); - pstyle.xAxisStyle().tickLabelStyle().setBold(true); - pstyle.yAxisStyle().tickLabelStyle().setBold(true); - pstyle.xAxisStyle().lineStyle().setColor("black"); - pstyle.yAxisStyle().lineStyle().setColor("black"); - pstyle.xAxisStyle().lineStyle().setThickness(2); - pstyle.yAxisStyle().lineStyle().setThickness(2); - pstyle.dataStyle().errorBarStyle().setThickness(0); - pstyle.legendBoxStyle().setVisible(false); - } - - @Override - public void startOfData() { - File config = new File("ecal-mapping-config.csv"); - if(config.exists() && config.canRead()) { - try { viewer = new PDataEventViewer(config.getAbsolutePath()); } - catch (IOException e) { viewer = new PEventViewer(); } - } else { viewer = new PEventViewer(); } - viewer.addCrystalListener(this); - viewer.setVisible(true); - } - - @Override - public void actionPerformed(ActionEvent ae) { } - - @Override - public void crystalActivated(CrystalEvent e) { } - - @Override - public void crystalDeactivated(CrystalEvent e) { } + static final String[] colors={"red","black","blue","green","yellow","pink","cyan","magenta","brown"}; + static final int nRows=3; + static final int nColumns=3; + private int theRegion=0; + + @Override + public void detectorChanged(Detector detector) { + plotterFactory = aida.analysisFactory().createPlotterFactory("ECal Peds"); + plotter = plotterFactory.create("ECal Peds"); + plotter.createRegions(nColumns,nRows); + // Plot dummmy histos, else null plotter regions later: + for (int ii=0; ii<nColumns*nRows; ii++) { + plotter.region(ii).plot(aida.histogram1D("ASDF"+ii,100,11e9,11e11)); + } + plotter.show(); + + pstyle=plotterFactory.createPlotterStyle(); + pstyle.xAxisStyle().labelStyle().setBold(true); + pstyle.yAxisStyle().labelStyle().setBold(true); + pstyle.xAxisStyle().tickLabelStyle().setBold(true); + pstyle.yAxisStyle().tickLabelStyle().setBold(true); + pstyle.xAxisStyle().lineStyle().setColor("black"); + pstyle.yAxisStyle().lineStyle().setColor("black"); + pstyle.xAxisStyle().lineStyle().setThickness(2); + pstyle.yAxisStyle().lineStyle().setThickness(2); + pstyle.dataStyle().errorBarStyle().setThickness(0); + pstyle.legendBoxStyle().setVisible(false); + } + + @Override + public void startOfData() { + File config = new File("ecal-mapping-config.csv"); + if(config.exists() && config.canRead()) { + try { viewer = new PDataEventViewer(config.getAbsolutePath()); } + catch (IOException e) { viewer = new PEventViewer(); } + } else { viewer = new PEventViewer(); } + viewer.addCrystalListener(this); + viewer.setVisible(true); + } + + @Override + public void actionPerformed(ActionEvent ae) { } + + @Override + public void crystalActivated(CrystalEvent e) { } + + @Override + public void crystalDeactivated(CrystalEvent e) { } - @Override - public void crystalClicked(CrystalEvent e) { - aida.tree().cd("/"); - Point ecalPoint = Viewer.toEcalPoint(e.getCrystalID()); - if (ecalPoint.x == 0 || ecalPoint.y == 0) return; - if (EcalMonitoringUtilities.isInHole(ecalPoint.y,ecalPoint.x)) return; - final int cid=EcalMonitoringUtilities.getChannelIdFromRowColumn(ecalPoint.y,ecalPoint.x); - IHistogram1D hist=aida.histogram1D(String.format(histoNameFormat,cid)); - if (hist==null) { - System.err.println("Running the Driver?"); - } else { - hist.setTitle(String.format("(%d,%d)",ecalPoint.x,ecalPoint.y)); + @Override + public void crystalClicked(CrystalEvent e) { + aida.tree().cd("/"); + Point ecalPoint = Viewer.toEcalPoint(e.getCrystalID()); + if (ecalPoint.x == 0 || ecalPoint.y == 0) return; + if (EcalMonitoringUtilities.isInHole(ecalPoint.y,ecalPoint.x)) return; + final int cid=EcalMonitoringUtilities.getChannelIdFromRowColumn(ecalPoint.y,ecalPoint.x); + IHistogram1D hist=aida.histogram1D(String.format(histoNameFormat,cid)); + if (hist==null) { + System.err.println("Running the Driver?"); + } else { + hist.setTitle(String.format("(%d,%d)",ecalPoint.x,ecalPoint.y)); pstyle.dataStyle().lineStyle().setParameter("color", colors[theRegion%colors.length]); - plotter.region(theRegion).clear(); - plotter.region(theRegion).plot(hist,pstyle); - plotter.region(theRegion).refresh(); - theRegion=(theRegion+1)%(nColumns*nRows); - } - } - - + plotter.region(theRegion).clear(); + plotter.region(theRegion).plot(hist,pstyle); + plotter.region(theRegion).refresh(); + theRegion=(theRegion+1)%(nColumns*nRows); + } + } + + } Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalWindowPlotsXY.java ============================================================================= --- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalWindowPlotsXY.java (original) +++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/ecal/plots/EcalWindowPlotsXY.java Wed Mar 9 11:43:24 2016 @@ -93,7 +93,7 @@ } private void setupPlots() { - System.out.println("ECAL WINDOW PLOTS START"); + System.out.println("ECAL WINDOW PLOTS START"); //if (plotterFrame != null) { // plotterFrame.dispose(); //} @@ -108,8 +108,8 @@ IPlotterStyle pstyle = plotter.style(); pstyle.dataStyle().errorBarStyle().setVisible(false); plotter.createRegions(1,1); - windowPlot1 = aida.histogram1D(detector.getDetectorName() + " : " + inputCollection + " : dummy", 1, -0.5, 1 - 0.5); - plotter.region(0).plot(windowPlot1); + windowPlot1 = aida.histogram1D(detector.getDetectorName() + " : " + inputCollection + " : dummy", 1, -0.5, 1 - 0.5); + plotter.region(0).plot(windowPlot1); plotter.show(); } @@ -126,15 +126,15 @@ dec.setID(hit.getCellID()); int x = dec.getValue("ix"); int y = dec.getValue("iy"); -// System.out.println("got hit: x= " + x + ", y= " + y); +// System.out.println("got hit: x= " + x + ", y= " + y); if (isFirst) { - System.out.println("FIRST!!!"); + System.out.println("FIRST!!!"); isFirst=false; - window=hit.getADCValues().length; - windowPlot = aida.histogram1D(detector.getDetectorName() + " : " + inputCollection + " : Window Mode Data", window, -0.5, window - 0.5); - plotter.region(0).clear(); - plotter.region(0).plot(windowPlot); - plotter.region(0).refresh(); + window=hit.getADCValues().length; + windowPlot = aida.histogram1D(detector.getDetectorName() + " : " + inputCollection + " : Window Mode Data", window, -0.5, window - 0.5); + plotter.region(0).clear(); + plotter.region(0).plot(windowPlot); + plotter.region(0).refresh(); } if (testX && x != plotX) { Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/AbstractTablePanel.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/AbstractTablePanel.java (original) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/AbstractTablePanel.java Wed Mar 9 11:43:24 2016 @@ -26,224 +26,224 @@ * @see DiagnosticUpdatable */ public abstract class AbstractTablePanel extends JPanel implements DiagnosticUpdatable { - // Static variables. - private static final long serialVersionUID = 0L; - public static final int ORIENTATION_HORIZONTAL = 0; - public static final int ORIENTATION_VERTICAL = 1; - - // Components. - private JLabel localHeader; - private JLabel globalHeader; - protected final JTable localTable; - protected final JTable globalTable; - - // Component parameters. - private boolean horizontal = true; - private Dimension userPrefSize = null; - private Dimension defaultPrefSize = new Dimension(0, 0); - - /** - * Instantiates an <code>AbstractTablePanel</code>. - * @param args Arguments to be used when generating the panel tables. - */ - public AbstractTablePanel(Object... args) { - // Initialize the tables. - JTable[] tables = initializeTables(args); - localTable = tables[0]; - globalTable = tables[1]; - add(globalTable); - add(localTable); - - // Set the panels to their null starting values. - updatePanel(null, null); - - // Define the panel layout. - setLayout(null); - - // Create header labels for the tables. - localHeader = new JLabel("Instantaneous Statistics"); - localHeader.setHorizontalAlignment(JLabel.CENTER); - add(localHeader); - - globalHeader = new JLabel("Run Statistics"); - globalHeader.setHorizontalAlignment(JLabel.CENTER); - add(globalHeader); - - // Track when the component changes size and reposition the - // components accordingly. - addComponentListener(new ComponentAdapter() { - @Override - public void componentResized(ComponentEvent e) { positionComponents(); } - }); - - // Define the component preferred size. - defaultPrefSize.width = localTable.getPreferredSize().width + - ComponentUtils.hinternal + globalTable.getPreferredSize().width; - defaultPrefSize.height = localTable.getPreferredSize().height + - ComponentUtils.vinternal + globalTable.getPreferredSize().height; - } - - @Override - public Dimension getPreferredSize() { - // If there is a user-specified preferred size, return that. - if(userPrefSize == null) { return defaultPrefSize; } - - // Otherwise, return the default calculated preferred size. - else { return userPrefSize; } - } - - @Override - public void setBackground(Color bg) { - // Set the base component background. - super.setBackground(bg); - - // If the components have been initialized, pass the background - // color change to them as appropriate. Note that the tables - // will always retain the same background color. - if(localTable != null) { - // Set the header backgrounds. - localHeader.setBackground(bg); - globalHeader.setBackground(bg); - } - } - - @Override - public void setFont(Font font) { - // Set the base component font. - super.setFont(font); - - // If the components have been initialized, pass the font change - // to them as appropriate. - if(localTable != null) { - // Set the table fonts. - localTable.setFont(font); - globalTable.setFont(font); - - // Set the header fonts. - Font headerFont = font.deriveFont(Font.BOLD, (float) Math.ceil(font.getSize2D() * 1.3)); - localHeader.setFont(headerFont); - globalHeader.setFont(headerFont); - } - } - - @Override - public void setForeground(Color fg) { - // Set the base component foreground. - super.setForeground(fg); - - // If the components have been initialized, pass the foreground - // color change to them as appropriate. Note that the tables - // will always retain the same foreground color. - if(localTable != null) { - // Set the header foregrounds. - localHeader.setForeground(fg); - globalHeader.setForeground(fg); - } - } - - /** - * Sets the orientation of components on the panel. - * @param orientation - The orientation identifier. Identifiers can - * be obtained as static variables from the within the root object - * <code>AbstractTable</code>. - */ - public void setOrientation(int orientation) { - if(orientation == ORIENTATION_HORIZONTAL) { - if(!horizontal) { - horizontal = true; - positionComponents(); - } - } else if(orientation == ORIENTATION_VERTICAL) { - if(horizontal) { - horizontal = false; - positionComponents(); - } - } else { - throw new IllegalArgumentException("Invalid orienation identifier."); - } - } - - @Override - public void setPreferredSize(Dimension preferredSize) { - userPrefSize = preferredSize; - } - - /** - * Generates the two tables that are used by the component. This - * must return an array of size two. - * @param args - Any arguments that should be passed to the method - * for generating tables. - * @return Returns an array of size two, where the first index must - * contain the local table and the second index the global table. - */ - protected abstract JTable[] initializeTables(Object... args); - - /** - * Repositions the components to the correct places on the parent - * <code>JPanel</code>. This should be run whenever the panel - * changes size. - */ - private void positionComponents() { - // Do not update if the components have not been initialized. - if(localHeader == null) { return; } - - // If the components should be position horizontally... - if(horizontal) { - // The local components get the left half of the panel and the - // global components the right. Find half of the panel width, - // accounting for the internal spacing. This is an internal - // component, so it does not employ additional spacing between - // itself and the parent component's edges. - int compWidth = (getWidth() - 10) / 2; - - // If there is any width remaining, it goes to the spacing. - int horizontal = ComponentUtils.hinternal + (getWidth() - 10) % 2; - - // Place the header labels. These are given their preferred - // height. Note that this means a very small panel may cut off - // some of the components. First, get the preferred height of - // the label with the larger preferred height. These should be - // the same thing, but just in case... - int labelHeight = localHeader.getPreferredSize().height; - if(labelHeight < globalHeader.getPreferredSize().height) { - labelHeight = globalHeader.getPreferredSize().height; - } - - // Set the label sizes and positions. - localHeader.setBounds(0, 0, compWidth, labelHeight); - globalHeader.setLocation(ComponentUtils.getNextX(localHeader, horizontal), 0); - globalHeader.setSize(compWidth, labelHeight); - - // The tables go under their respective labels and should fill - // the remainder of the label height. - int tableY = ComponentUtils.getNextY(localHeader, ComponentUtils.vinternal); - localTable.setBounds(0, tableY, compWidth, localTable.getPreferredSize().height); - globalTable.setBounds(globalHeader.getX(), tableY, compWidth, globalTable.getPreferredSize().height); - } - - // Otherwise, position them vertically. - else { - // Place the header labels. These are given their preferred - // height. Note that this means a very small panel may cut off - // some of the components. First, get the preferred height of - // the label with the larger preferred height. These should be - // the same thing, but just in case... - int labelHeight = localHeader.getPreferredSize().height; - if(labelHeight < globalHeader.getPreferredSize().height) { - labelHeight = globalHeader.getPreferredSize().height; - } - - // The local components go first, taking up the entire upper - // width of the panel. - localHeader.setBounds(0, 0, getWidth(), labelHeight); - localTable.setBounds(0, ComponentUtils.getNextY(localHeader, ComponentUtils.vinternal), - getWidth(), localTable.getPreferredSize().height); - - // The global components go immediately below. - globalHeader.setBounds(0, ComponentUtils.getNextY(localTable, ComponentUtils.vinternal), - getWidth(), labelHeight); - globalTable.setBounds(0, ComponentUtils.getNextY(globalHeader, ComponentUtils.vinternal), - getWidth(), globalTable.getPreferredSize().height); - } - } + // Static variables. + private static final long serialVersionUID = 0L; + public static final int ORIENTATION_HORIZONTAL = 0; + public static final int ORIENTATION_VERTICAL = 1; + + // Components. + private JLabel localHeader; + private JLabel globalHeader; + protected final JTable localTable; + protected final JTable globalTable; + + // Component parameters. + private boolean horizontal = true; + private Dimension userPrefSize = null; + private Dimension defaultPrefSize = new Dimension(0, 0); + + /** + * Instantiates an <code>AbstractTablePanel</code>. + * @param args Arguments to be used when generating the panel tables. + */ + public AbstractTablePanel(Object... args) { + // Initialize the tables. + JTable[] tables = initializeTables(args); + localTable = tables[0]; + globalTable = tables[1]; + add(globalTable); + add(localTable); + + // Set the panels to their null starting values. + updatePanel(null, null); + + // Define the panel layout. + setLayout(null); + + // Create header labels for the tables. + localHeader = new JLabel("Instantaneous Statistics"); + localHeader.setHorizontalAlignment(JLabel.CENTER); + add(localHeader); + + globalHeader = new JLabel("Run Statistics"); + globalHeader.setHorizontalAlignment(JLabel.CENTER); + add(globalHeader); + + // Track when the component changes size and reposition the + // components accordingly. + addComponentListener(new ComponentAdapter() { + @Override + public void componentResized(ComponentEvent e) { positionComponents(); } + }); + + // Define the component preferred size. + defaultPrefSize.width = localTable.getPreferredSize().width + + ComponentUtils.hinternal + globalTable.getPreferredSize().width; + defaultPrefSize.height = localTable.getPreferredSize().height + + ComponentUtils.vinternal + globalTable.getPreferredSize().height; + } + + @Override + public Dimension getPreferredSize() { + // If there is a user-specified preferred size, return that. + if(userPrefSize == null) { return defaultPrefSize; } + + // Otherwise, return the default calculated preferred size. + else { return userPrefSize; } + } + + @Override + public void setBackground(Color bg) { + // Set the base component background. + super.setBackground(bg); + + // If the components have been initialized, pass the background + // color change to them as appropriate. Note that the tables + // will always retain the same background color. + if(localTable != null) { + // Set the header backgrounds. + localHeader.setBackground(bg); + globalHeader.setBackground(bg); + } + } + + @Override + public void setFont(Font font) { + // Set the base component font. + super.setFont(font); + + // If the components have been initialized, pass the font change + // to them as appropriate. + if(localTable != null) { + // Set the table fonts. + localTable.setFont(font); + globalTable.setFont(font); + + // Set the header fonts. + Font headerFont = font.deriveFont(Font.BOLD, (float) Math.ceil(font.getSize2D() * 1.3)); + localHeader.setFont(headerFont); + globalHeader.setFont(headerFont); + } + } + + @Override + public void setForeground(Color fg) { + // Set the base component foreground. + super.setForeground(fg); + + // If the components have been initialized, pass the foreground + // color change to them as appropriate. Note that the tables + // will always retain the same foreground color. + if(localTable != null) { + // Set the header foregrounds. + localHeader.setForeground(fg); + globalHeader.setForeground(fg); + } + } + + /** + * Sets the orientation of components on the panel. + * @param orientation - The orientation identifier. Identifiers can + * be obtained as static variables from the within the root object + * <code>AbstractTable</code>. + */ + public void setOrientation(int orientation) { + if(orientation == ORIENTATION_HORIZONTAL) { + if(!horizontal) { + horizontal = true; + positionComponents(); + } + } else if(orientation == ORIENTATION_VERTICAL) { + if(horizontal) { + horizontal = false; + positionComponents(); + } + } else { + throw new IllegalArgumentException("Invalid orienation identifier."); + } + } + + @Override + public void setPreferredSize(Dimension preferredSize) { + userPrefSize = preferredSize; + } + + /** + * Generates the two tables that are used by the component. This + * must return an array of size two. + * @param args - Any arguments that should be passed to the method + * for generating tables. + * @return Returns an array of size two, where the first index must + * contain the local table and the second index the global table. + */ + protected abstract JTable[] initializeTables(Object... args); + + /** + * Repositions the components to the correct places on the parent + * <code>JPanel</code>. This should be run whenever the panel + * changes size. + */ + private void positionComponents() { + // Do not update if the components have not been initialized. + if(localHeader == null) { return; } + + // If the components should be position horizontally... + if(horizontal) { + // The local components get the left half of the panel and the + // global components the right. Find half of the panel width, + // accounting for the internal spacing. This is an internal + // component, so it does not employ additional spacing between + // itself and the parent component's edges. + int compWidth = (getWidth() - 10) / 2; + + // If there is any width remaining, it goes to the spacing. + int horizontal = ComponentUtils.hinternal + (getWidth() - 10) % 2; + + // Place the header labels. These are given their preferred + // height. Note that this means a very small panel may cut off + // some of the components. First, get the preferred height of + // the label with the larger preferred height. These should be + // the same thing, but just in case... + int labelHeight = localHeader.getPreferredSize().height; + if(labelHeight < globalHeader.getPreferredSize().height) { + labelHeight = globalHeader.getPreferredSize().height; + } + + // Set the label sizes and positions. + localHeader.setBounds(0, 0, compWidth, labelHeight); + globalHeader.setLocation(ComponentUtils.getNextX(localHeader, horizontal), 0); + globalHeader.setSize(compWidth, labelHeight); + + // The tables go under their respective labels and should fill + // the remainder of the label height. + int tableY = ComponentUtils.getNextY(localHeader, ComponentUtils.vinternal); + localTable.setBounds(0, tableY, compWidth, localTable.getPreferredSize().height); + globalTable.setBounds(globalHeader.getX(), tableY, compWidth, globalTable.getPreferredSize().height); + } + + // Otherwise, position them vertically. + else { + // Place the header labels. These are given their preferred + // height. Note that this means a very small panel may cut off + // some of the components. First, get the preferred height of + // the label with the larger preferred height. These should be + // the same thing, but just in case... + int labelHeight = localHeader.getPreferredSize().height; + if(labelHeight < globalHeader.getPreferredSize().height) { + labelHeight = globalHeader.getPreferredSize().height; + } + + // The local components go first, taking up the entire upper + // width of the panel. + localHeader.setBounds(0, 0, getWidth(), labelHeight); + localTable.setBounds(0, ComponentUtils.getNextY(localHeader, ComponentUtils.vinternal), + getWidth(), localTable.getPreferredSize().height); + + // The global components go immediately below. + globalHeader.setBounds(0, ComponentUtils.getNextY(localTable, ComponentUtils.vinternal), + getWidth(), labelHeight); + globalTable.setBounds(0, ComponentUtils.getNextY(globalHeader, ComponentUtils.vinternal), + getWidth(), globalTable.getPreferredSize().height); + } + } } Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/AbstractTriggerTablePanel.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/AbstractTriggerTablePanel.java (original) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/AbstractTriggerTablePanel.java Wed Mar 9 11:43:24 2016 @@ -14,189 +14,189 @@ * @author Kyle McCarty <[log in to unmask]> */ public abstract class AbstractTriggerTablePanel extends AbstractTwoColumnTablePanel { - // Static variables. - private static final long serialVersionUID = 0L; - - // Internal variables. - private final int numCuts; - private final boolean singles; - - // Store reference index variables for local and run values. - private static final int GLOBAL = 0; - private static final int LOCAL = 1; - - // Reference variables to the default table rows. - protected static final int ROW_RECON_COUNT = 0; - protected static final int ROW_SSP_SIM_COUNT = 1; - protected static final int ROW_SSP_BANK_COUNT = 2; - protected static final int ROW_SSP_EFFICIENCY = 3; - protected static final int ROW_TRIGGER_EFFICIENCY = 4; - protected static final int ROW_EMPTY_SPACE = 5; - protected static final int ROW_CUT_FAILS_TITLE = 6; - protected static final int ROW_FIRST_TRIGGER_CUT = 7; - - /** - * Instantiates an <code>AbstractTriggerTablePanel</code> with the - * indicated cut names. - * @param cutNames - */ - public AbstractTriggerTablePanel(String[] cutNames, boolean isSingles) { - // Instantiate the superclass. - super(makeTitle(cutNames)); - - // Store the number of cuts. - numCuts = cutNames.length; - updatePanel(null, null); - - // Store whether this is a singles or pair trigger panel. - singles = isSingles; - } - - @Override - public void updatePanel(DiagnosticSnapshot runSnapshot, DiagnosticSnapshot localSnapshot) { - // If the snapshot is null, all values should be "N/A." - if(runSnapshot == null || localSnapshot == null) { - // Output cluster count data. - String scalerNullValue = "---"; - setLocalRowValue(ROW_RECON_COUNT, scalerNullValue); - setLocalRowValue(ROW_SSP_SIM_COUNT, scalerNullValue); - setLocalRowValue(ROW_SSP_BANK_COUNT, scalerNullValue); - setGlobalRowValue(ROW_RECON_COUNT, scalerNullValue); - setGlobalRowValue(ROW_SSP_SIM_COUNT, scalerNullValue); - setGlobalRowValue(ROW_SSP_BANK_COUNT, scalerNullValue); - - // Output the tracked statistical data. - String percentNullValue = "--- / --- (---%)"; - setLocalRowValue(ROW_SSP_EFFICIENCY, percentNullValue); - setLocalRowValue(ROW_TRIGGER_EFFICIENCY, percentNullValue); - setGlobalRowValue(ROW_SSP_EFFICIENCY, percentNullValue); - setGlobalRowValue(ROW_TRIGGER_EFFICIENCY, percentNullValue); - - int ROW_SECOND_TRIGGER_CUT = ROW_FIRST_TRIGGER_CUT + numCuts + 2; - for(int cutRow = 0; cutRow < numCuts; cutRow++) { - setLocalRowValue(cutRow + ROW_FIRST_TRIGGER_CUT, percentNullValue); - setLocalRowValue(cutRow + ROW_SECOND_TRIGGER_CUT, percentNullValue); - setGlobalRowValue(cutRow + ROW_FIRST_TRIGGER_CUT, percentNullValue); - setGlobalRowValue(cutRow + ROW_SECOND_TRIGGER_CUT, percentNullValue); - } - } else { - // Get the local and run trigger statistics from the snapshot. - DiagnosticSnapshot[] stat = new DiagnosticSnapshot[2]; - stat[GLOBAL] = runSnapshot; - stat[LOCAL] = localSnapshot; - - // Get the appropriate trigger statistical modules. - TriggerStatModule[][] triggerStats = new TriggerStatModule[2][2]; - if(singles) { - triggerStats[LOCAL][0] = stat[LOCAL].getSingles0Stats(); - triggerStats[LOCAL][1] = stat[LOCAL].getSingles1Stats(); - triggerStats[GLOBAL][0] = stat[GLOBAL].getSingles0Stats(); - triggerStats[GLOBAL][1] = stat[GLOBAL].getSingles1Stats(); - } else { - triggerStats[LOCAL][0] = stat[LOCAL].getPair0Stats(); - triggerStats[LOCAL][1] = stat[LOCAL].getPair1Stats(); - triggerStats[GLOBAL][0] = stat[GLOBAL].getPair0Stats(); - triggerStats[GLOBAL][1] = stat[GLOBAL].getPair1Stats(); - } - - // Get the total number of triggers of each type. - int[] sspSimTriggers = new int[2]; - int[] sspBankTriggers = new int[2]; - int[] reconSimTriggers = new int[2]; - int[] sspMatchedTriggers = new int[2]; - int[] reconMatchedTriggers = new int[2]; - - for(int i = 0; i < 2; i++) { - sspSimTriggers[i] = triggerStats[i][0].getSSPSimulatedTriggers() + triggerStats[i][1].getSSPSimulatedTriggers(); - sspBankTriggers[i] = triggerStats[i][0].getReportedTriggers() + triggerStats[i][1].getReportedTriggers(); - reconSimTriggers[i] = triggerStats[i][0].getReconSimulatedTriggers() + triggerStats[i][1].getReconSimulatedTriggers(); - sspMatchedTriggers[i] = triggerStats[i][0].getMatchedSSPSimulatedTriggers() + triggerStats[i][1].getMatchedSSPSimulatedTriggers(); - reconMatchedTriggers[i] = triggerStats[i][0].getMatchedReconSimulatedTriggers() + triggerStats[i][1].getMatchedReconSimulatedTriggers(); - } - - // Determine the most spaces needed to display the values. - // Get the largest number of digits in any of the values. - int mostDigits = ComponentUtils.max(reconSimTriggers[LOCAL], sspBankTriggers[LOCAL], - sspSimTriggers[LOCAL], reconSimTriggers[GLOBAL], sspBankTriggers[GLOBAL], - sspSimTriggers[GLOBAL]); - int spaces = ComponentUtils.getDigits(mostDigits); - - // Update the single-value counters. - String countFormat = "%" + spaces + "d"; - setLocalRowValue(ROW_RECON_COUNT, String.format(countFormat, reconSimTriggers[LOCAL])); - setLocalRowValue(ROW_SSP_SIM_COUNT, String.format(countFormat, sspSimTriggers[LOCAL])); - setLocalRowValue(ROW_SSP_BANK_COUNT, String.format(countFormat, sspBankTriggers[LOCAL])); - setGlobalRowValue(ROW_RECON_COUNT, String.format(countFormat, reconSimTriggers[GLOBAL])); - setGlobalRowValue(ROW_SSP_SIM_COUNT, String.format(countFormat, sspSimTriggers[GLOBAL])); - setGlobalRowValue(ROW_SSP_BANK_COUNT, String.format(countFormat, sspBankTriggers[GLOBAL])); - - // Update the percentage counters. - String percentFormat = "%" + spaces + "d / %" + spaces + "d (%7.3f)"; - - setLocalRowValue(ROW_SSP_EFFICIENCY, String.format(percentFormat, sspMatchedTriggers[LOCAL], - sspSimTriggers[LOCAL], (100.0 * sspMatchedTriggers[LOCAL] / sspSimTriggers[LOCAL]))); - setLocalRowValue(ROW_TRIGGER_EFFICIENCY, String.format(percentFormat, reconMatchedTriggers[LOCAL], - reconSimTriggers[LOCAL], (100.0 * reconMatchedTriggers[LOCAL] / reconSimTriggers[LOCAL]))); - setGlobalRowValue(ROW_SSP_EFFICIENCY, String.format(percentFormat, sspMatchedTriggers[GLOBAL], - sspSimTriggers[GLOBAL], (100.0 * sspMatchedTriggers[GLOBAL] / sspSimTriggers[GLOBAL]))); - setGlobalRowValue(ROW_TRIGGER_EFFICIENCY, String.format(percentFormat, reconMatchedTriggers[GLOBAL], - reconSimTriggers[GLOBAL], (100.0 * reconMatchedTriggers[GLOBAL] / reconSimTriggers[GLOBAL]))); - - int ROW_SECOND_TRIGGER_CUT = ROW_FIRST_TRIGGER_CUT + numCuts + 2; - for(int cutRow = 0; cutRow < numCuts; cutRow++) { - setLocalRowValue(cutRow + ROW_FIRST_TRIGGER_CUT, String.format(percentFormat, - triggerStats[LOCAL][0].getSSPCutFailures(cutRow), triggerStats[LOCAL][0].getSSPSimulatedTriggers(), - (100.0 * triggerStats[LOCAL][0].getSSPCutFailures(cutRow) / triggerStats[LOCAL][0].getSSPSimulatedTriggers()))); - setLocalRowValue(cutRow + ROW_SECOND_TRIGGER_CUT, String.format(percentFormat, - triggerStats[LOCAL][1].getSSPCutFailures(cutRow), triggerStats[LOCAL][1].getSSPSimulatedTriggers(), - (100.0 * triggerStats[LOCAL][1].getSSPCutFailures(cutRow) / triggerStats[LOCAL][1].getSSPSimulatedTriggers()))); - setGlobalRowValue(cutRow + ROW_FIRST_TRIGGER_CUT, String.format(percentFormat, - triggerStats[GLOBAL][0].getSSPCutFailures(cutRow), triggerStats[GLOBAL][0].getSSPSimulatedTriggers(), - (100.0 * triggerStats[GLOBAL][0].getSSPCutFailures(cutRow) / triggerStats[GLOBAL][0].getSSPSimulatedTriggers()))); - setGlobalRowValue(cutRow + ROW_SECOND_TRIGGER_CUT, String.format(percentFormat, - triggerStats[GLOBAL][1].getSSPCutFailures(cutRow), triggerStats[GLOBAL][1].getSSPSimulatedTriggers(), - (100.0 * triggerStats[GLOBAL][1].getSSPCutFailures(cutRow) / triggerStats[GLOBAL][1].getSSPSimulatedTriggers()))); - } - } - } - - /** - * Creates the table appropriate table rows from the argument cut - * names. - * @param cutNames - An array containing the names of the cuts to - * display. - * @return Returns an array with the default table rows merged in - * with the provided cut names. - */ - private static final String[] makeTitle(String[] cutNames) { - // Make a new array to hold all the text. - String[] mergedArray = new String[cutNames.length + cutNames.length + 9]; - - // Define the default trigger headers. - mergedArray[0] = "Recon Triggers:"; - mergedArray[1] = "SSP Sim Triggers:"; - mergedArray[2] = "SSP Bank Triggers:"; - mergedArray[3] = "SSP Efficiency:"; - mergedArray[4] = "Trigger Efficiency:"; - mergedArray[5] = ""; - mergedArray[6] = "First Trigger Cut Failures"; - - // Insert the cut names for the first trigger. - for(int cutIndex = 0; cutIndex < cutNames.length; cutIndex++) { - mergedArray[7 + cutIndex] = cutNames[cutIndex]; - } - - // Insert the header for the second trigger cut names. - int startIndex = 7 + cutNames.length; - mergedArray[startIndex] = ""; - mergedArray[startIndex + 1] = "Second Trigger Cut Failures"; - - // Insert the next set of cut names. - for(int cutIndex = 0; cutIndex < cutNames.length; cutIndex++) { - mergedArray[startIndex + 2 + cutIndex] = cutNames[cutIndex]; - } - - // Return the resultant array. - return mergedArray; - } + // Static variables. + private static final long serialVersionUID = 0L; + + // Internal variables. + private final int numCuts; + private final boolean singles; + + // Store reference index variables for local and run values. + private static final int GLOBAL = 0; + private static final int LOCAL = 1; + + // Reference variables to the default table rows. + protected static final int ROW_RECON_COUNT = 0; + protected static final int ROW_SSP_SIM_COUNT = 1; + protected static final int ROW_SSP_BANK_COUNT = 2; + protected static final int ROW_SSP_EFFICIENCY = 3; + protected static final int ROW_TRIGGER_EFFICIENCY = 4; + protected static final int ROW_EMPTY_SPACE = 5; + protected static final int ROW_CUT_FAILS_TITLE = 6; + protected static final int ROW_FIRST_TRIGGER_CUT = 7; + + /** + * Instantiates an <code>AbstractTriggerTablePanel</code> with the + * indicated cut names. + * @param cutNames + */ + public AbstractTriggerTablePanel(String[] cutNames, boolean isSingles) { + // Instantiate the superclass. + super(makeTitle(cutNames)); + + // Store the number of cuts. + numCuts = cutNames.length; + updatePanel(null, null); + + // Store whether this is a singles or pair trigger panel. + singles = isSingles; + } + + @Override + public void updatePanel(DiagnosticSnapshot runSnapshot, DiagnosticSnapshot localSnapshot) { + // If the snapshot is null, all values should be "N/A." + if(runSnapshot == null || localSnapshot == null) { + // Output cluster count data. + String scalerNullValue = "---"; + setLocalRowValue(ROW_RECON_COUNT, scalerNullValue); + setLocalRowValue(ROW_SSP_SIM_COUNT, scalerNullValue); + setLocalRowValue(ROW_SSP_BANK_COUNT, scalerNullValue); + setGlobalRowValue(ROW_RECON_COUNT, scalerNullValue); + setGlobalRowValue(ROW_SSP_SIM_COUNT, scalerNullValue); + setGlobalRowValue(ROW_SSP_BANK_COUNT, scalerNullValue); + + // Output the tracked statistical data. + String percentNullValue = "--- / --- (---%)"; + setLocalRowValue(ROW_SSP_EFFICIENCY, percentNullValue); + setLocalRowValue(ROW_TRIGGER_EFFICIENCY, percentNullValue); + setGlobalRowValue(ROW_SSP_EFFICIENCY, percentNullValue); + setGlobalRowValue(ROW_TRIGGER_EFFICIENCY, percentNullValue); + + int ROW_SECOND_TRIGGER_CUT = ROW_FIRST_TRIGGER_CUT + numCuts + 2; + for(int cutRow = 0; cutRow < numCuts; cutRow++) { + setLocalRowValue(cutRow + ROW_FIRST_TRIGGER_CUT, percentNullValue); + setLocalRowValue(cutRow + ROW_SECOND_TRIGGER_CUT, percentNullValue); + setGlobalRowValue(cutRow + ROW_FIRST_TRIGGER_CUT, percentNullValue); + setGlobalRowValue(cutRow + ROW_SECOND_TRIGGER_CUT, percentNullValue); + } + } else { + // Get the local and run trigger statistics from the snapshot. + DiagnosticSnapshot[] stat = new DiagnosticSnapshot[2]; + stat[GLOBAL] = runSnapshot; + stat[LOCAL] = localSnapshot; + + // Get the appropriate trigger statistical modules. + TriggerStatModule[][] triggerStats = new TriggerStatModule[2][2]; + if(singles) { + triggerStats[LOCAL][0] = stat[LOCAL].getSingles0Stats(); + triggerStats[LOCAL][1] = stat[LOCAL].getSingles1Stats(); + triggerStats[GLOBAL][0] = stat[GLOBAL].getSingles0Stats(); + triggerStats[GLOBAL][1] = stat[GLOBAL].getSingles1Stats(); + } else { + triggerStats[LOCAL][0] = stat[LOCAL].getPair0Stats(); + triggerStats[LOCAL][1] = stat[LOCAL].getPair1Stats(); + triggerStats[GLOBAL][0] = stat[GLOBAL].getPair0Stats(); + triggerStats[GLOBAL][1] = stat[GLOBAL].getPair1Stats(); + } + + // Get the total number of triggers of each type. + int[] sspSimTriggers = new int[2]; + int[] sspBankTriggers = new int[2]; + int[] reconSimTriggers = new int[2]; + int[] sspMatchedTriggers = new int[2]; + int[] reconMatchedTriggers = new int[2]; + + for(int i = 0; i < 2; i++) { + sspSimTriggers[i] = triggerStats[i][0].getSSPSimulatedTriggers() + triggerStats[i][1].getSSPSimulatedTriggers(); + sspBankTriggers[i] = triggerStats[i][0].getReportedTriggers() + triggerStats[i][1].getReportedTriggers(); + reconSimTriggers[i] = triggerStats[i][0].getReconSimulatedTriggers() + triggerStats[i][1].getReconSimulatedTriggers(); + sspMatchedTriggers[i] = triggerStats[i][0].getMatchedSSPSimulatedTriggers() + triggerStats[i][1].getMatchedSSPSimulatedTriggers(); + reconMatchedTriggers[i] = triggerStats[i][0].getMatchedReconSimulatedTriggers() + triggerStats[i][1].getMatchedReconSimulatedTriggers(); + } + + // Determine the most spaces needed to display the values. + // Get the largest number of digits in any of the values. + int mostDigits = ComponentUtils.max(reconSimTriggers[LOCAL], sspBankTriggers[LOCAL], + sspSimTriggers[LOCAL], reconSimTriggers[GLOBAL], sspBankTriggers[GLOBAL], + sspSimTriggers[GLOBAL]); + int spaces = ComponentUtils.getDigits(mostDigits); + + // Update the single-value counters. + String countFormat = "%" + spaces + "d"; + setLocalRowValue(ROW_RECON_COUNT, String.format(countFormat, reconSimTriggers[LOCAL])); + setLocalRowValue(ROW_SSP_SIM_COUNT, String.format(countFormat, sspSimTriggers[LOCAL])); + setLocalRowValue(ROW_SSP_BANK_COUNT, String.format(countFormat, sspBankTriggers[LOCAL])); + setGlobalRowValue(ROW_RECON_COUNT, String.format(countFormat, reconSimTriggers[GLOBAL])); + setGlobalRowValue(ROW_SSP_SIM_COUNT, String.format(countFormat, sspSimTriggers[GLOBAL])); + setGlobalRowValue(ROW_SSP_BANK_COUNT, String.format(countFormat, sspBankTriggers[GLOBAL])); + + // Update the percentage counters. + String percentFormat = "%" + spaces + "d / %" + spaces + "d (%7.3f)"; + + setLocalRowValue(ROW_SSP_EFFICIENCY, String.format(percentFormat, sspMatchedTriggers[LOCAL], + sspSimTriggers[LOCAL], (100.0 * sspMatchedTriggers[LOCAL] / sspSimTriggers[LOCAL]))); + setLocalRowValue(ROW_TRIGGER_EFFICIENCY, String.format(percentFormat, reconMatchedTriggers[LOCAL], + reconSimTriggers[LOCAL], (100.0 * reconMatchedTriggers[LOCAL] / reconSimTriggers[LOCAL]))); + setGlobalRowValue(ROW_SSP_EFFICIENCY, String.format(percentFormat, sspMatchedTriggers[GLOBAL], + sspSimTriggers[GLOBAL], (100.0 * sspMatchedTriggers[GLOBAL] / sspSimTriggers[GLOBAL]))); + setGlobalRowValue(ROW_TRIGGER_EFFICIENCY, String.format(percentFormat, reconMatchedTriggers[GLOBAL], + reconSimTriggers[GLOBAL], (100.0 * reconMatchedTriggers[GLOBAL] / reconSimTriggers[GLOBAL]))); + + int ROW_SECOND_TRIGGER_CUT = ROW_FIRST_TRIGGER_CUT + numCuts + 2; + for(int cutRow = 0; cutRow < numCuts; cutRow++) { + setLocalRowValue(cutRow + ROW_FIRST_TRIGGER_CUT, String.format(percentFormat, + triggerStats[LOCAL][0].getSSPCutFailures(cutRow), triggerStats[LOCAL][0].getSSPSimulatedTriggers(), + (100.0 * triggerStats[LOCAL][0].getSSPCutFailures(cutRow) / triggerStats[LOCAL][0].getSSPSimulatedTriggers()))); + setLocalRowValue(cutRow + ROW_SECOND_TRIGGER_CUT, String.format(percentFormat, + triggerStats[LOCAL][1].getSSPCutFailures(cutRow), triggerStats[LOCAL][1].getSSPSimulatedTriggers(), + (100.0 * triggerStats[LOCAL][1].getSSPCutFailures(cutRow) / triggerStats[LOCAL][1].getSSPSimulatedTriggers()))); + setGlobalRowValue(cutRow + ROW_FIRST_TRIGGER_CUT, String.format(percentFormat, + triggerStats[GLOBAL][0].getSSPCutFailures(cutRow), triggerStats[GLOBAL][0].getSSPSimulatedTriggers(), + (100.0 * triggerStats[GLOBAL][0].getSSPCutFailures(cutRow) / triggerStats[GLOBAL][0].getSSPSimulatedTriggers()))); + setGlobalRowValue(cutRow + ROW_SECOND_TRIGGER_CUT, String.format(percentFormat, + triggerStats[GLOBAL][1].getSSPCutFailures(cutRow), triggerStats[GLOBAL][1].getSSPSimulatedTriggers(), + (100.0 * triggerStats[GLOBAL][1].getSSPCutFailures(cutRow) / triggerStats[GLOBAL][1].getSSPSimulatedTriggers()))); + } + } + } + + /** + * Creates the table appropriate table rows from the argument cut + * names. + * @param cutNames - An array containing the names of the cuts to + * display. + * @return Returns an array with the default table rows merged in + * with the provided cut names. + */ + private static final String[] makeTitle(String[] cutNames) { + // Make a new array to hold all the text. + String[] mergedArray = new String[cutNames.length + cutNames.length + 9]; + + // Define the default trigger headers. + mergedArray[0] = "Recon Triggers:"; + mergedArray[1] = "SSP Sim Triggers:"; + mergedArray[2] = "SSP Bank Triggers:"; + mergedArray[3] = "SSP Efficiency:"; + mergedArray[4] = "Trigger Efficiency:"; + mergedArray[5] = ""; + mergedArray[6] = "First Trigger Cut Failures"; + + // Insert the cut names for the first trigger. + for(int cutIndex = 0; cutIndex < cutNames.length; cutIndex++) { + mergedArray[7 + cutIndex] = cutNames[cutIndex]; + } + + // Insert the header for the second trigger cut names. + int startIndex = 7 + cutNames.length; + mergedArray[startIndex] = ""; + mergedArray[startIndex + 1] = "Second Trigger Cut Failures"; + + // Insert the next set of cut names. + for(int cutIndex = 0; cutIndex < cutNames.length; cutIndex++) { + mergedArray[startIndex + 2 + cutIndex] = cutNames[cutIndex]; + } + + // Return the resultant array. + return mergedArray; + } } Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/AbstractTwoColumnTablePanel.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/AbstractTwoColumnTablePanel.java (original) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/AbstractTwoColumnTablePanel.java Wed Mar 9 11:43:24 2016 @@ -16,94 +16,94 @@ * @see AbstractTablePanel */ public abstract class AbstractTwoColumnTablePanel extends AbstractTablePanel { - // Static variables. - private static final long serialVersionUID = 0L; - - // Table models. - private TableTextModel localModel; - private TableTextModel globalModel; - - // Table model mappings. - private static final int COL_TITLE = 0; - private static final int COL_VALUE = 1; - - /** - * Instantiates an <code>AbstractTwoColumnTablePanel</code> object - * with the indicated row names. - * @param rowNames - The names of the rows. - */ - public AbstractTwoColumnTablePanel(String[] rowNames) { - super((Object[]) rowNames); - } - - @Override - protected JTable[] initializeTables(Object... args) { - // The arguments should be a string array. - if(!(args instanceof String[])) { - throw new IllegalArgumentException("Row names must be strings!"); - } - String[] rowNames = (String[]) args; - - // Initialize the table models. They should have two columns - // (one for values and one for headers) and a number of rows - // equal to the number of row names. - localModel = new TableTextModel(rowNames.length, 2); - globalModel = new TableTextModel(rowNames.length, 2); - - // Initialize the titles. - for(int i = 0; i < rowNames.length; i++) { - localModel.setValueAt(rowNames[i], i, COL_TITLE); - globalModel.setValueAt(rowNames[i], i, COL_TITLE); - } - updatePanel(null, null); - - // Make a cell renderer. - DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer(); - centerRenderer.setHorizontalAlignment(JLabel.CENTER); - - // Create JTable objects to display the data. - JTable localTable = new JTable(localModel); - localTable.setRowSelectionAllowed(false); - localTable.setColumnSelectionAllowed(false); - localTable.setCellSelectionEnabled(false); - localTable.setShowVerticalLines(false); - localTable.getColumnModel().getColumn(0).setMinWidth(200); - localTable.getColumnModel().getColumn(0).setMaxWidth(200); - localTable.getColumnModel().getColumn(1).setCellRenderer(centerRenderer); - localTable.setFont(new Font("monospaced", localTable.getFont().getStyle(), localTable.getFont().getSize())); - - JTable globalTable = new JTable(globalModel); - globalTable.setRowSelectionAllowed(false); - globalTable.setColumnSelectionAllowed(false); - globalTable.setCellSelectionEnabled(false); - globalTable.setShowVerticalLines(false); - globalTable.getColumnModel().getColumn(0).setMinWidth(200); - globalTable.getColumnModel().getColumn(0).setMaxWidth(200); - globalTable.getColumnModel().getColumn(1).setCellRenderer(centerRenderer); - globalTable.setFont(new Font("monospaced", globalTable.getFont().getStyle(), globalTable.getFont().getSize())); - - // Return the two tables. - return new JTable[] { localTable, globalTable }; - } - - /** - * Sets the value of the indicated row for the global statistical - * table. - * @param rowIndex - The row. - * @param value - The new value. - */ - protected void setGlobalRowValue(int rowIndex, String value) { - globalModel.setValueAt(value, rowIndex, COL_VALUE); - } - - /** - * Sets the value of the indicated row for the local statistical - * table. - * @param rowIndex - The row. - * @param value - The new value. - */ - protected void setLocalRowValue(int rowIndex, String value) { - localModel.setValueAt(value, rowIndex, COL_VALUE); - } + // Static variables. + private static final long serialVersionUID = 0L; + + // Table models. + private TableTextModel localModel; + private TableTextModel globalModel; + + // Table model mappings. + private static final int COL_TITLE = 0; + private static final int COL_VALUE = 1; + + /** + * Instantiates an <code>AbstractTwoColumnTablePanel</code> object + * with the indicated row names. + * @param rowNames - The names of the rows. + */ + public AbstractTwoColumnTablePanel(String[] rowNames) { + super((Object[]) rowNames); + } + + @Override + protected JTable[] initializeTables(Object... args) { + // The arguments should be a string array. + if(!(args instanceof String[])) { + throw new IllegalArgumentException("Row names must be strings!"); + } + String[] rowNames = (String[]) args; + + // Initialize the table models. They should have two columns + // (one for values and one for headers) and a number of rows + // equal to the number of row names. + localModel = new TableTextModel(rowNames.length, 2); + globalModel = new TableTextModel(rowNames.length, 2); + + // Initialize the titles. + for(int i = 0; i < rowNames.length; i++) { + localModel.setValueAt(rowNames[i], i, COL_TITLE); + globalModel.setValueAt(rowNames[i], i, COL_TITLE); + } + updatePanel(null, null); + + // Make a cell renderer. + DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer(); + centerRenderer.setHorizontalAlignment(JLabel.CENTER); + + // Create JTable objects to display the data. + JTable localTable = new JTable(localModel); + localTable.setRowSelectionAllowed(false); + localTable.setColumnSelectionAllowed(false); + localTable.setCellSelectionEnabled(false); + localTable.setShowVerticalLines(false); + localTable.getColumnModel().getColumn(0).setMinWidth(200); + localTable.getColumnModel().getColumn(0).setMaxWidth(200); + localTable.getColumnModel().getColumn(1).setCellRenderer(centerRenderer); + localTable.setFont(new Font("monospaced", localTable.getFont().getStyle(), localTable.getFont().getSize())); + + JTable globalTable = new JTable(globalModel); + globalTable.setRowSelectionAllowed(false); + globalTable.setColumnSelectionAllowed(false); + globalTable.setCellSelectionEnabled(false); + globalTable.setShowVerticalLines(false); + globalTable.getColumnModel().getColumn(0).setMinWidth(200); + globalTable.getColumnModel().getColumn(0).setMaxWidth(200); + globalTable.getColumnModel().getColumn(1).setCellRenderer(centerRenderer); + globalTable.setFont(new Font("monospaced", globalTable.getFont().getStyle(), globalTable.getFont().getSize())); + + // Return the two tables. + return new JTable[] { localTable, globalTable }; + } + + /** + * Sets the value of the indicated row for the global statistical + * table. + * @param rowIndex - The row. + * @param value - The new value. + */ + protected void setGlobalRowValue(int rowIndex, String value) { + globalModel.setValueAt(value, rowIndex, COL_VALUE); + } + + /** + * Sets the value of the indicated row for the local statistical + * table. + * @param rowIndex - The row. + * @param value - The new value. + */ + protected void setLocalRowValue(int rowIndex, String value) { + localModel.setValueAt(value, rowIndex, COL_VALUE); + } } Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/ClusterTablePanel.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/ClusterTablePanel.java (original) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/ClusterTablePanel.java Wed Mar 9 11:43:24 2016 @@ -14,99 +14,99 @@ * @see AbstractTablePanel */ public class ClusterTablePanel extends AbstractTwoColumnTablePanel { - // Static variables. - private static final long serialVersionUID = 0L; - private static final String[] TABLE_TITLES = { "Recon Clusters", "SSP Clusters", "Matched Clusters", - "Failed (Position)", "Failed (Energy)", "Failed (Hit Count)" }; - - // Table model mappings. - private static final int ROW_RECON_COUNT = 0; - private static final int ROW_SSP_COUNT = 1; - private static final int ROW_MATCHED = 2; - private static final int ROW_FAILED_POSITION = 3; - private static final int ROW_FAILED_ENERGY = 4; - private static final int ROW_FAILED_HIT_COUNT = 5; - - /** - * Instantiate a new <code>ClusterTablePanel</code>. - */ - public ClusterTablePanel() { super(TABLE_TITLES); } - - @Override - public void updatePanel(DiagnosticSnapshot runSnapshot, DiagnosticSnapshot localSnapshot) { - // If the snapshot is null, all values should be "N/A." - if(localSnapshot == null || runSnapshot == null) { - // Output cluster count data. - String scalerNullValue = "---"; - setLocalRowValue(ROW_RECON_COUNT, scalerNullValue); - setLocalRowValue(ROW_SSP_COUNT, scalerNullValue); - setGlobalRowValue(ROW_RECON_COUNT, scalerNullValue); - setGlobalRowValue(ROW_SSP_COUNT, scalerNullValue); - - // Output the tracked statistical data. - String percentNullValue = "--- / --- (---%)"; - setLocalRowValue(ROW_MATCHED, percentNullValue); - setLocalRowValue(ROW_FAILED_POSITION, percentNullValue); - setLocalRowValue(ROW_FAILED_ENERGY, percentNullValue); - setLocalRowValue(ROW_FAILED_HIT_COUNT, percentNullValue); - setGlobalRowValue(ROW_MATCHED, percentNullValue); - setGlobalRowValue(ROW_FAILED_POSITION, percentNullValue); - setGlobalRowValue(ROW_FAILED_ENERGY, percentNullValue); - setGlobalRowValue(ROW_FAILED_HIT_COUNT, percentNullValue); - } - - // Otherwise, populate the table with the diagnostic data. - else { - // Get the cluster statistical banks. - ClusterStatModule lstat = localSnapshot.getClusterStats(); - ClusterStatModule rstat = runSnapshot.getClusterStats(); - - // Get the largest number of digits in any of the values. - int mostDigits = ComponentUtils.max(lstat.getReconClusterCount(), lstat.getSSPClusterCount(), lstat.getMatches(), - lstat.getPositionFailures(), lstat.getEnergyFailures(), lstat.getHitCountFailures(), - rstat.getReconClusterCount(), rstat.getSSPClusterCount(), rstat.getMatches(), - rstat.getPositionFailures(), rstat.getEnergyFailures(), rstat.getHitCountFailures()); - int spaces = ComponentUtils.getDigits(mostDigits); - - // Put the number of reconstructed and SSP clusters into - // the tables. - int[] clusterValue = { - lstat.getReconClusterCount(), - lstat.getSSPClusterCount(), - rstat.getReconClusterCount(), - rstat.getSSPClusterCount() - }; - String countFormat = "%" + spaces + "d"; - setLocalRowValue(ROW_RECON_COUNT, String.format(countFormat, clusterValue[0])); - setLocalRowValue(ROW_SSP_COUNT, String.format(countFormat, clusterValue[1])); - setGlobalRowValue(ROW_RECON_COUNT, String.format(countFormat, clusterValue[2])); - setGlobalRowValue(ROW_SSP_COUNT, String.format(countFormat, clusterValue[3])); - - // Output the tracked statistical data. - int total; - String percentFormat = "%" + spaces + "d / %" + spaces + "d (%7.3f)"; - int[] statValue = { - lstat.getMatches(), - lstat.getPositionFailures(), - lstat.getEnergyFailures(), - lstat.getHitCountFailures(), - rstat.getMatches(), - rstat.getPositionFailures(), - rstat.getEnergyFailures(), - rstat.getHitCountFailures() - }; - - total = lstat.getReconClusterCount(); - setLocalRowValue(ROW_MATCHED, String.format(percentFormat, statValue[0], total, 100.0 * statValue[0] / total)); - setLocalRowValue(ROW_FAILED_POSITION, String.format(percentFormat, statValue[1], total, 100.0 * statValue[1] / total)); - setLocalRowValue(ROW_FAILED_ENERGY, String.format(percentFormat, statValue[2], total, 100.0 * statValue[2] / total)); - setLocalRowValue(ROW_FAILED_HIT_COUNT, String.format(percentFormat, statValue[3], total, 100.0 * statValue[3] / total)); - - total = rstat.getReconClusterCount(); - setGlobalRowValue(ROW_MATCHED, String.format(percentFormat, statValue[4], total, 100.0 * statValue[4] / total)); - setGlobalRowValue(ROW_FAILED_POSITION, String.format(percentFormat, statValue[5], total, 100.0 * statValue[5] / total)); - setGlobalRowValue(ROW_FAILED_ENERGY, String.format(percentFormat, statValue[6], total, 100.0 * statValue[6] / total)); - setGlobalRowValue(ROW_FAILED_HIT_COUNT, String.format(percentFormat, statValue[7], total, 100.0 * statValue[7] / total)); - } - } + // Static variables. + private static final long serialVersionUID = 0L; + private static final String[] TABLE_TITLES = { "Recon Clusters", "SSP Clusters", "Matched Clusters", + "Failed (Position)", "Failed (Energy)", "Failed (Hit Count)" }; + + // Table model mappings. + private static final int ROW_RECON_COUNT = 0; + private static final int ROW_SSP_COUNT = 1; + private static final int ROW_MATCHED = 2; + private static final int ROW_FAILED_POSITION = 3; + private static final int ROW_FAILED_ENERGY = 4; + private static final int ROW_FAILED_HIT_COUNT = 5; + + /** + * Instantiate a new <code>ClusterTablePanel</code>. + */ + public ClusterTablePanel() { super(TABLE_TITLES); } + + @Override + public void updatePanel(DiagnosticSnapshot runSnapshot, DiagnosticSnapshot localSnapshot) { + // If the snapshot is null, all values should be "N/A." + if(localSnapshot == null || runSnapshot == null) { + // Output cluster count data. + String scalerNullValue = "---"; + setLocalRowValue(ROW_RECON_COUNT, scalerNullValue); + setLocalRowValue(ROW_SSP_COUNT, scalerNullValue); + setGlobalRowValue(ROW_RECON_COUNT, scalerNullValue); + setGlobalRowValue(ROW_SSP_COUNT, scalerNullValue); + + // Output the tracked statistical data. + String percentNullValue = "--- / --- (---%)"; + setLocalRowValue(ROW_MATCHED, percentNullValue); + setLocalRowValue(ROW_FAILED_POSITION, percentNullValue); + setLocalRowValue(ROW_FAILED_ENERGY, percentNullValue); + setLocalRowValue(ROW_FAILED_HIT_COUNT, percentNullValue); + setGlobalRowValue(ROW_MATCHED, percentNullValue); + setGlobalRowValue(ROW_FAILED_POSITION, percentNullValue); + setGlobalRowValue(ROW_FAILED_ENERGY, percentNullValue); + setGlobalRowValue(ROW_FAILED_HIT_COUNT, percentNullValue); + } + + // Otherwise, populate the table with the diagnostic data. + else { + // Get the cluster statistical banks. + ClusterStatModule lstat = localSnapshot.getClusterStats(); + ClusterStatModule rstat = runSnapshot.getClusterStats(); + + // Get the largest number of digits in any of the values. + int mostDigits = ComponentUtils.max(lstat.getReconClusterCount(), lstat.getSSPClusterCount(), lstat.getMatches(), + lstat.getPositionFailures(), lstat.getEnergyFailures(), lstat.getHitCountFailures(), + rstat.getReconClusterCount(), rstat.getSSPClusterCount(), rstat.getMatches(), + rstat.getPositionFailures(), rstat.getEnergyFailures(), rstat.getHitCountFailures()); + int spaces = ComponentUtils.getDigits(mostDigits); + + // Put the number of reconstructed and SSP clusters into + // the tables. + int[] clusterValue = { + lstat.getReconClusterCount(), + lstat.getSSPClusterCount(), + rstat.getReconClusterCount(), + rstat.getSSPClusterCount() + }; + String countFormat = "%" + spaces + "d"; + setLocalRowValue(ROW_RECON_COUNT, String.format(countFormat, clusterValue[0])); + setLocalRowValue(ROW_SSP_COUNT, String.format(countFormat, clusterValue[1])); + setGlobalRowValue(ROW_RECON_COUNT, String.format(countFormat, clusterValue[2])); + setGlobalRowValue(ROW_SSP_COUNT, String.format(countFormat, clusterValue[3])); + + // Output the tracked statistical data. + int total; + String percentFormat = "%" + spaces + "d / %" + spaces + "d (%7.3f)"; + int[] statValue = { + lstat.getMatches(), + lstat.getPositionFailures(), + lstat.getEnergyFailures(), + lstat.getHitCountFailures(), + rstat.getMatches(), + rstat.getPositionFailures(), + rstat.getEnergyFailures(), + rstat.getHitCountFailures() + }; + + total = lstat.getReconClusterCount(); + setLocalRowValue(ROW_MATCHED, String.format(percentFormat, statValue[0], total, 100.0 * statValue[0] / total)); + setLocalRowValue(ROW_FAILED_POSITION, String.format(percentFormat, statValue[1], total, 100.0 * statValue[1] / total)); + setLocalRowValue(ROW_FAILED_ENERGY, String.format(percentFormat, statValue[2], total, 100.0 * statValue[2] / total)); + setLocalRowValue(ROW_FAILED_HIT_COUNT, String.format(percentFormat, statValue[3], total, 100.0 * statValue[3] / total)); + + total = rstat.getReconClusterCount(); + setGlobalRowValue(ROW_MATCHED, String.format(percentFormat, statValue[4], total, 100.0 * statValue[4] / total)); + setGlobalRowValue(ROW_FAILED_POSITION, String.format(percentFormat, statValue[5], total, 100.0 * statValue[5] / total)); + setGlobalRowValue(ROW_FAILED_ENERGY, String.format(percentFormat, statValue[6], total, 100.0 * statValue[6] / total)); + setGlobalRowValue(ROW_FAILED_HIT_COUNT, String.format(percentFormat, statValue[7], total, 100.0 * statValue[7] / total)); + } + } } Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/ComponentUtils.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/ComponentUtils.java (original) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/ComponentUtils.java Wed Mar 9 11:43:24 2016 @@ -11,116 +11,116 @@ * @author Kyle McCarty <[log in to unmask]> */ public class ComponentUtils { - /** The default spacing used between a horizontal edge of one - * component and the horizontal edge of another. */ - static final int hinternal = 10; - /** The default spacing used between a vertical edge of one - * component and the vertical edge of another. */ - static final int vinternal = 10; - /** The default spacing used between a horizontal edge of one - * component and the edge of its parent component. */ - static final int hexternal = 0; - /** The default spacing used between a vertical edge of one - * component and the edge of its parent component. */ - static final int vexternal = 0; - - /** - * Gets a <code>String</code> composed of a number of instances of - * character <code>c</code> equal to <code>number</code>. - * @param c - The character to repeat. - * @param number - The number of repetitions. - * @return Returns the repeated character as a <code>String</code>. - */ - public static final String getChars(char c, int number) { - // Create a buffer to store the characters in. - StringBuffer s = new StringBuffer(); - - // Add the indicated number of instances. - for(int i = 0; i < number; i++) { - s.append(c); - } - - // Return the string. - return s.toString(); - } - - /** - * Gets the number of digits in the base-10 String representation - * of an integer primitive. Negative signs are not included in the - * digit count. - * @param value - The value of which to obtain the length. - * @return Returns the number of digits in the String representation - * of the argument value. - */ - public static final int getDigits(int value) { - return TriggerDiagnosticUtil.getDigits(value); - } - - /** - * Gets the maximum value from a list of values. - * @param values - The values to compare. - * @return Returns the largest of the argument values. - * @throws IllegalArgumentException Occurs if no values are given. - */ - public static final int max(int... values) throws IllegalArgumentException { - // Throw an error if no arguments are provided. - if(values == null || values.length == 0) { - throw new IllegalArgumentException("Can not determine maximum value from a list of 0 values."); - } - - // If there is only one value, return it. - if(values.length == 1) { return values[0]; } - - // Otherwise, get the largest value. - int largest = Integer.MIN_VALUE; - for(int value : values) { - if(value > largest) { largest = value; } - } - - // Return the result. - return largest; - } - - /** - * Gets the x-coordinate immediately to the right of the given - * component. - * @param c - The component of which to find the edge. - * @return Returns the x-coordinate as an <code>int</code> value. - */ - static final int getNextX(Component c) { - return getNextX(c, 0); - } - - /** - * Gets the x-coordinate a given distance to the right edge of the - * argument component. - * @param c - The component of which to find the edge. - * @param spacing - The additional spacing past the edge of the - * component to add. - * @return Returns the x-coordinate as an <code>int</code> value. - */ - static final int getNextX(Component c, int spacing) { - return c.getX() + c.getWidth() + spacing; - } - - /** - * Gets the y-coordinate immediately below the given component. - * @param c - The component of which to find the edge. - * @return Returns the y-coordinate as an <code>int</code> value. - */ - static final int getNextY(Component c) { - return getNextY(c, 0); - } - - /** - * Gets the y-coordinate a given distance below the bottom edge - * of the argument component. - * @param c - The component of which to find the edge. - * @param spacing - The additional spacing past the edge of the - * component to add. - * @return Returns the y-coordinate as an <code>int</code> value. - */ - static final int getNextY(Component c, int spacing) { - return c.getY() + c.getHeight() + spacing; - } + /** The default spacing used between a horizontal edge of one + * component and the horizontal edge of another. */ + static final int hinternal = 10; + /** The default spacing used between a vertical edge of one + * component and the vertical edge of another. */ + static final int vinternal = 10; + /** The default spacing used between a horizontal edge of one + * component and the edge of its parent component. */ + static final int hexternal = 0; + /** The default spacing used between a vertical edge of one + * component and the edge of its parent component. */ + static final int vexternal = 0; + + /** + * Gets a <code>String</code> composed of a number of instances of + * character <code>c</code> equal to <code>number</code>. + * @param c - The character to repeat. + * @param number - The number of repetitions. + * @return Returns the repeated character as a <code>String</code>. + */ + public static final String getChars(char c, int number) { + // Create a buffer to store the characters in. + StringBuffer s = new StringBuffer(); + + // Add the indicated number of instances. + for(int i = 0; i < number; i++) { + s.append(c); + } + + // Return the string. + return s.toString(); + } + + /** + * Gets the number of digits in the base-10 String representation + * of an integer primitive. Negative signs are not included in the + * digit count. + * @param value - The value of which to obtain the length. + * @return Returns the number of digits in the String representation + * of the argument value. + */ + public static final int getDigits(int value) { + return TriggerDiagnosticUtil.getDigits(value); + } + + /** + * Gets the maximum value from a list of values. + * @param values - The values to compare. + * @return Returns the largest of the argument values. + * @throws IllegalArgumentException Occurs if no values are given. + */ + public static final int max(int... values) throws IllegalArgumentException { + // Throw an error if no arguments are provided. + if(values == null || values.length == 0) { + throw new IllegalArgumentException("Can not determine maximum value from a list of 0 values."); + } + + // If there is only one value, return it. + if(values.length == 1) { return values[0]; } + + // Otherwise, get the largest value. + int largest = Integer.MIN_VALUE; + for(int value : values) { + if(value > largest) { largest = value; } + } + + // Return the result. + return largest; + } + + /** + * Gets the x-coordinate immediately to the right of the given + * component. + * @param c - The component of which to find the edge. + * @return Returns the x-coordinate as an <code>int</code> value. + */ + static final int getNextX(Component c) { + return getNextX(c, 0); + } + + /** + * Gets the x-coordinate a given distance to the right edge of the + * argument component. + * @param c - The component of which to find the edge. + * @param spacing - The additional spacing past the edge of the + * component to add. + * @return Returns the x-coordinate as an <code>int</code> value. + */ + static final int getNextX(Component c, int spacing) { + return c.getX() + c.getWidth() + spacing; + } + + /** + * Gets the y-coordinate immediately below the given component. + * @param c - The component of which to find the edge. + * @return Returns the y-coordinate as an <code>int</code> value. + */ + static final int getNextY(Component c) { + return getNextY(c, 0); + } + + /** + * Gets the y-coordinate a given distance below the bottom edge + * of the argument component. + * @param c - The component of which to find the edge. + * @param spacing - The additional spacing past the edge of the + * component to add. + * @return Returns the y-coordinate as an <code>int</code> value. + */ + static final int getNextY(Component c, int spacing) { + return c.getY() + c.getHeight() + spacing; + } } Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/DiagnosticUpdatable.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/DiagnosticUpdatable.java (original) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/DiagnosticUpdatable.java Wed Mar 9 11:43:24 2016 @@ -12,11 +12,11 @@ * @see DiagSnapshot */ public interface DiagnosticUpdatable { - /** - * Updates the object with information from the trigger diagnostic - * snapshot in the argument. - * @param snapshot - The snapshot containing information with which - * to update the object. - */ - public void updatePanel(DiagnosticSnapshot runSnapshot, DiagnosticSnapshot localSnapshot); + /** + * Updates the object with information from the trigger diagnostic + * snapshot in the argument. + * @param snapshot - The snapshot containing information with which + * to update the object. + */ + public void updatePanel(DiagnosticSnapshot runSnapshot, DiagnosticSnapshot localSnapshot); } Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/EfficiencyTablePanel.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/EfficiencyTablePanel.java (original) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/EfficiencyTablePanel.java Wed Mar 9 11:43:24 2016 @@ -11,200 +11,200 @@ import org.hps.analysis.trigger.util.ComponentUtils; public class EfficiencyTablePanel extends AbstractTablePanel implements DiagnosticUpdatable { - // Static variables. - private static final long serialVersionUID = 0L; - - // Table models. - private TableTextModel localModel; - private TableTextModel globalModel; - - // Column/row reference variables. - private static final int ROWS = 7; - private static final int COLUMNS = 6; - /* private static final int COL_HEADER = 0; - private static final int COL_SINGLES_0 = 1; - private static final int COL_SINGLES_1 = 2; - private static final int COL_PAIR_0 = 3; - private static final int COL_PAIR_1 = 4; */ - private static final int COL_COUNT = 5; - /* private static final int ROW_HEADER = 0; - private static final int ROW_PULSER = 1; - private static final int ROW_COSMIC = 2; - private static final int ROW_SINGLES_0 = 3; - private static final int ROW_SINGLES_1 = 4; - private static final int ROW_PAIR_0 = 5; - private static final int ROW_PAIR_1 = 6; */ - - // Global/local reference variables. - private static final int GLOBAL = 0; - private static final int LOCAL = 1; - - // Trigger type reference variables. - private static final int TYPE_SINGLES_0 = TriggerStatModule.SINGLES_0; - private static final int TYPE_SINGLES_1 = TriggerStatModule.SINGLES_1; - private static final int TYPE_PAIR_0 = TriggerStatModule.PAIR_0; - private static final int TYPE_PAIR_1 = TriggerStatModule.PAIR_1; - - // Column/row header names. - private static final String[] COL_NAMES = { - "", "Singles 0", "Singles 1", "Pair 0", "Pair 1", "Count" - }; - private static final String[] ROW_NAMES = { - "", "Singles 0", "Singles 1", "Pair 0", "Pair 1", "Pulser", "Cosmic" - //"", "Random", "Cosmic", "Singles 0", "Singles 1", "Pair 0", "Pair 1" - }; - - /** - * Instantiates a new <code>EfficiencyTablePanel</code>. - */ - public EfficiencyTablePanel() { - // Instantiate the superclass. - super(); - - // Set the orientation to vertical. - setOrientation(ORIENTATION_VERTICAL); - } - - @Override - public void updatePanel(DiagnosticSnapshot runSnapshot, DiagnosticSnapshot localSnapshot) { - // If there is no snapshot, the tables should all display an - // empty value. - if(runSnapshot == null || localSnapshot == null) { - for(int row = 1; row < ROWS; row++) { - for(int col = 1; col < COLUMNS; col++) { - localModel.setValueAt("---", row, col); - globalModel.setValueAt("---", row, col); - } - } - } - - // Otherwise, update the table cells from the snapshot data. - else { - // Get the efficiency modules. - DiagnosticSnapshot[] stat = new DiagnosticSnapshot[2]; - stat[GLOBAL] = runSnapshot; - stat[LOCAL] = localSnapshot; - - // Get the trigger count for each trigger type for both the - // local and global snapshots. - int[][][] matched = new int[2][4][6]; - int[][][] triggers = new int[2][4][6]; - for(int i = 0; i < 2; i++) { - for(int triggerType = 0; triggerType < 6; triggerType++) { - // Get the total triggers seen for each type. - triggers[i][TYPE_SINGLES_0][triggerType] = stat[i].getSingles0Stats().getSSPSimulatedTriggers(triggerType); - triggers[i][TYPE_SINGLES_1][triggerType] = stat[i].getSingles1Stats().getSSPSimulatedTriggers(triggerType); - triggers[i][TYPE_PAIR_0][triggerType] = stat[i].getPair0Stats().getSSPSimulatedTriggers(triggerType); - triggers[i][TYPE_PAIR_1][triggerType] = stat[i].getPair1Stats().getSSPSimulatedTriggers(triggerType); - - // Get the total triggers matched for each type. - matched[i][TYPE_SINGLES_0][triggerType] = stat[i].getSingles0Stats().getMatchedSSPSimulatedTriggers(triggerType); - matched[i][TYPE_SINGLES_1][triggerType] = stat[i].getSingles1Stats().getMatchedSSPSimulatedTriggers(triggerType); - matched[i][TYPE_PAIR_0][triggerType] = stat[i].getPair0Stats().getMatchedSSPSimulatedTriggers(triggerType); - matched[i][TYPE_PAIR_1][triggerType] = stat[i].getPair1Stats().getMatchedSSPSimulatedTriggers(triggerType); - } - } - - // Determine the spacing needed to display the largest numerical - // cell value. - int numWidth = -1; - for(int tiTriggerType = 0; tiTriggerType < 6; tiTriggerType++) { - for(int seenTriggerType = 0; seenTriggerType < 4; seenTriggerType++) { - int rSize = ComponentUtils.getDigits(triggers[GLOBAL][seenTriggerType][tiTriggerType]); - int lSize = ComponentUtils.getDigits(triggers[LOCAL][seenTriggerType][tiTriggerType]); - numWidth = ComponentUtils.max(numWidth, rSize, lSize); - } - } - - // Generate the format string for the cells. - String format = "%" + numWidth + "d / %" + numWidth + "d"; - - // Update the table. - for(int tiTriggerType = 0; tiTriggerType < 6; tiTriggerType++) { - // Fill the row/column combinations that hold trigger - // statistical information. - for(int seenTriggerType = 0; seenTriggerType < 4; seenTriggerType++) { - // Fill the local table cell. - String localText = String.format(format, matched[LOCAL][seenTriggerType][tiTriggerType], - triggers[LOCAL][seenTriggerType][tiTriggerType]); - if(triggers[LOCAL][seenTriggerType][tiTriggerType] == 0) { - localText = localText + " ( N/A %)"; - } else { - localText = String.format("%s (%7.3f%%)", localText, - (100.0 * matched[LOCAL][seenTriggerType][tiTriggerType] / triggers[LOCAL][seenTriggerType][tiTriggerType])); - } - localModel.setValueAt(localText, tiTriggerType + 1, seenTriggerType + 1); - - // Fill the global table cell. - String globalText = String.format(format, matched[GLOBAL][seenTriggerType][tiTriggerType], - triggers[GLOBAL][seenTriggerType][tiTriggerType]); - if(triggers[GLOBAL][seenTriggerType][tiTriggerType] == 0) { - globalText = globalText + " ( N/A %)"; - } else { - globalText = String.format("%s (%7.3f%%)", globalText, - (100.0 * matched[GLOBAL][seenTriggerType][tiTriggerType] / triggers[GLOBAL][seenTriggerType][tiTriggerType])); - } - globalModel.setValueAt(globalText, tiTriggerType + 1, seenTriggerType + 1); - } - - // Populate the count column. - localModel.setValueAt("" + stat[LOCAL].getTITriggers(tiTriggerType, true), tiTriggerType + 1, COL_COUNT); - globalModel.setValueAt("" + stat[GLOBAL].getTITriggers(tiTriggerType, true), tiTriggerType + 1, COL_COUNT); - } - } - } - - @Override - protected JTable[] initializeTables(Object... args) { - // Initialize the table models. There should be one row and - // one column for each type of trigger plus an additional one - // of each for headers. - localModel = new TableTextModel(ROWS, COLUMNS); - globalModel = new TableTextModel(ROWS, COLUMNS); - - // Set the column headers. - for(int col = 0; col < COLUMNS; col++) { - localModel.setValueAt(COL_NAMES[col], 0, col); - globalModel.setValueAt(COL_NAMES[col], 0, col); - } - - // Set the row headers. - for(int row = 0; row < ROWS; row++) { - localModel.setValueAt(ROW_NAMES[row], row, 0); - globalModel.setValueAt(ROW_NAMES[row], row, 0); - } - - // Make a cell renderer. - DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer(); - centerRenderer.setHorizontalAlignment(JLabel.CENTER); - - // Create JTable objects to display the data. - JTable localTable = new JTable(localModel); - localTable.setRowSelectionAllowed(false); - localTable.setColumnSelectionAllowed(false); - localTable.setCellSelectionEnabled(false); - localTable.setShowVerticalLines(false); - localTable.getColumnModel().getColumn(0).setMaxWidth(150); - localTable.getColumnModel().getColumn(COL_COUNT).setMaxWidth(150); - for(int col = 1; col < COLUMNS; col++) { - localTable.getColumnModel().getColumn(col).setCellRenderer(centerRenderer); - } - localTable.setFont(new Font("monospaced", localTable.getFont().getStyle(), localTable.getFont().getSize())); - - JTable globalTable = new JTable(globalModel); - globalTable.setRowSelectionAllowed(false); - globalTable.setColumnSelectionAllowed(false); - globalTable.setCellSelectionEnabled(false); - globalTable.setShowVerticalLines(false); - globalTable.getColumnModel().getColumn(0).setMaxWidth(150); - globalTable.getColumnModel().getColumn(COL_COUNT).setMaxWidth(150); - for(int col = 1; col < COLUMNS; col++) { - globalTable.getColumnModel().getColumn(col).setCellRenderer(centerRenderer); - } - globalTable.setFont(new Font("monospaced", globalTable.getFont().getStyle(), globalTable.getFont().getSize())); - - // Return the tables. - return new JTable[] { localTable, globalTable }; - } - + // Static variables. + private static final long serialVersionUID = 0L; + + // Table models. + private TableTextModel localModel; + private TableTextModel globalModel; + + // Column/row reference variables. + private static final int ROWS = 7; + private static final int COLUMNS = 6; + /* private static final int COL_HEADER = 0; + private static final int COL_SINGLES_0 = 1; + private static final int COL_SINGLES_1 = 2; + private static final int COL_PAIR_0 = 3; + private static final int COL_PAIR_1 = 4; */ + private static final int COL_COUNT = 5; + /* private static final int ROW_HEADER = 0; + private static final int ROW_PULSER = 1; + private static final int ROW_COSMIC = 2; + private static final int ROW_SINGLES_0 = 3; + private static final int ROW_SINGLES_1 = 4; + private static final int ROW_PAIR_0 = 5; + private static final int ROW_PAIR_1 = 6; */ + + // Global/local reference variables. + private static final int GLOBAL = 0; + private static final int LOCAL = 1; + + // Trigger type reference variables. + private static final int TYPE_SINGLES_0 = TriggerStatModule.SINGLES_0; + private static final int TYPE_SINGLES_1 = TriggerStatModule.SINGLES_1; + private static final int TYPE_PAIR_0 = TriggerStatModule.PAIR_0; + private static final int TYPE_PAIR_1 = TriggerStatModule.PAIR_1; + + // Column/row header names. + private static final String[] COL_NAMES = { + "", "Singles 0", "Singles 1", "Pair 0", "Pair 1", "Count" + }; + private static final String[] ROW_NAMES = { + "", "Singles 0", "Singles 1", "Pair 0", "Pair 1", "Pulser", "Cosmic" + //"", "Random", "Cosmic", "Singles 0", "Singles 1", "Pair 0", "Pair 1" + }; + + /** + * Instantiates a new <code>EfficiencyTablePanel</code>. + */ + public EfficiencyTablePanel() { + // Instantiate the superclass. + super(); + + // Set the orientation to vertical. + setOrientation(ORIENTATION_VERTICAL); + } + + @Override + public void updatePanel(DiagnosticSnapshot runSnapshot, DiagnosticSnapshot localSnapshot) { + // If there is no snapshot, the tables should all display an + // empty value. + if(runSnapshot == null || localSnapshot == null) { + for(int row = 1; row < ROWS; row++) { + for(int col = 1; col < COLUMNS; col++) { + localModel.setValueAt("---", row, col); + globalModel.setValueAt("---", row, col); + } + } + } + + // Otherwise, update the table cells from the snapshot data. + else { + // Get the efficiency modules. + DiagnosticSnapshot[] stat = new DiagnosticSnapshot[2]; + stat[GLOBAL] = runSnapshot; + stat[LOCAL] = localSnapshot; + + // Get the trigger count for each trigger type for both the + // local and global snapshots. + int[][][] matched = new int[2][4][6]; + int[][][] triggers = new int[2][4][6]; + for(int i = 0; i < 2; i++) { + for(int triggerType = 0; triggerType < 6; triggerType++) { + // Get the total triggers seen for each type. + triggers[i][TYPE_SINGLES_0][triggerType] = stat[i].getSingles0Stats().getSSPSimulatedTriggers(triggerType); + triggers[i][TYPE_SINGLES_1][triggerType] = stat[i].getSingles1Stats().getSSPSimulatedTriggers(triggerType); + triggers[i][TYPE_PAIR_0][triggerType] = stat[i].getPair0Stats().getSSPSimulatedTriggers(triggerType); + triggers[i][TYPE_PAIR_1][triggerType] = stat[i].getPair1Stats().getSSPSimulatedTriggers(triggerType); + + // Get the total triggers matched for each type. + matched[i][TYPE_SINGLES_0][triggerType] = stat[i].getSingles0Stats().getMatchedSSPSimulatedTriggers(triggerType); + matched[i][TYPE_SINGLES_1][triggerType] = stat[i].getSingles1Stats().getMatchedSSPSimulatedTriggers(triggerType); + matched[i][TYPE_PAIR_0][triggerType] = stat[i].getPair0Stats().getMatchedSSPSimulatedTriggers(triggerType); + matched[i][TYPE_PAIR_1][triggerType] = stat[i].getPair1Stats().getMatchedSSPSimulatedTriggers(triggerType); + } + } + + // Determine the spacing needed to display the largest numerical + // cell value. + int numWidth = -1; + for(int tiTriggerType = 0; tiTriggerType < 6; tiTriggerType++) { + for(int seenTriggerType = 0; seenTriggerType < 4; seenTriggerType++) { + int rSize = ComponentUtils.getDigits(triggers[GLOBAL][seenTriggerType][tiTriggerType]); + int lSize = ComponentUtils.getDigits(triggers[LOCAL][seenTriggerType][tiTriggerType]); + numWidth = ComponentUtils.max(numWidth, rSize, lSize); + } + } + + // Generate the format string for the cells. + String format = "%" + numWidth + "d / %" + numWidth + "d"; + + // Update the table. + for(int tiTriggerType = 0; tiTriggerType < 6; tiTriggerType++) { + // Fill the row/column combinations that hold trigger + // statistical information. + for(int seenTriggerType = 0; seenTriggerType < 4; seenTriggerType++) { + // Fill the local table cell. + String localText = String.format(format, matched[LOCAL][seenTriggerType][tiTriggerType], + triggers[LOCAL][seenTriggerType][tiTriggerType]); + if(triggers[LOCAL][seenTriggerType][tiTriggerType] == 0) { + localText = localText + " ( N/A %)"; + } else { + localText = String.format("%s (%7.3f%%)", localText, + (100.0 * matched[LOCAL][seenTriggerType][tiTriggerType] / triggers[LOCAL][seenTriggerType][tiTriggerType])); + } + localModel.setValueAt(localText, tiTriggerType + 1, seenTriggerType + 1); + + // Fill the global table cell. + String globalText = String.format(format, matched[GLOBAL][seenTriggerType][tiTriggerType], + triggers[GLOBAL][seenTriggerType][tiTriggerType]); + if(triggers[GLOBAL][seenTriggerType][tiTriggerType] == 0) { + globalText = globalText + " ( N/A %)"; + } else { + globalText = String.format("%s (%7.3f%%)", globalText, + (100.0 * matched[GLOBAL][seenTriggerType][tiTriggerType] / triggers[GLOBAL][seenTriggerType][tiTriggerType])); + } + globalModel.setValueAt(globalText, tiTriggerType + 1, seenTriggerType + 1); + } + + // Populate the count column. + localModel.setValueAt("" + stat[LOCAL].getTITriggers(tiTriggerType, true), tiTriggerType + 1, COL_COUNT); + globalModel.setValueAt("" + stat[GLOBAL].getTITriggers(tiTriggerType, true), tiTriggerType + 1, COL_COUNT); + } + } + } + + @Override + protected JTable[] initializeTables(Object... args) { + // Initialize the table models. There should be one row and + // one column for each type of trigger plus an additional one + // of each for headers. + localModel = new TableTextModel(ROWS, COLUMNS); + globalModel = new TableTextModel(ROWS, COLUMNS); + + // Set the column headers. + for(int col = 0; col < COLUMNS; col++) { + localModel.setValueAt(COL_NAMES[col], 0, col); + globalModel.setValueAt(COL_NAMES[col], 0, col); + } + + // Set the row headers. + for(int row = 0; row < ROWS; row++) { + localModel.setValueAt(ROW_NAMES[row], row, 0); + globalModel.setValueAt(ROW_NAMES[row], row, 0); + } + + // Make a cell renderer. + DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer(); + centerRenderer.setHorizontalAlignment(JLabel.CENTER); + + // Create JTable objects to display the data. + JTable localTable = new JTable(localModel); + localTable.setRowSelectionAllowed(false); + localTable.setColumnSelectionAllowed(false); + localTable.setCellSelectionEnabled(false); + localTable.setShowVerticalLines(false); + localTable.getColumnModel().getColumn(0).setMaxWidth(150); + localTable.getColumnModel().getColumn(COL_COUNT).setMaxWidth(150); + for(int col = 1; col < COLUMNS; col++) { + localTable.getColumnModel().getColumn(col).setCellRenderer(centerRenderer); + } + localTable.setFont(new Font("monospaced", localTable.getFont().getStyle(), localTable.getFont().getSize())); + + JTable globalTable = new JTable(globalModel); + globalTable.setRowSelectionAllowed(false); + globalTable.setColumnSelectionAllowed(false); + globalTable.setCellSelectionEnabled(false); + globalTable.setShowVerticalLines(false); + globalTable.getColumnModel().getColumn(0).setMaxWidth(150); + globalTable.getColumnModel().getColumn(COL_COUNT).setMaxWidth(150); + for(int col = 1; col < COLUMNS; col++) { + globalTable.getColumnModel().getColumn(col).setCellRenderer(centerRenderer); + } + globalTable.setFont(new Font("monospaced", globalTable.getFont().getStyle(), globalTable.getFont().getSize())); + + // Return the tables. + return new JTable[] { localTable, globalTable }; + } + } Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/PairTablePanel.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/PairTablePanel.java (original) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/PairTablePanel.java Wed Mar 9 11:43:24 2016 @@ -7,14 +7,14 @@ * @author Kyle McCarty */ public class PairTablePanel extends AbstractTriggerTablePanel { - // Static variables. - private static final long serialVersionUID = 0L; - private static final String[] CUT_NAMES = { " Energy Sum:", - " Energy Difference:", " Energy Slope:", " Coplanarity:" }; - - /** - * Instantiates a <code>PairTablePanel</code>. - */ - public PairTablePanel() { super(CUT_NAMES, false); } - + // Static variables. + private static final long serialVersionUID = 0L; + private static final String[] CUT_NAMES = { " Energy Sum:", + " Energy Difference:", " Energy Slope:", " Coplanarity:" }; + + /** + * Instantiates a <code>PairTablePanel</code>. + */ + public PairTablePanel() { super(CUT_NAMES, false); } + } Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/ShifterTrigPanel.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/ShifterTrigPanel.java (original) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/ShifterTrigPanel.java Wed Mar 9 11:43:24 2016 @@ -12,291 +12,291 @@ import org.hps.analysis.trigger.util.ComponentUtils; public class ShifterTrigPanel extends JPanel { - private static final Color BG_WARNING = new Color(255, 235, 20); - private static final Color BG_CRITICAL = new Color(230, 0, 0); - private static final Color FONT_WARNING = new Color(255, 157, 0); - private static final Color FONT_CRITICAL = new Color(117, 0, 0); - private static final long serialVersionUID = 1L; - - private JLabel panelTitle; - private JLabel[] fieldTitle; - private JLabel[] fieldValue; - - /** - * Instantiates a new <code>ShifterTrigPanel</code> with the - * indicated name. - */ - public ShifterTrigPanel(String name) { - // Instantiate a layout for the fields. - SpringLayout layout = new SpringLayout(); - setLayout(layout); - - // Instantiate the header title. - panelTitle = new JLabel(name); - panelTitle.setVerticalAlignment(JLabel.CENTER); - panelTitle.setHorizontalAlignment(JLabel.CENTER); - add(panelTitle); - - // Instantiate the field title labels. - String[] titleName = { "Cluster Efficiency", "Singles 0 Logic Efficiency", - "Singles 0 Trigger Efficiency", "Singles 1 Logic Efficiency", - "Singles 1 Trigger Efficiency", "Pair 0 Logic Efficiency", - "Pair 0 Trigger Efficiency", "Pair 1 Logic Efficiency", "Pair 1 Trigger Efficiency" }; - fieldTitle = new JLabel[titleName.length]; - for(int index = 0; index < titleName.length; index++) { - fieldTitle[index] = new JLabel(titleName[index]); - fieldTitle[index].setVerticalAlignment(JLabel.CENTER); - fieldTitle[index].setHorizontalAlignment(JLabel.RIGHT); - fieldTitle[index].setOpaque(true); - add(fieldTitle[index]); - } - - // Instantiate the field value labels. - fieldValue = new JLabel[titleName.length]; - for(int index = 0; index < titleName.length; index++) { - fieldValue[index] = new JLabel(""); - fieldValue[index].setVerticalAlignment(JLabel.CENTER); - fieldValue[index].setHorizontalAlignment(JLabel.LEFT); - fieldValue[index].setOpaque(true); - add(fieldValue[index]); - } - - // Get the longest title. - int maxWidth = -1; - int maxIndex = -1; - for(int index = 0; index < titleName.length; index++) { - int width = fieldTitle[index].getFontMetrics(fieldTitle[index].getFont()).stringWidth(titleName[index]); - if(width > maxWidth) { - maxWidth = width; - maxIndex = index; - } - } - - // Define border edge and spacing variables. - String EAST = SpringLayout.EAST; - String WEST = SpringLayout.WEST; - String NORTH = SpringLayout.NORTH; - String SOUTH = SpringLayout.SOUTH; - int hinternal = 5; - int vinternal = 10; - int hexternal = 5; - int vexternal = 5; - - // Position the panel header. - layout.putConstraint(EAST, panelTitle, hexternal, EAST, this); - layout.putConstraint(WEST, panelTitle, hexternal, WEST, this); - layout.putConstraint(NORTH, panelTitle, vexternal, NORTH, this); - - // Position the field entries. - Component lastComp = panelTitle; - for(int index = 0; index < titleName.length; index++) { - // For all field titles except the largest, lock the right - // edge of the title to match the position of the largest - // title's right edge. The largest title is allowed to size - // itself to its preferred width. - if(index == maxIndex) { - layout.putConstraint(NORTH, fieldTitle[index], vinternal, SOUTH, lastComp); - layout.putConstraint(WEST, fieldTitle[index], hexternal, WEST, this); - } else { - layout.putConstraint(NORTH, fieldTitle[index], vinternal, SOUTH, lastComp); - layout.putConstraint(WEST, fieldTitle[index], hexternal, WEST, this); - layout.putConstraint(EAST, fieldTitle[index], 0, EAST, fieldTitle[maxIndex]); - } - - // Position the field value label to the right of the field - // title label. It should use up the remainder of the width - // allowed by the component. - layout.putConstraint(WEST, fieldValue[index], hinternal, EAST, fieldTitle[index]); - layout.putConstraint(EAST, fieldValue[index], hexternal, EAST, this); - layout.putConstraint(NORTH, fieldValue[index], vinternal, SOUTH, lastComp); - - // Update the "last component" to the current field title - // label. - lastComp = fieldTitle[index]; - } - - // Update the fonts. - setFont(getFont()); - } - - @Override - public void setBackground(Color bg) { - // Set the superclass background. - super.setBackground(bg); - - // Set the component backgrounds. - if(panelTitle != null) { - panelTitle.setBackground(bg); - for(int index = 0; index < fieldTitle.length; index++) { - fieldTitle[index].setBackground(bg); - - // If the field value label has a special alert color, - // then do not overwrite it. - if(!fieldValue[index].getBackground().equals(BG_WARNING) - && !fieldValue[index].getBackground().equals(BG_CRITICAL)) { - fieldValue[index].setBackground(bg); - } - } - } - } - - @Override - public void setFont(Font font) { - // Set the superclass font. - super.setFont(font); - - // Set the component fonts. - if(panelTitle != null) { - panelTitle.setFont(font.deriveFont(Font.BOLD, (float) (font.getSize2D() * 1.5))); - for(int index = 0; index < fieldTitle.length; index++) { - fieldTitle[index].setFont(font.deriveFont(Font.BOLD)); - fieldValue[index].setFont(font); - } - } - } - - @Override - public void setForeground(Color fg) { - // Set the superclass foreground. - super.setForeground(fg); - - // Set the component backgrounds. - if(panelTitle != null) { - panelTitle.setForeground(fg); - for(int index = 0; index < fieldTitle.length; index++) { - fieldTitle[index].setForeground(fg); - - // If the field value label has a special alert color, - // then do not overwrite it. - if(!fieldValue[index].getForeground().equals(FONT_WARNING) - && !fieldValue[index].getForeground().equals(FONT_CRITICAL)) { - fieldValue[index].setBackground(fg); - } - } - } - } - - /** - * Updates the panel statistical display with data from the - * argument snapshot. - * @param stat - The snapshot from which to derive statistical - * data. - */ - public void updatePanel(DiagnosticSnapshot stat) { - // If the snapshot is null, insert "null" values in the - // field panels, - if(stat == null) { - // Populate the fields with a "null" entry. - for(int index = 0; index < fieldValue.length; index++) { - fieldValue[index].setText("--- / --- ( N/A %)"); - } - - // No data exists, so no further processing is needed. - return; - } - - // Define index constants. - int RECON = 0; - int SSP = 1; - int TRIGGER_0 = 0; - int TRIGGER_1 = 1; - - // Get the tracked values from the snapshot. - int seenClusters = stat.getClusterStats().getReconClusterCount(); - int[][] seenSinglesTriggers = { - { stat.getSingles0Stats().getReconSimulatedTriggers(), stat.getSingles1Stats().getReconSimulatedTriggers() }, - { stat.getSingles0Stats().getSSPSimulatedTriggers(), stat.getSingles1Stats().getSSPSimulatedTriggers() } - }; - int[][] seenPairTriggers = { + private static final Color BG_WARNING = new Color(255, 235, 20); + private static final Color BG_CRITICAL = new Color(230, 0, 0); + private static final Color FONT_WARNING = new Color(255, 157, 0); + private static final Color FONT_CRITICAL = new Color(117, 0, 0); + private static final long serialVersionUID = 1L; + + private JLabel panelTitle; + private JLabel[] fieldTitle; + private JLabel[] fieldValue; + + /** + * Instantiates a new <code>ShifterTrigPanel</code> with the + * indicated name. + */ + public ShifterTrigPanel(String name) { + // Instantiate a layout for the fields. + SpringLayout layout = new SpringLayout(); + setLayout(layout); + + // Instantiate the header title. + panelTitle = new JLabel(name); + panelTitle.setVerticalAlignment(JLabel.CENTER); + panelTitle.setHorizontalAlignment(JLabel.CENTER); + add(panelTitle); + + // Instantiate the field title labels. + String[] titleName = { "Cluster Efficiency", "Singles 0 Logic Efficiency", + "Singles 0 Trigger Efficiency", "Singles 1 Logic Efficiency", + "Singles 1 Trigger Efficiency", "Pair 0 Logic Efficiency", + "Pair 0 Trigger Efficiency", "Pair 1 Logic Efficiency", "Pair 1 Trigger Efficiency" }; + fieldTitle = new JLabel[titleName.length]; + for(int index = 0; index < titleName.length; index++) { + fieldTitle[index] = new JLabel(titleName[index]); + fieldTitle[index].setVerticalAlignment(JLabel.CENTER); + fieldTitle[index].setHorizontalAlignment(JLabel.RIGHT); + fieldTitle[index].setOpaque(true); + add(fieldTitle[index]); + } + + // Instantiate the field value labels. + fieldValue = new JLabel[titleName.length]; + for(int index = 0; index < titleName.length; index++) { + fieldValue[index] = new JLabel(""); + fieldValue[index].setVerticalAlignment(JLabel.CENTER); + fieldValue[index].setHorizontalAlignment(JLabel.LEFT); + fieldValue[index].setOpaque(true); + add(fieldValue[index]); + } + + // Get the longest title. + int maxWidth = -1; + int maxIndex = -1; + for(int index = 0; index < titleName.length; index++) { + int width = fieldTitle[index].getFontMetrics(fieldTitle[index].getFont()).stringWidth(titleName[index]); + if(width > maxWidth) { + maxWidth = width; + maxIndex = index; + } + } + + // Define border edge and spacing variables. + String EAST = SpringLayout.EAST; + String WEST = SpringLayout.WEST; + String NORTH = SpringLayout.NORTH; + String SOUTH = SpringLayout.SOUTH; + int hinternal = 5; + int vinternal = 10; + int hexternal = 5; + int vexternal = 5; + + // Position the panel header. + layout.putConstraint(EAST, panelTitle, hexternal, EAST, this); + layout.putConstraint(WEST, panelTitle, hexternal, WEST, this); + layout.putConstraint(NORTH, panelTitle, vexternal, NORTH, this); + + // Position the field entries. + Component lastComp = panelTitle; + for(int index = 0; index < titleName.length; index++) { + // For all field titles except the largest, lock the right + // edge of the title to match the position of the largest + // title's right edge. The largest title is allowed to size + // itself to its preferred width. + if(index == maxIndex) { + layout.putConstraint(NORTH, fieldTitle[index], vinternal, SOUTH, lastComp); + layout.putConstraint(WEST, fieldTitle[index], hexternal, WEST, this); + } else { + layout.putConstraint(NORTH, fieldTitle[index], vinternal, SOUTH, lastComp); + layout.putConstraint(WEST, fieldTitle[index], hexternal, WEST, this); + layout.putConstraint(EAST, fieldTitle[index], 0, EAST, fieldTitle[maxIndex]); + } + + // Position the field value label to the right of the field + // title label. It should use up the remainder of the width + // allowed by the component. + layout.putConstraint(WEST, fieldValue[index], hinternal, EAST, fieldTitle[index]); + layout.putConstraint(EAST, fieldValue[index], hexternal, EAST, this); + layout.putConstraint(NORTH, fieldValue[index], vinternal, SOUTH, lastComp); + + // Update the "last component" to the current field title + // label. + lastComp = fieldTitle[index]; + } + + // Update the fonts. + setFont(getFont()); + } + + @Override + public void setBackground(Color bg) { + // Set the superclass background. + super.setBackground(bg); + + // Set the component backgrounds. + if(panelTitle != null) { + panelTitle.setBackground(bg); + for(int index = 0; index < fieldTitle.length; index++) { + fieldTitle[index].setBackground(bg); + + // If the field value label has a special alert color, + // then do not overwrite it. + if(!fieldValue[index].getBackground().equals(BG_WARNING) + && !fieldValue[index].getBackground().equals(BG_CRITICAL)) { + fieldValue[index].setBackground(bg); + } + } + } + } + + @Override + public void setFont(Font font) { + // Set the superclass font. + super.setFont(font); + + // Set the component fonts. + if(panelTitle != null) { + panelTitle.setFont(font.deriveFont(Font.BOLD, (float) (font.getSize2D() * 1.5))); + for(int index = 0; index < fieldTitle.length; index++) { + fieldTitle[index].setFont(font.deriveFont(Font.BOLD)); + fieldValue[index].setFont(font); + } + } + } + + @Override + public void setForeground(Color fg) { + // Set the superclass foreground. + super.setForeground(fg); + + // Set the component backgrounds. + if(panelTitle != null) { + panelTitle.setForeground(fg); + for(int index = 0; index < fieldTitle.length; index++) { + fieldTitle[index].setForeground(fg); + + // If the field value label has a special alert color, + // then do not overwrite it. + if(!fieldValue[index].getForeground().equals(FONT_WARNING) + && !fieldValue[index].getForeground().equals(FONT_CRITICAL)) { + fieldValue[index].setBackground(fg); + } + } + } + } + + /** + * Updates the panel statistical display with data from the + * argument snapshot. + * @param stat - The snapshot from which to derive statistical + * data. + */ + public void updatePanel(DiagnosticSnapshot stat) { + // If the snapshot is null, insert "null" values in the + // field panels, + if(stat == null) { + // Populate the fields with a "null" entry. + for(int index = 0; index < fieldValue.length; index++) { + fieldValue[index].setText("--- / --- ( N/A %)"); + } + + // No data exists, so no further processing is needed. + return; + } + + // Define index constants. + int RECON = 0; + int SSP = 1; + int TRIGGER_0 = 0; + int TRIGGER_1 = 1; + + // Get the tracked values from the snapshot. + int seenClusters = stat.getClusterStats().getReconClusterCount(); + int[][] seenSinglesTriggers = { + { stat.getSingles0Stats().getReconSimulatedTriggers(), stat.getSingles1Stats().getReconSimulatedTriggers() }, + { stat.getSingles0Stats().getSSPSimulatedTriggers(), stat.getSingles1Stats().getSSPSimulatedTriggers() } + }; + int[][] seenPairTriggers = { { stat.getPair0Stats().getReconSimulatedTriggers(), stat.getPair1Stats().getReconSimulatedTriggers() }, { stat.getPair0Stats().getSSPSimulatedTriggers(), stat.getPair1Stats().getSSPSimulatedTriggers() } - }; - int matchedClusters = stat.getClusterStats().getMatches(); - int[][] matchedSinglesTriggers = { + }; + int matchedClusters = stat.getClusterStats().getMatches(); + int[][] matchedSinglesTriggers = { { stat.getSingles0Stats().getMatchedReconSimulatedTriggers(), stat.getSingles1Stats().getMatchedReconSimulatedTriggers() }, { stat.getSingles0Stats().getMatchedSSPSimulatedTriggers(), stat.getSingles1Stats().getMatchedSSPSimulatedTriggers() } - }; - int[][] matchedPairTriggers = { + }; + int[][] matchedPairTriggers = { { stat.getPair0Stats().getMatchedReconSimulatedTriggers(), stat.getPair1Stats().getMatchedReconSimulatedTriggers() }, { stat.getPair0Stats().getMatchedSSPSimulatedTriggers(), stat.getPair1Stats().getMatchedSSPSimulatedTriggers() } - }; - - // Get the largest digit of the tracked values. This should - // always be one of the "seen" values. - int mostDigits = ComponentUtils.max(seenClusters, seenSinglesTriggers[0][0], seenSinglesTriggers[0][1], - seenSinglesTriggers[1][0], seenSinglesTriggers[1][1], seenPairTriggers[0][0], seenPairTriggers[0][1], - seenPairTriggers[1][0], seenPairTriggers[1][1]); - int spaces = ComponentUtils.getDigits(mostDigits); - - // Populate the cluster field panel. - processEfficiency(seenClusters, matchedClusters, 0, spaces, 0.98, 0.94); - - // Populate the singles trigger field panels. - processEfficiency(seenSinglesTriggers[RECON][TRIGGER_0], matchedSinglesTriggers[RECON][TRIGGER_0], 1, spaces, 0.99, 0.95); + }; + + // Get the largest digit of the tracked values. This should + // always be one of the "seen" values. + int mostDigits = ComponentUtils.max(seenClusters, seenSinglesTriggers[0][0], seenSinglesTriggers[0][1], + seenSinglesTriggers[1][0], seenSinglesTriggers[1][1], seenPairTriggers[0][0], seenPairTriggers[0][1], + seenPairTriggers[1][0], seenPairTriggers[1][1]); + int spaces = ComponentUtils.getDigits(mostDigits); + + // Populate the cluster field panel. + processEfficiency(seenClusters, matchedClusters, 0, spaces, 0.98, 0.94); + + // Populate the singles trigger field panels. + processEfficiency(seenSinglesTriggers[RECON][TRIGGER_0], matchedSinglesTriggers[RECON][TRIGGER_0], 1, spaces, 0.99, 0.95); processEfficiency(seenSinglesTriggers[SSP][TRIGGER_0], matchedSinglesTriggers[SSP][TRIGGER_0], 2, spaces, 0.99, 0.95); processEfficiency(seenSinglesTriggers[RECON][TRIGGER_1], matchedSinglesTriggers[RECON][TRIGGER_1], 3, spaces, 0.99, 0.95); processEfficiency(seenSinglesTriggers[SSP][TRIGGER_1], matchedSinglesTriggers[SSP][TRIGGER_1], 4, spaces, 0.99, 0.95); - - // Populate the pair trigger field panels. - processEfficiency(seenPairTriggers[RECON][TRIGGER_0], matchedPairTriggers[RECON][TRIGGER_0], 5, spaces, 0.99, 0.95); + + // Populate the pair trigger field panels. + processEfficiency(seenPairTriggers[RECON][TRIGGER_0], matchedPairTriggers[RECON][TRIGGER_0], 5, spaces, 0.99, 0.95); processEfficiency(seenPairTriggers[SSP][TRIGGER_0], matchedPairTriggers[SSP][TRIGGER_0], 6, spaces, 0.99, 0.95); processEfficiency(seenPairTriggers[RECON][TRIGGER_1], matchedPairTriggers[RECON][TRIGGER_1], 7, spaces, 0.99, 0.95); processEfficiency(seenPairTriggers[SSP][TRIGGER_1], matchedPairTriggers[SSP][TRIGGER_1], 8, spaces, 0.99, 0.95); - } - - /** - * Updates the indicated field value using the indicated number - * seen and matched elements. Automatically handles the special - * case of zero seen elements and also updates the colors of the - * field labels to the appropriate color based on the efficiency - * and the thresholds for warnings. - * @param seen - The number of elements seen. - * @param matched - The number of elements matched. - * @param fieldIndex - The index for the field that should display - * the statistical data. - * @param spaces - The number of spaces to giveto each displayed - * value. - * @param threshWarning - The threshold at which the "warning - * color should be used. - * @param threshCritical - The threshold at which the "critical" - * color should be used. - */ - private void processEfficiency(int seen, int matched, int fieldIndex, int spaces, double threshWarning, double threshCritical) { - // Calculate the efficiency. - double efficiency = 100.0 * matched / seen; - - // Create the format string. - String format = "%" + spaces + "d / %"; - - // If the number of values seen is zero, there is no - // percentage that can be calculated. - if(seen == 0) { - fieldValue[fieldIndex].setText(String.format(format + " ( N/A %%)", seen, matched)); - } - - // Otherwise, include the percentage. - else { - fieldValue[fieldIndex].setText(String.format(format + " (7.3f%%)", seen, matched, efficiency)); - } - - // If the efficiency is below the critical threshold, - // change the field background to the critical color. - if(efficiency < threshCritical) { - fieldValue[fieldIndex].setBackground(BG_CRITICAL); - fieldValue[fieldIndex].setForeground(FONT_CRITICAL); - } - - // Otherwise, if the efficiency is below the warning - // level, set the field background to the warning color. - else if(efficiency < threshWarning) { - fieldValue[fieldIndex].setBackground(BG_WARNING); - fieldValue[fieldIndex].setForeground(FONT_WARNING); - } - - // Otherwise, use the default component background. - else { - fieldValue[fieldIndex].setBackground(getBackground()); - fieldValue[fieldIndex].setForeground(getForeground()); - } - } + } + + /** + * Updates the indicated field value using the indicated number + * seen and matched elements. Automatically handles the special + * case of zero seen elements and also updates the colors of the + * field labels to the appropriate color based on the efficiency + * and the thresholds for warnings. + * @param seen - The number of elements seen. + * @param matched - The number of elements matched. + * @param fieldIndex - The index for the field that should display + * the statistical data. + * @param spaces - The number of spaces to giveto each displayed + * value. + * @param threshWarning - The threshold at which the "warning + * color should be used. + * @param threshCritical - The threshold at which the "critical" + * color should be used. + */ + private void processEfficiency(int seen, int matched, int fieldIndex, int spaces, double threshWarning, double threshCritical) { + // Calculate the efficiency. + double efficiency = 100.0 * matched / seen; + + // Create the format string. + String format = "%" + spaces + "d / %"; + + // If the number of values seen is zero, there is no + // percentage that can be calculated. + if(seen == 0) { + fieldValue[fieldIndex].setText(String.format(format + " ( N/A %%)", seen, matched)); + } + + // Otherwise, include the percentage. + else { + fieldValue[fieldIndex].setText(String.format(format + " (7.3f%%)", seen, matched, efficiency)); + } + + // If the efficiency is below the critical threshold, + // change the field background to the critical color. + if(efficiency < threshCritical) { + fieldValue[fieldIndex].setBackground(BG_CRITICAL); + fieldValue[fieldIndex].setForeground(FONT_CRITICAL); + } + + // Otherwise, if the efficiency is below the warning + // level, set the field background to the warning color. + else if(efficiency < threshWarning) { + fieldValue[fieldIndex].setBackground(BG_WARNING); + fieldValue[fieldIndex].setForeground(FONT_WARNING); + } + + // Otherwise, use the default component background. + else { + fieldValue[fieldIndex].setBackground(getBackground()); + fieldValue[fieldIndex].setForeground(getForeground()); + } + } } Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/ShifterTrigWindow.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/ShifterTrigWindow.java (original) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/ShifterTrigWindow.java Wed Mar 9 11:43:24 2016 @@ -12,25 +12,25 @@ * to either yellow or red if the efficiencies drop too low. */ public class ShifterTrigWindow extends JPanel implements DiagnosticUpdatable { - private static final long serialVersionUID = 1L; - private ShifterTrigPanel localPanel = new ShifterTrigPanel("Instantaneous"); - private ShifterTrigPanel globalPanel = new ShifterTrigPanel("Run-Integrated"); - - /** - * Instantiates a new panel for displaying basic information - * pertaining to trigger diagnostics. - */ - public ShifterTrigWindow() { - setLayout(new GridLayout(1, 2)); - add(localPanel); - add(globalPanel); - updatePanel(null, null); - } - - @Override - public void updatePanel(DiagnosticSnapshot runSnapshot, DiagnosticSnapshot localSnapshot) { - // Update each panel with the appropriate snapshot. - localPanel.updatePanel(localSnapshot); - globalPanel.updatePanel(runSnapshot); - } + private static final long serialVersionUID = 1L; + private ShifterTrigPanel localPanel = new ShifterTrigPanel("Instantaneous"); + private ShifterTrigPanel globalPanel = new ShifterTrigPanel("Run-Integrated"); + + /** + * Instantiates a new panel for displaying basic information + * pertaining to trigger diagnostics. + */ + public ShifterTrigWindow() { + setLayout(new GridLayout(1, 2)); + add(localPanel); + add(globalPanel); + updatePanel(null, null); + } + + @Override + public void updatePanel(DiagnosticSnapshot runSnapshot, DiagnosticSnapshot localSnapshot) { + // Update each panel with the appropriate snapshot. + localPanel.updatePanel(localSnapshot); + globalPanel.updatePanel(runSnapshot); + } } Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/SinglesTablePanel.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/SinglesTablePanel.java (original) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/SinglesTablePanel.java Wed Mar 9 11:43:24 2016 @@ -7,14 +7,14 @@ * @author Kyle McCarty */ public class SinglesTablePanel extends AbstractTriggerTablePanel { - // Static variables. - private static final long serialVersionUID = 0L; - private static final String[] CUT_NAMES = { " Cluster Energy (Low):", - " Cluster Energy (High):", " Hit Count:" }; - - /** - * Instantiates a <code>SinglesTablePanel</code>. - */ - public SinglesTablePanel() { super(CUT_NAMES, true); } - + // Static variables. + private static final long serialVersionUID = 0L; + private static final String[] CUT_NAMES = { " Cluster Energy (Low):", + " Cluster Energy (High):", " Hit Count:" }; + + /** + * Instantiates a <code>SinglesTablePanel</code>. + */ + public SinglesTablePanel() { super(CUT_NAMES, true); } + } Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/TableTextModel.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/TableTextModel.java (original) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/TableTextModel.java Wed Mar 9 11:43:24 2016 @@ -11,96 +11,96 @@ * @author Kyle McCarty <[log in to unmask]> */ public class TableTextModel extends AbstractTableModel { - // Serial UID. - private static final long serialVersionUID = 0L; - - // Stored values. - private final int rows, columns; - private final String[][] values; - - /** - * Instantiates a new <code>TableTextModel</code> with the indicated - * number of rows and columns. - * @param rows - The number of rows. - * @param columns - The number of columns. - */ - public TableTextModel(int rows, int columns) { - // Make sure that the arguments for rows and columns are valid. - if(rows < 1) { - throw new IllegalArgumentException("TableTextModel must have at least one row."); - } else if(columns < 1) { - throw new IllegalArgumentException("TableTextModel must have at least one column."); - } - - // Define the number of rows and columns. - this.rows = rows; - this.columns = columns; - - // Instantiate the data storage array. - values = new String[rows][columns]; - } - - @Override - public int getRowCount() { return rows; } - - @Override - public int getColumnCount() { return columns; } - - @Override - public Object getValueAt(int rowIndex, int columnIndex) { - // Ensure that the value is within the allowed range. - validateIndex(rowIndex, columnIndex); - - // Return the value. - return values[rowIndex][columnIndex]; - } - - @Override - public void setValueAt(Object value, int rowIndex, int columnIndex) { - // If the object is a string, pass it to the preferred handler. - // This can also be performed if the value is null. - if(value == null || value instanceof String) { - setValueAt((String) value, rowIndex, columnIndex); - } - - // Otherwise, cast the object to a string and use that instead. - else { setValueAt(value.toString(), rowIndex, columnIndex); } - } - - /** - * Sets the text for the indicated column and row of the table. - * @param value - The new text. - * @param rowIndex - The row. - * @param columnIndex - The column. - * @throws IndexOutOfBoundsException Occurs if the row and column - * are not a valid member of table model. - */ - public void setValueAt(String value, int rowIndex, int columnIndex) throws IndexOutOfBoundsException { - // Ensure that the value is within the allowed range. - validateIndex(rowIndex, columnIndex); - - // Set the value. - values[rowIndex][columnIndex] = value; - - // Update the table. - this.fireTableCellUpdated(rowIndex, columnIndex); - } - - /** - * Checks to make sure that a given row/column pointer refers to - * an extant position in the data array. In the event that the row - * and column values are not valid, an <code>IndexOutOfBounds</code> - * exception is thrown. - * @param rowIndex - The row index. - * @param columnIndex - The column index. - * @throws IndexOutOfBoundsException Occurs if the row and column - * are not a valid member of the data array. - */ - private void validateIndex(int rowIndex, int columnIndex) throws IndexOutOfBoundsException { - if(rowIndex < 0 || rowIndex >= getRowCount()) { - throw new IndexOutOfBoundsException(String.format("Row index %d is out of bounds.", rowIndex)); - } else if(columnIndex < 0 || columnIndex >= getColumnCount()) { - throw new IndexOutOfBoundsException(String.format("Column index %d is out of bounds.", columnIndex)); - } - } + // Serial UID. + private static final long serialVersionUID = 0L; + + // Stored values. + private final int rows, columns; + private final String[][] values; + + /** + * Instantiates a new <code>TableTextModel</code> with the indicated + * number of rows and columns. + * @param rows - The number of rows. + * @param columns - The number of columns. + */ + public TableTextModel(int rows, int columns) { + // Make sure that the arguments for rows and columns are valid. + if(rows < 1) { + throw new IllegalArgumentException("TableTextModel must have at least one row."); + } else if(columns < 1) { + throw new IllegalArgumentException("TableTextModel must have at least one column."); + } + + // Define the number of rows and columns. + this.rows = rows; + this.columns = columns; + + // Instantiate the data storage array. + values = new String[rows][columns]; + } + + @Override + public int getRowCount() { return rows; } + + @Override + public int getColumnCount() { return columns; } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + // Ensure that the value is within the allowed range. + validateIndex(rowIndex, columnIndex); + + // Return the value. + return values[rowIndex][columnIndex]; + } + + @Override + public void setValueAt(Object value, int rowIndex, int columnIndex) { + // If the object is a string, pass it to the preferred handler. + // This can also be performed if the value is null. + if(value == null || value instanceof String) { + setValueAt((String) value, rowIndex, columnIndex); + } + + // Otherwise, cast the object to a string and use that instead. + else { setValueAt(value.toString(), rowIndex, columnIndex); } + } + + /** + * Sets the text for the indicated column and row of the table. + * @param value - The new text. + * @param rowIndex - The row. + * @param columnIndex - The column. + * @throws IndexOutOfBoundsException Occurs if the row and column + * are not a valid member of table model. + */ + public void setValueAt(String value, int rowIndex, int columnIndex) throws IndexOutOfBoundsException { + // Ensure that the value is within the allowed range. + validateIndex(rowIndex, columnIndex); + + // Set the value. + values[rowIndex][columnIndex] = value; + + // Update the table. + this.fireTableCellUpdated(rowIndex, columnIndex); + } + + /** + * Checks to make sure that a given row/column pointer refers to + * an extant position in the data array. In the event that the row + * and column values are not valid, an <code>IndexOutOfBounds</code> + * exception is thrown. + * @param rowIndex - The row index. + * @param columnIndex - The column index. + * @throws IndexOutOfBoundsException Occurs if the row and column + * are not a valid member of the data array. + */ + private void validateIndex(int rowIndex, int columnIndex) throws IndexOutOfBoundsException { + if(rowIndex < 0 || rowIndex >= getRowCount()) { + throw new IndexOutOfBoundsException(String.format("Row index %d is out of bounds.", rowIndex)); + } else if(columnIndex < 0 || columnIndex >= getColumnCount()) { + throw new IndexOutOfBoundsException(String.format("Column index %d is out of bounds.", columnIndex)); + } + } } Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/TriggerDiagnosticGUIDriver.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/TriggerDiagnosticGUIDriver.java (original) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/trigger/TriggerDiagnosticGUIDriver.java Wed Mar 9 11:43:24 2016 @@ -9,45 +9,45 @@ import org.lcsim.util.Driver; public class TriggerDiagnosticGUIDriver extends Driver { - private JFrame window = new JFrame(); - private ClusterTablePanel clusterTable = new ClusterTablePanel(); - private SinglesTablePanel singlesTable = new SinglesTablePanel(); - private PairTablePanel pairTable = new PairTablePanel(); - private EfficiencyTablePanel efficiencyTable = new EfficiencyTablePanel(); - private String diagnosticCollectionName = "DiagnosticSnapshot"; - - @Override - public void startOfData() { - window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - window.setSize(500, 400); - //window.add(clusterTable); - //window.add(singlesTable); - //window.add(pairTable); - window.add(efficiencyTable); - window.setVisible(true); - } - - @Override - public void process(EventHeader event) { - // Updates are only performed if a diagnostic snapshot object - // exists. Otherwise, do nothing. - if(event.hasCollection(DiagnosticSnapshot.class, diagnosticCollectionName)) { - // Get the snapshot collection. - List<DiagnosticSnapshot> snapshotList = event.get(DiagnosticSnapshot.class, diagnosticCollectionName); - - // Get the snapshot. There will only ever be one. - DiagnosticSnapshot runSnapshot = snapshotList.get(1); - DiagnosticSnapshot localSnapshot = snapshotList.get(0); - - // Feed it to the table. - clusterTable.updatePanel(runSnapshot, localSnapshot); - singlesTable.updatePanel(runSnapshot, localSnapshot); - pairTable.updatePanel(runSnapshot, localSnapshot); - efficiencyTable.updatePanel(runSnapshot, localSnapshot); - } - } - - public void setDiagnosticCollectionName(String name) { - diagnosticCollectionName = name; - } + private JFrame window = new JFrame(); + private ClusterTablePanel clusterTable = new ClusterTablePanel(); + private SinglesTablePanel singlesTable = new SinglesTablePanel(); + private PairTablePanel pairTable = new PairTablePanel(); + private EfficiencyTablePanel efficiencyTable = new EfficiencyTablePanel(); + private String diagnosticCollectionName = "DiagnosticSnapshot"; + + @Override + public void startOfData() { + window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + window.setSize(500, 400); + //window.add(clusterTable); + //window.add(singlesTable); + //window.add(pairTable); + window.add(efficiencyTable); + window.setVisible(true); + } + + @Override + public void process(EventHeader event) { + // Updates are only performed if a diagnostic snapshot object + // exists. Otherwise, do nothing. + if(event.hasCollection(DiagnosticSnapshot.class, diagnosticCollectionName)) { + // Get the snapshot collection. + List<DiagnosticSnapshot> snapshotList = event.get(DiagnosticSnapshot.class, diagnosticCollectionName); + + // Get the snapshot. There will only ever be one. + DiagnosticSnapshot runSnapshot = snapshotList.get(1); + DiagnosticSnapshot localSnapshot = snapshotList.get(0); + + // Feed it to the table. + clusterTable.updatePanel(runSnapshot, localSnapshot); + singlesTable.updatePanel(runSnapshot, localSnapshot); + pairTable.updatePanel(runSnapshot, localSnapshot); + efficiencyTable.updatePanel(runSnapshot, localSnapshot); + } + } + + public void setDiagnosticCollectionName(String name) { + diagnosticCollectionName = name; + } } Modified: java/trunk/parent/pom.xml ============================================================================= --- java/trunk/parent/pom.xml (original) +++ java/trunk/parent/pom.xml Wed Mar 9 11:43:24 2016 @@ -1,4 +1,5 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <prerequisites> <maven>3.0</maven> </prerequisites> @@ -43,7 +44,7 @@ <id>srs-repo-public</id> <name>SRS</name> <url>http://srs.slac.stanford.edu/nexus/content/groups/srs-maven2-public/</url> - </repository> + </repository> <repository> <id>lcsim-repo-public</id> <name>LCSim</name> @@ -66,13 +67,13 @@ <repository> <id>lcsim-repo-releases</id> <name>LCSim Releases</name> - <!--<url>http://srs.slac.stanford.edu/nexus/content/repositories/lcsim-maven2-releases/</url>--> + <!--<url>http://srs.slac.stanford.edu/nexus/content/repositories/lcsim-maven2-releases/</url> --> <url>http://scalnx-v01.slac.stanford.edu:8180/nexus/content/repositories/lcsim-maven2-releases/</url> </repository> <snapshotRepository> <id>lcsim-repo-snapshots</id> <name>LCSim Snapshots</name> - <!--<url>http://srs.slac.stanford.edu/nexus/content/repositories/lcsim-maven2-snapshot/</url>--> + <!--<url>http://srs.slac.stanford.edu/nexus/content/repositories/lcsim-maven2-snapshot/</url> --> <url>http://scalnx-v01.slac.stanford.edu:8180/nexus/content/repositories/lcsim-maven2-snapshot/</url> </snapshotRepository> <site> @@ -342,12 +343,8 @@ <artifactId>maven-surefire-report-plugin</artifactId> <version>2.17</version> </plugin> - <!-- - <plugin> - <groupId>org.kuali.maven.plugins</groupId> - <artifactId>graph-maven-plugin</artifactId> - </plugin> - --> + <!-- <plugin> <groupId>org.kuali.maven.plugins</groupId> <artifactId>graph-maven-plugin</artifactId> + </plugin> --> </plugins> </reporting> <build> @@ -380,7 +377,8 @@ <artifactId>maven-antrun-plugin</artifactId> <version>1.7</version> </plugin> - <!-- This fixes the lifecycle not covered by plugin execution error in Eclipse. --> + <!-- This fixes the lifecycle not covered by plugin execution + error in Eclipse. --> <plugin> <groupId>org.eclipse.m2e</groupId> <artifactId>lifecycle-mapping</artifactId> @@ -407,13 +405,8 @@ </lifecycleMappingMetadata> </configuration> </plugin> - <!-- - <plugin> - <groupId>org.kuali.maven.plugins</groupId> - <artifactId>graph-maven-plugin</artifactId> - <version>1.2.3</version> - </plugin> - --> + <!-- <plugin> <groupId>org.kuali.maven.plugins</groupId> + <artifactId>graph-maven-plugin</artifactId> <version>1.2.3</version> </plugin> --> </plugins> </pluginManagement> <plugins> @@ -433,10 +426,7 @@ <target>1.7</target> <showWarnings>true</showWarnings> <showDeprecation>true</showDeprecation> - <!-- - <staleMillis>1</staleMillis> - <useIncrementalCompilation>false</useIncrementalCompilation> - --> + <!-- <staleMillis>1</staleMillis> <useIncrementalCompilation>false</useIncrementalCompilation> --> </configuration> </plugin> <plugin> @@ -446,7 +436,7 @@ <configuration> <argLine>-Xmx1024m</argLine> <forkMode>pertest</forkMode> - <systemPropertyVariables> + <systemPropertyVariables> <org.lcsim.cacheDir>${org.lcsim.cacheDir}</org.lcsim.cacheDir> <java.util.logging.config.class>org.hps.logging.config.TestLoggingConfig</java.util.logging.config.class> </systemPropertyVariables> @@ -469,7 +459,8 @@ <configuration> <target> <!-- Create the directory for test output. --> - <mkdir dir="${project.build.directory}/test-output" /> + <mkdir + dir="${project.build.directory}/test-output" /> </target> </configuration> <goals> @@ -486,7 +477,33 @@ <plugin> <artifactId>maven-resources-plugin</artifactId> <version>2.7</version> - </plugin> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-checkstyle-plugin</artifactId> + <version>2.17</version> + <configuration> + <logViolationsToConsole>true</logViolationsToConsole> + <consoleOutput>true</consoleOutput> + <includeResources>true</includeResources> + <includeTestResources>true</includeTestResources> + <checkstyleRules> + <module name="Checker">a + <module name="FileTabCharacter"> + <property name="fileExtensions" value="java,xml,lcsim"/> + </module> + </module> + </checkstyleRules> + </configuration> + <executions> + <execution> + <phase>compile</phase> + <goals> + <goal>check</goal> + </goals> + </execution> + </executions> + </plugin> </plugins> </build> <developers> @@ -560,7 +577,7 @@ </roles> <timezone>-8</timezone> </developer> - <developer> + <developer> <name>Holly Szumila-Vance</name> <email>[log in to unmask]</email> <organization>Old Dominion University</organization> Modified: java/trunk/recon/src/main/java/org/hps/recon/filtering/CosmicPMTFilter.java ============================================================================= --- java/trunk/recon/src/main/java/org/hps/recon/filtering/CosmicPMTFilter.java (original) +++ java/trunk/recon/src/main/java/org/hps/recon/filtering/CosmicPMTFilter.java Wed Mar 9 11:43:24 2016 @@ -8,63 +8,63 @@ import org.lcsim.util.aida.AIDA; public class CosmicPMTFilter extends Driver { - - // class storing raw PMT readout: - static final String CLASSNAME="FADCGenericHits"; + + // class storing raw PMT readout: + static final String CLASSNAME="FADCGenericHits"; - // hardware location of PMTs: - static final int CRATE=2; // this is hps2, crate #37 in EVIO - static final int SLOT=20; - static final int CHANNELS[]={13,14}; - - // cuts on pulse integrals for cosmic signals (units ADC): - static final float CUTS[]={2000,4000}; + // hardware location of PMTs: + static final int CRATE=2; // this is hps2, crate #37 in EVIO + static final int SLOT=20; + static final int CHANNELS[]={13,14}; + + // cuts on pulse integrals for cosmic signals (units ADC): + static final float CUTS[]={2000,4000}; - // number of samples to use at beginning of window for pedestal: - static final int NPEDSAMP=20; + // number of samples to use at beginning of window for pedestal: + static final int NPEDSAMP=20; - AIDA aida = AIDA.defaultInstance(); + AIDA aida = AIDA.defaultInstance(); - public void detectorChanged(Detector detector) { - aida.tree().cd("/"); - aida.histogram2D("CosmicPMTs",400,0,10000,400,0,10000); + public void detectorChanged(Detector detector) { + aida.tree().cd("/"); + aida.histogram2D("CosmicPMTs",400,0,10000,400,0,10000); } - public void process(EventHeader event) { - - // find PMT data: - FADCGenericHit pmt1=null,pmt2=null; - if (!event.hasCollection(GenericObject.class,CLASSNAME)) - throw new Driver.NextEventException(); - for (GenericObject gob : event.get(GenericObject.class,CLASSNAME)) { - FADCGenericHit hit=(FADCGenericHit)gob; - if (hit.getCrate()==CRATE && hit.getSlot()==SLOT) { - if (hit.getChannel()==CHANNELS[0]) pmt1=hit; - else if (hit.getChannel()==CHANNELS[1]) pmt2=hit; - } - } - if (pmt1==null || pmt2==null) throw new Driver.NextEventException(); - - // calculate and histogram pulse integrals: - float pulse1=getPulseIntegral(pmt1); - float pulse2=getPulseIntegral(pmt2); + public void process(EventHeader event) { + + // find PMT data: + FADCGenericHit pmt1=null,pmt2=null; + if (!event.hasCollection(GenericObject.class,CLASSNAME)) + throw new Driver.NextEventException(); + for (GenericObject gob : event.get(GenericObject.class,CLASSNAME)) { + FADCGenericHit hit=(FADCGenericHit)gob; + if (hit.getCrate()==CRATE && hit.getSlot()==SLOT) { + if (hit.getChannel()==CHANNELS[0]) pmt1=hit; + else if (hit.getChannel()==CHANNELS[1]) pmt2=hit; + } + } + if (pmt1==null || pmt2==null) throw new Driver.NextEventException(); + + // calculate and histogram pulse integrals: + float pulse1=getPulseIntegral(pmt1); + float pulse2=getPulseIntegral(pmt2); aida.histogram2D("CosmicPMTs").fill(pulse1,pulse2); - + // cut on pulse integrals: - if (pulse1<CUTS[0] || pulse2<CUTS[1]) throw new Driver.NextEventException(); - } - - public float getPulseIntegral(FADCGenericHit hh) { - float sum=0; - for (int samp : hh.getData()) sum+=samp; - return sum-getPedestal(hh)*hh.getData().length; - } - - public float getPedestal(FADCGenericHit hh) { - if (hh.getData().length<NPEDSAMP) - throw new java.lang.RuntimeException("Not enough samples for pedestal."); - float sum=0; - for (int isamp=0; isamp<NPEDSAMP; isamp++) sum+=hh.getData()[isamp]; - return sum/NPEDSAMP; - } + if (pulse1<CUTS[0] || pulse2<CUTS[1]) throw new Driver.NextEventException(); + } + + public float getPulseIntegral(FADCGenericHit hh) { + float sum=0; + for (int samp : hh.getData()) sum+=samp; + return sum-getPedestal(hh)*hh.getData().length; + } + + public float getPedestal(FADCGenericHit hh) { + if (hh.getData().length<NPEDSAMP) + throw new java.lang.RuntimeException("Not enough samples for pedestal."); + float sum=0; + for (int isamp=0; isamp<NPEDSAMP; isamp++) sum+=hh.getData()[isamp]; + return sum/NPEDSAMP; + } } Modified: java/trunk/recon/src/main/java/org/hps/recon/filtering/EcalGainCalibFilter.java ============================================================================= --- java/trunk/recon/src/main/java/org/hps/recon/filtering/EcalGainCalibFilter.java (original) +++ java/trunk/recon/src/main/java/org/hps/recon/filtering/EcalGainCalibFilter.java Wed Mar 9 11:43:24 2016 @@ -7,11 +7,11 @@ public class EcalGainCalibFilter extends EventReconFilter { - private double feeCut = 0.6; - private double molCut = 0.6; - private double tMin = 16.0; - private double tMax = 80.0; - private double dtMax = 12.0; + private double feeCut = 0.6; + private double molCut = 0.6; + private double tMin = 16.0; + private double tMax = 80.0; + private double dtMax = 12.0; private String clusterCollectionName = "EcalClusters"; public void setFeeCut(double feeCut) { this.feeCut = feeCut; } @@ -27,32 +27,32 @@ @Override public void process(EventHeader event) { - incrementEventProcessed(); + incrementEventProcessed(); if (!event.hasCollection(Cluster.class, clusterCollectionName)) skipEvent(); List<Cluster> cc = event.get(Cluster.class, clusterCollectionName); if (cc.size() < 1) skipEvent(); boolean keepEvent = false; for (Cluster c1 : cc) { - final double t1 = ClusterUtilities.getSeedHitTime(c1); - if (t1<tMin || t1>tMax) continue; - if (c1.getEnergy() > feeCut) - { - keepEvent = true; - break; - } - for (Cluster c2 : cc) - { - final double t2 = ClusterUtilities.getSeedHitTime(c2); - if (c1 == c2) continue; - if (t2<tMin || t2>tMax) continue; - if (Math.abs(t1-t2) > dtMax) continue; - if (c1.getEnergy() + c2.getEnergy() > molCut) - { - keepEvent = true; - break; - } - } + final double t1 = ClusterUtilities.getSeedHitTime(c1); + if (t1<tMin || t1>tMax) continue; + if (c1.getEnergy() > feeCut) + { + keepEvent = true; + break; + } + for (Cluster c2 : cc) + { + final double t2 = ClusterUtilities.getSeedHitTime(c2); + if (c1 == c2) continue; + if (t2<tMin || t2>tMax) continue; + if (Math.abs(t1-t2) > dtMax) continue; + if (c1.getEnergy() + c2.getEnergy() > molCut) + { + keepEvent = true; + break; + } + } } if (!keepEvent) skipEvent(); incrementEventPassed(); Modified: java/trunk/recon/src/main/java/org/hps/recon/filtering/FEEFilterDriver.java ============================================================================= --- java/trunk/recon/src/main/java/org/hps/recon/filtering/FEEFilterDriver.java (original) +++ java/trunk/recon/src/main/java/org/hps/recon/filtering/FEEFilterDriver.java Wed Mar 9 11:43:24 2016 @@ -45,7 +45,7 @@ // cc.Delete(); // keep events with a cluster over 600 MeV with seed over 400 MeV (for 2015 running). - // keep events with cluster over 1.2 GeV and seed over 650 MeV for 2016 running. + // keep events with cluster over 1.2 GeV and seed over 650 MeV for 2016 running. if (cc.getEnergy() > 1.2 && ClusterUtilities.findSeedHit(cc).getCorrectedEnergy() > 0.65) return; Modified: java/trunk/recon/src/main/java/org/hps/recon/filtering/MinimumHitsFilter.java ============================================================================= --- java/trunk/recon/src/main/java/org/hps/recon/filtering/MinimumHitsFilter.java (original) +++ java/trunk/recon/src/main/java/org/hps/recon/filtering/MinimumHitsFilter.java Wed Mar 9 11:43:24 2016 @@ -61,7 +61,7 @@ private boolean isHitOnTop(RawTrackerHit hit){ - HpsSiSensor sensor=(HpsSiSensor) hit.getDetectorElement(); + HpsSiSensor sensor=(HpsSiSensor) hit.getDetectorElement(); IIdentifier id=hit.getIdentifier(); SiTrackerIdentifierHelper _sid_helper=(SiTrackerIdentifierHelper) sensor.getIdentifierHelper(); Modified: java/trunk/recon/src/main/java/org/hps/recon/filtering/PulserScalerAndEpicsFilter.java ============================================================================= --- java/trunk/recon/src/main/java/org/hps/recon/filtering/PulserScalerAndEpicsFilter.java (original) +++ java/trunk/recon/src/main/java/org/hps/recon/filtering/PulserScalerAndEpicsFilter.java Wed Mar 9 11:43:24 2016 @@ -25,83 +25,83 @@ public class PulserScalerAndEpicsFilter extends Driver{ - public void process(EventHeader event) { + public void process(EventHeader event) { - // only keep pulser triggers: - if (!event.hasCollection(GenericObject.class,"TriggerBank")) - throw new Driver.NextEventException(); - boolean isPulser=false; - for (GenericObject gob : event.get(GenericObject.class,"TriggerBank")) - { - if (!(AbstractIntData.getTag(gob) == TIData.BANK_TAG)) continue; - TIData tid = new TIData(gob); - if (tid.isPulserTrigger()) - { - isPulser=true; - break; - } - } + // only keep pulser triggers: + if (!event.hasCollection(GenericObject.class,"TriggerBank")) + throw new Driver.NextEventException(); + boolean isPulser=false; + for (GenericObject gob : event.get(GenericObject.class,"TriggerBank")) + { + if (!(AbstractIntData.getTag(gob) == TIData.BANK_TAG)) continue; + TIData tid = new TIData(gob); + if (tid.isPulserTrigger()) + { + isPulser=true; + break; + } + } - // don't drop any events with EPICS data or scalers data - // (could also do this via event tag=31) - final EpicsData edata = EpicsData.read(event); - if (edata != null) return; - - if( event.hasCollection(GenericObject.class, "ScalerData")) - return; + // don't drop any events with EPICS data or scalers data + // (could also do this via event tag=31) + final EpicsData edata = EpicsData.read(event); + if (edata != null) return; + + if( event.hasCollection(GenericObject.class, "ScalerData")) + return; - if (!isPulser) throw new Driver.NextEventException(); + if (!isPulser) throw new Driver.NextEventException(); - } - /** - * standalone way to run this: - * - * @param arg [0] inputFile [1] outputFile [2] run number [3] detectorName (optional, default = "HPS-EngRun2015-Nominal-v1") - * @throws IOException - */ - public static void main(String arg[]) throws IOException{ - ConditionsDriver hack = new ConditionsDriver(); - - String detectorName = "HPS-EngRun2015-Nominal-v1"; - if(arg.length >3) - hack.setDetectorName(arg[3]); - hack.setFreeze(true); - hack.setRunNumber(Integer.parseInt(arg[2])); - hack.initialize(); - PulserScalerAndEpicsFilter pf = new PulserScalerAndEpicsFilter(); - LCIOWriter writer = new LCIOWriter(arg[1]); - File file = new File(arg[0]); - LCIOReader reader = new LCIOReader(file); - System.out.println(file.getPath()); - int nEventsKept = 0; - int nEvents = 0; - try{ - while(true){ - try{ - - EventHeader eh = reader.read(); - if(eh.getEventNumber() %1000 == 0){ - //Driver.this. - System.out.println("PulserFitter:"); - System.out.println(" " + nEventsKept + " events kept"); - System.out.println(" " + nEvents + "events read"); - } - nEvents ++; - pf.process(eh); //might throw NextEventException - - nEventsKept++; - writer.write(eh); - }catch(Driver.NextEventException e){ + } + /** + * standalone way to run this: + * + * @param arg [0] inputFile [1] outputFile [2] run number [3] detectorName (optional, default = "HPS-EngRun2015-Nominal-v1") + * @throws IOException + */ + public static void main(String arg[]) throws IOException{ + ConditionsDriver hack = new ConditionsDriver(); + + String detectorName = "HPS-EngRun2015-Nominal-v1"; + if(arg.length >3) + hack.setDetectorName(arg[3]); + hack.setFreeze(true); + hack.setRunNumber(Integer.parseInt(arg[2])); + hack.initialize(); + PulserScalerAndEpicsFilter pf = new PulserScalerAndEpicsFilter(); + LCIOWriter writer = new LCIOWriter(arg[1]); + File file = new File(arg[0]); + LCIOReader reader = new LCIOReader(file); + System.out.println(file.getPath()); + int nEventsKept = 0; + int nEvents = 0; + try{ + while(true){ + try{ + + EventHeader eh = reader.read(); + if(eh.getEventNumber() %1000 == 0){ + //Driver.this. + System.out.println("PulserFitter:"); + System.out.println(" " + nEventsKept + " events kept"); + System.out.println(" " + nEvents + "events read"); + } + nEvents ++; + pf.process(eh); //might throw NextEventException + + nEventsKept++; + writer.write(eh); + }catch(Driver.NextEventException e){ - } - } - }catch(IOException e){ - e.printStackTrace(); - reader.close(); - } + } + } + }catch(IOException e){ + e.printStackTrace(); + reader.close(); + } - writer.close(); - } + writer.close(); + } } Modified: java/trunk/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java ============================================================================= --- java/trunk/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java (original) +++ java/trunk/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java Wed Mar 9 11:43:24 2016 @@ -188,7 +188,7 @@ * @param nsigma */ public void setNSigmaPositionMatch(double nsigma) { - MAXNSIGMAPOSITIONMATCH=nsigma; + MAXNSIGMAPOSITIONMATCH=nsigma; } @@ -255,7 +255,7 @@ for (List<Track> tracks : trackCollections) { for (Track track : tracks) { - + // Create a reconstructed particle to represent the track. ReconstructedParticle particle = new BaseReconstructedParticle(); @@ -304,7 +304,7 @@ // prefer using GBL tracks to correct (later) the clusters, for some consistency: if (track.getType() >= 32 || !clusterToTrack.containsKey(matchedCluster)) { - clusterToTrack.put(matchedCluster,track); + clusterToTrack.put(matchedCluster,track); } } @@ -365,7 +365,7 @@ ClusterUtilities.applyCorrections(ecal, cluster, ypos); } else { - ClusterUtilities.applyCorrections(ecal, cluster); + ClusterUtilities.applyCorrections(ecal, cluster); } } } Modified: java/trunk/recon/src/main/java/org/hps/recon/particle/SimpleParticleID.java ============================================================================= --- java/trunk/recon/src/main/java/org/hps/recon/particle/SimpleParticleID.java (original) +++ java/trunk/recon/src/main/java/org/hps/recon/particle/SimpleParticleID.java Wed Mar 9 11:43:24 2016 @@ -9,67 +9,67 @@ * */ public class SimpleParticleID implements ParticleID { - - int algorithmType = 0; - int pdgID = UnknownPDG; - int type = 0; - - double likelihood = 0.; - // TODO: Need to define what other parameters are needed. - double[] parameters = new double[1]; + + int algorithmType = 0; + int pdgID = UnknownPDG; + int type = 0; + + double likelihood = 0.; + // TODO: Need to define what other parameters are needed. + double[] parameters = new double[1]; - public SimpleParticleID(){} - - public SimpleParticleID(int pdgID, int algorithmType, int type, double likelihood){ - this.pdgID = pdgID; - this.algorithmType = algorithmType; - this.type = type; - this.likelihood = likelihood; - } - - @Override - public int getAlgorithmType() { - return algorithmType; - } + public SimpleParticleID(){} + + public SimpleParticleID(int pdgID, int algorithmType, int type, double likelihood){ + this.pdgID = pdgID; + this.algorithmType = algorithmType; + this.type = type; + this.likelihood = likelihood; + } + + @Override + public int getAlgorithmType() { + return algorithmType; + } - @Override - public double getLikelihood() { - return likelihood; - } + @Override + public double getLikelihood() { + return likelihood; + } - @Override - public int getPDG() { - return pdgID; - } + @Override + public int getPDG() { + return pdgID; + } - @Override - public double[] getParameters() { - return parameters; - } + @Override + public double[] getParameters() { + return parameters; + } - @Override - public int getType() { - return type; - } - - public void setAlgorithmType(int algorithmType){ - this.algorithmType = algorithmType; - } - - public void setLikelihood(int likelihood){ - this.likelihood = likelihood; - } - - public void setPDG(int pdgID){ - this.pdgID = pdgID; - } - - public void setType(int type){ - this.type = type; - } - - public void setParameters(double[] parameters){ - this.parameters = parameters; - } + @Override + public int getType() { + return type; + } + + public void setAlgorithmType(int algorithmType){ + this.algorithmType = algorithmType; + } + + public void setLikelihood(int likelihood){ + this.likelihood = likelihood; + } + + public void setPDG(int pdgID){ + this.pdgID = pdgID; + } + + public void setType(int type){ + this.type = type; + } + + public void setParameters(double[] parameters){ + this.parameters = parameters; + } } Modified: java/trunk/recon/src/main/java/org/hps/recon/utils/TrackClusterMatcher.java ============================================================================= --- java/trunk/recon/src/main/java/org/hps/recon/utils/TrackClusterMatcher.java (original) +++ java/trunk/recon/src/main/java/org/hps/recon/utils/TrackClusterMatcher.java Wed Mar 9 11:43:24 2016 @@ -230,7 +230,7 @@ */ public double getDistance(Cluster cluster,Track track) { - // Get the cluster position + // Get the cluster position Hep3Vector cPos = new BasicHep3Vector(cluster.getPosition()); // Extrapolate the track to the Ecal cluster position @@ -260,8 +260,8 @@ public double getNSigmaPosition(Cluster cluster,ReconstructedParticle particle) { if (particle.getTracks().size()<1) return Double.MAX_VALUE; - Track track=particle.getTracks().get(0); - + Track track=particle.getTracks().get(0); + if (this.useAnalyticExtrapolator) throw new RuntimeException("This is to be used with non-analytic extrapolator only."); @@ -532,11 +532,11 @@ * Class to store track-cluster matching qualities. */ public class TrackClusterMatch { - private double nSigmaPositionMatch=Double.MAX_VALUE; - public TrackClusterMatch(ReconstructedParticle pp, Cluster cc) { - nSigmaPositionMatch = getNSigmaPosition(cc,pp); - } - public double getNSigmaPositionMatch() { return nSigmaPositionMatch; } + private double nSigmaPositionMatch=Double.MAX_VALUE; + public TrackClusterMatch(ReconstructedParticle pp, Cluster cc) { + nSigmaPositionMatch = getNSigmaPosition(cc,pp); + } + public double getNSigmaPositionMatch() { return nSigmaPositionMatch; } } } Modified: java/trunk/recon/src/main/java/org/hps/recon/vertexing/BaseSimpleVertexer.java ============================================================================= --- java/trunk/recon/src/main/java/org/hps/recon/vertexing/BaseSimpleVertexer.java (original) +++ java/trunk/recon/src/main/java/org/hps/recon/vertexing/BaseSimpleVertexer.java Wed Mar 9 11:43:24 2016 @@ -12,25 +12,25 @@ public abstract class BaseSimpleVertexer implements SimpleVertexer { - protected boolean _debug = false; - protected Vertex _fitted_vertex = null; + protected boolean _debug = false; + protected Vertex _fitted_vertex = null; - public BaseSimpleVertexer() { - } + public BaseSimpleVertexer() { + } - @Override - public abstract void fitVertex(); + @Override + public abstract void fitVertex(); - @Override - public Vertex getFittedVertex() { - return _fitted_vertex; - } - - public void clear() { - _fitted_vertex = null; - } - - public abstract boolean isValid(); - + @Override + public Vertex getFittedVertex() { + return _fitted_vertex; + } + + public void clear() { + _fitted_vertex = null; + } + + public abstract boolean isValid(); + } Modified: java/trunk/recon/src/main/java/org/hps/recon/vertexing/BilliorVertex.java ============================================================================= --- java/trunk/recon/src/main/java/org/hps/recon/vertexing/BilliorVertex.java (original) +++ java/trunk/recon/src/main/java/org/hps/recon/vertexing/BilliorVertex.java Wed Mar 9 11:43:24 2016 @@ -14,8 +14,8 @@ /** * - * @author Mathew Thomas Graham <[log in to unmask]> - * @version $Id:$ + * @author Mathew Thomas Graham <[log in to unmask]> + * @version $Id:$ * */ public class BilliorVertex implements Vertex { @@ -74,12 +74,12 @@ * @param particle : The ReconstructedParticle Associated with this Vertex */ public void setAssociatedParticle(ReconstructedParticle particle){ - this._particle = particle; + this._particle = particle; } @Override public boolean isPrimary() { - return _isPrimary; + return _isPrimary; } @Override @@ -94,7 +94,7 @@ @Override public double getProbability() { - return _probability; + return _probability; } @Override @@ -108,7 +108,7 @@ } // TODO: These should be pulled out and accessed by their own - // getter methods. + // getter methods. @Override public Map<String, Double> getParameters() { Map<String, Double> pars = new HashMap<String, Double>(); @@ -128,6 +128,6 @@ @Override public ReconstructedParticle getAssociatedParticle() { - return _particle; + return _particle; } } Modified: java/trunk/recon/src/main/java/org/hps/recon/vertexing/TwoLineVertexer.java ============================================================================= --- java/trunk/recon/src/main/java/org/hps/recon/vertexing/TwoLineVertexer.java (original) +++ java/trunk/recon/src/main/java/org/hps/recon/vertexing/TwoLineVertexer.java Wed Mar 9 11:43:24 2016 @@ -20,21 +20,21 @@ */ public class TwoLineVertexer extends BaseSimpleVertexer { protected Hep3Vector A1,A2,B1,B2; - - public TwoLineVertexer() { - - } - + + public TwoLineVertexer() { + + } + public void setLines(Hep3Vector PA1, Hep3Vector PA2, Hep3Vector PB1, Hep3Vector PB2) { - this.A1 = PA1; - this.A2 = PA2; - this.B1 = PB1; - this.B2 = PB2; + this.A1 = PA1; + this.A2 = PA2; + this.B1 = PB1; + this.B2 = PB2; } public void clear() { - super.clear(); - setLines(null,null,null,null); + super.clear(); + setLines(null,null,null,null); } public boolean isValid() { @@ -44,11 +44,11 @@ @Override public void fitVertex() { - assert isValid(); - Hep3Vector vtxPosition = getPOCALineToLine(); - if (vtxPosition!=null) { - _fitted_vertex = new BaseVertex(true, "Two Line Vertexer", 0, 0, new SymmetricMatrix(0), vtxPosition, null); - } + assert isValid(); + Hep3Vector vtxPosition = getPOCALineToLine(); + if (vtxPosition!=null) { + _fitted_vertex = new BaseVertex(true, "Two Line Vertexer", 0, 0, new SymmetricMatrix(0), vtxPosition, null); + } } /** @@ -94,57 +94,57 @@ */ private Hep3Vector getPOCALineToLine() { - if(_debug) System.out.printf("%s: A1=%s A2=%s B1=%s B2=%s\n", this.getClass().getSimpleName(), A1.toString(), A2.toString(), B1.toString(), B2.toString()); + if(_debug) System.out.printf("%s: A1=%s A2=%s B1=%s B2=%s\n", this.getClass().getSimpleName(), A1.toString(), A2.toString(), B1.toString(), B2.toString()); - double ya[][] = {VecOp.mult(-1,VecOp.sub(B1, A1)).v()}; - BasicMatrix y = (BasicMatrix)MatrixOp.transposed(new BasicMatrix(ya)); - Hep3Vector dB = VecOp.sub(B2, B1); - Hep3Vector dA = VecOp.sub(A2, A1); - BasicMatrix X = new BasicMatrix(3,2); - for(int col=0;col<2;++col) { - if(col==0) { - X.setElement(0, col, dB.x()); - X.setElement(1, col, dB.y()); - X.setElement(2, col, dB.z()); - } else { - X.setElement(0, col, -1*dA.x()); - X.setElement(1, col, -1*dA.y()); - X.setElement(2, col, -1*dA.z()); - } - } + double ya[][] = {VecOp.mult(-1,VecOp.sub(B1, A1)).v()}; + BasicMatrix y = (BasicMatrix)MatrixOp.transposed(new BasicMatrix(ya)); + Hep3Vector dB = VecOp.sub(B2, B1); + Hep3Vector dA = VecOp.sub(A2, A1); + BasicMatrix X = new BasicMatrix(3,2); + for(int col=0;col<2;++col) { + if(col==0) { + X.setElement(0, col, dB.x()); + X.setElement(1, col, dB.y()); + X.setElement(2, col, dB.z()); + } else { + X.setElement(0, col, -1*dA.x()); + X.setElement(1, col, -1*dA.y()); + X.setElement(2, col, -1*dA.z()); + } + } - BasicMatrix X_T = (BasicMatrix)MatrixOp.transposed(X); - BasicMatrix XX_T = (BasicMatrix)MatrixOp.mult(X_T, X); - BasicMatrix IXX_T = null; - try { - IXX_T = (BasicMatrix)MatrixOp.inverse(XX_T); - } - catch(MatrixOp.IndeterminateMatrixException e) { - System.out.printf("%s: caught indeterminate exception %s\n",this.getClass().getSimpleName(),e.getMessage()); - return null; - } - BasicMatrix X_Ty = (BasicMatrix)MatrixOp.mult(X_T,y); - BasicMatrix b = (BasicMatrix)MatrixOp.mult(IXX_T, X_Ty); - double t = b.e(0, 0); - double s = b.e(1, 0); - Hep3Vector Bpca = VecOp.add(B1, VecOp.mult(t, dB)); - Hep3Vector Apca = VecOp.add(A1, VecOp.mult(s, dA)); + BasicMatrix X_T = (BasicMatrix)MatrixOp.transposed(X); + BasicMatrix XX_T = (BasicMatrix)MatrixOp.mult(X_T, X); + BasicMatrix IXX_T = null; + try { + IXX_T = (BasicMatrix)MatrixOp.inverse(XX_T); + } + catch(MatrixOp.IndeterminateMatrixException e) { + System.out.printf("%s: caught indeterminate exception %s\n",this.getClass().getSimpleName(),e.getMessage()); + return null; + } + BasicMatrix X_Ty = (BasicMatrix)MatrixOp.mult(X_T,y); + BasicMatrix b = (BasicMatrix)MatrixOp.mult(IXX_T, X_Ty); + double t = b.e(0, 0); + double s = b.e(1, 0); + Hep3Vector Bpca = VecOp.add(B1, VecOp.mult(t, dB)); + Hep3Vector Apca = VecOp.add(A1, VecOp.mult(s, dA)); Hep3Vector vertex = VecOp.add(Apca, VecOp.mult(0.5, VecOp.sub(Bpca, Apca))); - if(_debug) { - System.out.printf("y:\n%s\n",y.toString()); - System.out.printf("X:\n%s\n",X.toString()); - System.out.printf("b:\n%s\n",b.toString()); - Hep3Vector ymin = VecOp.add(VecOp.mult(t, dB) , VecOp.mult(s, dA) ); - Hep3Vector yminprime = VecOp.add(VecOp.sub(B1, A1), ymin); - System.out.printf("ymin:\n%s\n",ymin.toString()); - System.out.printf("yminprime:\n%s\n",yminprime.toString()); - System.out.printf("Apca:\n%s\n",Apca.toString()); - System.out.printf("Bpca:\n%s\n",Bpca.toString()); - System.out.printf("vertex:\n%s\n",vertex.toString()); - } - return vertex; - - + if(_debug) { + System.out.printf("y:\n%s\n",y.toString()); + System.out.printf("X:\n%s\n",X.toString()); + System.out.printf("b:\n%s\n",b.toString()); + Hep3Vector ymin = VecOp.add(VecOp.mult(t, dB) , VecOp.mult(s, dA) ); + Hep3Vector yminprime = VecOp.add(VecOp.sub(B1, A1), ymin); + System.out.printf("ymin:\n%s\n",ymin.toString()); + System.out.printf("yminprime:\n%s\n",yminprime.toString()); + System.out.printf("Apca:\n%s\n",Apca.toString()); + System.out.printf("Bpca:\n%s\n",Bpca.toString()); + System.out.printf("vertex:\n%s\n",vertex.toString()); + } + return vertex; + + } Modified: java/trunk/recon/src/main/java/org/hps/recon/vertexing/TwoParticleVertexer.java ============================================================================= --- java/trunk/recon/src/main/java/org/hps/recon/vertexing/TwoParticleVertexer.java (original) +++ java/trunk/recon/src/main/java/org/hps/recon/vertexing/TwoParticleVertexer.java Wed Mar 9 11:43:24 2016 @@ -18,7 +18,7 @@ */ public class TwoParticleVertexer extends TwoLineVertexer { - public TwoParticleVertexer() { + public TwoParticleVertexer() { } public void setParticle(MCParticle track1,MCParticle track2) { @@ -34,8 +34,8 @@ Hep3Vector PB2 = this.propAlongLine(PB1, p2, dz); if(_debug) { - System.out.printf("A1 %s p1 %s B1 %s p2 %s\n", PA1.toString(), p1.toString(), PB1.toString(), p2.toString()); - System.out.printf("A2 %s B2 %s\n", PA2.toString(), PB2.toString()); + System.out.printf("A1 %s p1 %s B1 %s p2 %s\n", PA1.toString(), p1.toString(), PB1.toString(), p2.toString()); + System.out.printf("A2 %s B2 %s\n", PA2.toString(), PB2.toString()); } //set the member variables Modified: java/trunk/recon/src/main/java/org/hps/recon/vertexing/TwoTrackFringeVertexer.java ============================================================================= --- java/trunk/recon/src/main/java/org/hps/recon/vertexing/TwoTrackFringeVertexer.java (original) +++ java/trunk/recon/src/main/java/org/hps/recon/vertexing/TwoTrackFringeVertexer.java Wed Mar 9 11:43:24 2016 @@ -25,7 +25,7 @@ protected HelixConverter converter = new HelixConverter(0.); public void setTracks(Track track1, Track track2, FieldMap fieldMap) { - SeedTrack s1 = (SeedTrack) track1; + SeedTrack s1 = (SeedTrack) track1; HelicalTrackFit htf1 = s1.getSeedCandidate().getHelix(); HpsHelicalTrackFit hpstrk1 = new HpsHelicalTrackFit(htf1); SeedTrack s2 = (SeedTrack) track2; @@ -71,5 +71,5 @@ } - + } Modified: java/trunk/recon/src/test/java/org/hps/recon/particle/HpsReconParticleDriverTest.java ============================================================================= --- java/trunk/recon/src/test/java/org/hps/recon/particle/HpsReconParticleDriverTest.java (original) +++ java/trunk/recon/src/test/java/org/hps/recon/particle/HpsReconParticleDriverTest.java Wed Mar 9 11:43:24 2016 @@ -26,165 +26,165 @@ */ public class HpsReconParticleDriverTest extends TestCase { - private static final double B_FIELD = 0.5; // Tesla - double[] trackParameters = new double[5]; - List<Track> tracks = new ArrayList<Track>(); - List<Cluster> clusters = new ArrayList<Cluster>(); - List<ReconstructedParticle> particleTracks; - HpsReconParticleDriver particleDriver = null; - - public void setUp() throws Exception { - - System.out.println("\n#=== Creating Ideal Tracks ===#\n"); + private static final double B_FIELD = 0.5; // Tesla + double[] trackParameters = new double[5]; + List<Track> tracks = new ArrayList<Track>(); + List<Cluster> clusters = new ArrayList<Cluster>(); + List<ReconstructedParticle> particleTracks; + HpsReconParticleDriver particleDriver = null; + + public void setUp() throws Exception { + + System.out.println("\n#=== Creating Ideal Tracks ===#\n"); - // Create a pair of ideal e+e- tracks in opposite detector volumes. - // The e+ track is created on the bottom half of the detector while - // the e- track is created on the top half. - Track electronTrack = new BaseTrack(); - trackParameters[BaseTrack.D0] = 0.41051; - trackParameters[BaseTrack.OMEGA] = -2.2584e-4; - trackParameters[BaseTrack.PHI] = 6.2626; - trackParameters[BaseTrack.TANLAMBDA] = 0.046548; - trackParameters[BaseTrack.Z0] = .23732; - ((BaseTrack) electronTrack).setTrackParameters(trackParameters, B_FIELD); - - System.out.println("\n[ Track ] Electron: \n" + electronTrack.toString()); - - Track positronTrack = new BaseTrack(); - trackParameters[BaseTrack.D0] = 0.19691; - trackParameters[BaseTrack.OMEGA] = 1.005e-4; - trackParameters[BaseTrack.PHI] = 6.2447; - trackParameters[BaseTrack.TANLAMBDA] = -0.024134; - trackParameters[BaseTrack.Z0] = -0.040231; - ((BaseTrack) positronTrack).setTrackParameters(trackParameters, B_FIELD); + // Create a pair of ideal e+e- tracks in opposite detector volumes. + // The e+ track is created on the bottom half of the detector while + // the e- track is created on the top half. + Track electronTrack = new BaseTrack(); + trackParameters[BaseTrack.D0] = 0.41051; + trackParameters[BaseTrack.OMEGA] = -2.2584e-4; + trackParameters[BaseTrack.PHI] = 6.2626; + trackParameters[BaseTrack.TANLAMBDA] = 0.046548; + trackParameters[BaseTrack.Z0] = .23732; + ((BaseTrack) electronTrack).setTrackParameters(trackParameters, B_FIELD); + + System.out.println("\n[ Track ] Electron: \n" + electronTrack.toString()); + + Track positronTrack = new BaseTrack(); + trackParameters[BaseTrack.D0] = 0.19691; + trackParameters[BaseTrack.OMEGA] = 1.005e-4; + trackParameters[BaseTrack.PHI] = 6.2447; + trackParameters[BaseTrack.TANLAMBDA] = -0.024134; + trackParameters[BaseTrack.Z0] = -0.040231; + ((BaseTrack) positronTrack).setTrackParameters(trackParameters, B_FIELD); - System.out.println("\n[ Track ] Positron: \n" + positronTrack.toString()); + System.out.println("\n[ Track ] Positron: \n" + positronTrack.toString()); - // Add the tracks to the list of tracks that will be used for test - // purposes. - tracks.add(electronTrack); - tracks.add(positronTrack); - - System.out.println("\n#=== Creating Ideal Ecal Clusters ===#\n"); - - // Create a pair of ideal clusters to match the e+e- pairs created - // above. Since the properties of a cluster cannot be modified - // directly via setter methods, first create a CalorimeterHit and - // then use that to create a cluster. - //Hep3Vector topHitPosition = new BasicHep3Vector(190.27, 69.729, 1422.8); - //BaseCalorimeterHit topHit - // = new BaseCalorimeterHit(.4600, .4600, 0, 0, 0, topHitPosition, 0); - - //System.out.println("\n[ Calorimeter Hit ] Top: \n" + topHit.toString()); - - Cluster topCluster = new BaseCluster(); - //((BaseCluster) topCluster).addHit(topHit); - - - System.out.print("\n[ Cluster ] Top: " + topCluster.toString()); - System.out.println(" and position= [" + topCluster.getPosition()[0] + ", " - + topCluster.getPosition()[1] + ", " - + topCluster.getPosition()[2] + " ]"); - - //Hep3Vector bottomHitPosition = new BasicHep3Vector(-148.46, -39.27, 1430.5); - //BaseCalorimeterHit bottomHit - // = new BaseCalorimeterHit(1.1420, 1.1420, 0, 0, 0, bottomHitPosition, 0); + // Add the tracks to the list of tracks that will be used for test + // purposes. + tracks.add(electronTrack); + tracks.add(positronTrack); + + System.out.println("\n#=== Creating Ideal Ecal Clusters ===#\n"); + + // Create a pair of ideal clusters to match the e+e- pairs created + // above. Since the properties of a cluster cannot be modified + // directly via setter methods, first create a CalorimeterHit and + // then use that to create a cluster. + //Hep3Vector topHitPosition = new BasicHep3Vector(190.27, 69.729, 1422.8); + //BaseCalorimeterHit topHit + // = new BaseCalorimeterHit(.4600, .4600, 0, 0, 0, topHitPosition, 0); + + //System.out.println("\n[ Calorimeter Hit ] Top: \n" + topHit.toString()); + + Cluster topCluster = new BaseCluster(); + //((BaseCluster) topCluster).addHit(topHit); + + + System.out.print("\n[ Cluster ] Top: " + topCluster.toString()); + System.out.println(" and position= [" + topCluster.getPosition()[0] + ", " + + topCluster.getPosition()[1] + ", " + + topCluster.getPosition()[2] + " ]"); + + //Hep3Vector bottomHitPosition = new BasicHep3Vector(-148.46, -39.27, 1430.5); + //BaseCalorimeterHit bottomHit + // = new BaseCalorimeterHit(1.1420, 1.1420, 0, 0, 0, bottomHitPosition, 0); - //System.out.println("\n[ Calorimeter Hit ] Bottom:\n " + bottomHit.toString()); - - Cluster bottomCluster = new BaseCluster(); - //((BaseCluster) bottomCluster).addHit(bottomHit); - - System.out.print("\n[ Cluster ] bottom: " + bottomCluster.toString()); - System.out.println(" and position= [ " + topCluster.getPosition()[0] + ", " - + topCluster.getPosition()[1] + ", " - + topCluster.getPosition()[2] + " ]"); + //System.out.println("\n[ Calorimeter Hit ] Bottom:\n " + bottomHit.toString()); + + Cluster bottomCluster = new BaseCluster(); + //((BaseCluster) bottomCluster).addHit(bottomHit); + + System.out.print("\n[ Cluster ] bottom: " + bottomCluster.toString()); + System.out.println(" and position= [ " + topCluster.getPosition()[0] + ", " + + topCluster.getPosition()[1] + ", " + + topCluster.getPosition()[2] + " ]"); - // Add the clusters to the list of clusters that will be used for test - // purposes. - clusters.add(topCluster); - clusters.add(bottomCluster); - - particleDriver = new HpsReconParticleDriver(); - particleDriver.setDebug(true); - } - - public void testMakeReconstructedParticles(){ - - System.out.println("\n#=== Running makeReconstructedParticles Test ===#"); - - - // Create two ReconstructedParticles with tracks only - List<Cluster> emptyClusters = new ArrayList<Cluster>(); - List<List<Track>> trackCollections = new ArrayList<List<Track>>(0); - trackCollections.add(tracks); - particleTracks = particleDriver.makeReconstructedParticles(emptyClusters, trackCollections); + // Add the clusters to the list of clusters that will be used for test + // purposes. + clusters.add(topCluster); + clusters.add(bottomCluster); + + particleDriver = new HpsReconParticleDriver(); + particleDriver.setDebug(true); + } - // - // The list contains two Tracks which should result in two - // ReconstructedParticles. - // - assertTrue("More particles than expected were created.", particleTracks.size() == 2); - System.out.println("\nThe number of ReconstructedParticles created: " + particleTracks.size()); + public void testMakeReconstructedParticles(){ + + System.out.println("\n#=== Running makeReconstructedParticles Test ===#"); + + + // Create two ReconstructedParticles with tracks only + List<Cluster> emptyClusters = new ArrayList<Cluster>(); + List<List<Track>> trackCollections = new ArrayList<List<Track>>(0); + trackCollections.add(tracks); + particleTracks = particleDriver.makeReconstructedParticles(emptyClusters, trackCollections); - for(int particleN = 0; particleN < particleTracks.size(); particleN++){ - - // - // Check if the RecontructedParticle track is the same as the track - // that created it - // - assertTrue("The particle track does not match the track that created it", - particleTracks.get(particleN).getTracks().get(0).equals(tracks.get(particleN))); - - - // - // Check that the charge of the ReconstructedParticles was set properly - // - assertTrue("The charge of the ReconstructedParticle is equal to zero.", - Math.abs(particleTracks.get(particleN).getCharge()) != 0); - System.out.println("The charge of ReconstructedParticle number " + particleN + ": " + particleTracks.get(particleN).getCharge()); - - - // - // Check that the particle ID was set correctly - // - assertTrue("The particle ID of the ReconstructedParticle is equal to zero.", - particleTracks.get(particleN).getParticleIDUsed().getPDG() != 0); - System.out.println("The particle ID of ReconstructedParticle number " + particleN + ": " + particleTracks.get(particleN).getParticleIDUsed().getPDG()); - } - - // - // Check that the momentum of the ReconstructedParticles was set properly - // and rotated to the detector frame. - // - Hep3Vector electronMomentum = new BasicHep3Vector(tracks.get(0).getTrackStates().get(0).getMomentum()); - electronMomentum = CoordinateTransformations.transformVectorToDetector(electronMomentum); - assertTrue("The momentum of the track and ReconstructedParticle don't match! Top track p = " - + electronMomentum.toString() + " Recon particle p = " + particleTracks.get(0).getMomentum().toString(), - particleTracks.get(0).getMomentum().equals(electronMomentum)); - - System.out.println("The momentum of the first ReconstructedParticle: " + particleTracks.get(0).getMomentum().toString()); - - Hep3Vector positronMomentum = new BasicHep3Vector(tracks.get(1).getTrackStates().get(0).getMomentum()); - positronMomentum = CoordinateTransformations.transformVectorToDetector(positronMomentum); - assertTrue("The momentum of track and ReconstructedParticle don't march! Bottom track p = " - + positronMomentum.toString() + " Recon particle p = " + particleTracks.get(1).getMomentum().toString(), - particleTracks.get(1).getMomentum().equals(positronMomentum)); - - System.out.println("The momentum of the second ReconstructedParticle: " + particleTracks.get(1).getMomentum().toString()); - - } - - public void testVertexParticles(){ - - // Create two ReconstructedParticles with tracks only - //List<Cluster> emptyClusters = new ArrayList<Cluster>(); - //particleTracks = particleDriver.makeReconstructedParticles(emptyClusters, tracks); + // + // The list contains two Tracks which should result in two + // ReconstructedParticles. + // + assertTrue("More particles than expected were created.", particleTracks.size() == 2); + System.out.println("\nThe number of ReconstructedParticles created: " + particleTracks.size()); + + for(int particleN = 0; particleN < particleTracks.size(); particleN++){ + + // + // Check if the RecontructedParticle track is the same as the track + // that created it + // + assertTrue("The particle track does not match the track that created it", + particleTracks.get(particleN).getTracks().get(0).equals(tracks.get(particleN))); + + + // + // Check that the charge of the ReconstructedParticles was set properly + // + assertTrue("The charge of the ReconstructedParticle is equal to zero.", + Math.abs(particleTracks.get(particleN).getCharge()) != 0); + System.out.println("The charge of ReconstructedParticle number " + particleN + ": " + particleTracks.get(particleN).getCharge()); + + + // + // Check that the particle ID was set correctly + // + assertTrue("The particle ID of the ReconstructedParticle is equal to zero.", + particleTracks.get(particleN).getParticleIDUsed().getPDG() != 0); + System.out.println("The particle ID of ReconstructedParticle number " + particleN + ": " + particleTracks.get(particleN).getParticleIDUsed().getPDG()); + } + + // + // Check that the momentum of the ReconstructedParticles was set properly + // and rotated to the detector frame. + // + Hep3Vector electronMomentum = new BasicHep3Vector(tracks.get(0).getTrackStates().get(0).getMomentum()); + electronMomentum = CoordinateTransformations.transformVectorToDetector(electronMomentum); + assertTrue("The momentum of the track and ReconstructedParticle don't match! Top track p = " + + electronMomentum.toString() + " Recon particle p = " + particleTracks.get(0).getMomentum().toString(), + particleTracks.get(0).getMomentum().equals(electronMomentum)); + + System.out.println("The momentum of the first ReconstructedParticle: " + particleTracks.get(0).getMomentum().toString()); + + Hep3Vector positronMomentum = new BasicHep3Vector(tracks.get(1).getTrackStates().get(0).getMomentum()); + positronMomentum = CoordinateTransformations.transformVectorToDetector(positronMomentum); + assertTrue("The momentum of track and ReconstructedParticle don't march! Bottom track p = " + + positronMomentum.toString() + " Recon particle p = " + particleTracks.get(1).getMomentum().toString(), + particleTracks.get(1).getMomentum().equals(positronMomentum)); + + System.out.println("The momentum of the second ReconstructedParticle: " + particleTracks.get(1).getMomentum().toString()); + + } + + public void testVertexParticles(){ + + // Create two ReconstructedParticles with tracks only + //List<Cluster> emptyClusters = new ArrayList<Cluster>(); + //particleTracks = particleDriver.makeReconstructedParticles(emptyClusters, tracks); - //List<ReconstructedParticle> electrons = particleTracks.subList(0, 1); - //List<ReconstructedParticle> positrons = particleTracks.subList(1, 2); - - //particleDriver.vertexParticles(electrons, positrons); - - } + //List<ReconstructedParticle> electrons = particleTracks.subList(0, 1); + //List<ReconstructedParticle> positrons = particleTracks.subList(1, 2); + + //particleDriver.vertexParticles(electrons, positrons); + + } } Modified: java/trunk/record-util/src/main/java/org/hps/record/daqconfig/DAQConfigDriver.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/daqconfig/DAQConfigDriver.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/daqconfig/DAQConfigDriver.java Wed Mar 9 11:43:24 2016 @@ -39,57 +39,57 @@ * @see ConfigurationManager */ public class DAQConfigDriver extends Driver { - private int runNumber = -1; - private String filepath = null; - private boolean firstEvent = true; - private boolean readDataFiles = false; - private File[] dataFiles = new File[3]; - private int[] crateNumber = { 46, 37, 39 }; - - /** - * Verifies the parameter <code>filepath</code> for the data file - * repository and checks that appropriate data files exist for the - * requested run number if the driver is set to read from data files. - * Otherwise, this does nothing. - */ - @Override - public void startOfData() { - // Check whether to use stored data files or the EvIO data stream - // as the source of the DAQ settings. Nothing needs to be done - // in the latter case. - if(readDataFiles) { - // The user must define a data file prefix and repository - // location for this option to be used. - if(filepath == null) { - throw new NullPointerException("DAQ settings repository filepath must be defined."); - } if(runNumber == -1) { - throw new NullPointerException("Run number must be defined."); - } - - // Verify that the repository actually exist. - File repository = new File(filepath); - if(!repository.exists() || !repository.isDirectory()) { - throw new IllegalArgumentException("Repository location \"" + filepath + "\" must be an existing directory."); - } - - // Define the data file objects. - for(int i = 0; i < dataFiles.length; i++) { - try { - dataFiles[i] = new File(repository.getCanonicalPath() + "/" + runNumber + "_" + crateNumber[i] + ".txt"); - } catch(IOException e) { - throw new RuntimeException("Error resolving absolute repository filepath."); - } - } - - // Verify that the data files actually exist. - for(File dataFile : dataFiles) { - if(!dataFile.exists() || !dataFile.canRead()) { - throw new IllegalArgumentException("Data file \"" + dataFile.getName() + "\" does not exist or can not be read."); - } - } - } - } - + private int runNumber = -1; + private String filepath = null; + private boolean firstEvent = true; + private boolean readDataFiles = false; + private File[] dataFiles = new File[3]; + private int[] crateNumber = { 46, 37, 39 }; + + /** + * Verifies the parameter <code>filepath</code> for the data file + * repository and checks that appropriate data files exist for the + * requested run number if the driver is set to read from data files. + * Otherwise, this does nothing. + */ + @Override + public void startOfData() { + // Check whether to use stored data files or the EvIO data stream + // as the source of the DAQ settings. Nothing needs to be done + // in the latter case. + if(readDataFiles) { + // The user must define a data file prefix and repository + // location for this option to be used. + if(filepath == null) { + throw new NullPointerException("DAQ settings repository filepath must be defined."); + } if(runNumber == -1) { + throw new NullPointerException("Run number must be defined."); + } + + // Verify that the repository actually exist. + File repository = new File(filepath); + if(!repository.exists() || !repository.isDirectory()) { + throw new IllegalArgumentException("Repository location \"" + filepath + "\" must be an existing directory."); + } + + // Define the data file objects. + for(int i = 0; i < dataFiles.length; i++) { + try { + dataFiles[i] = new File(repository.getCanonicalPath() + "/" + runNumber + "_" + crateNumber[i] + ".txt"); + } catch(IOException e) { + throw new RuntimeException("Error resolving absolute repository filepath."); + } + } + + // Verify that the data files actually exist. + for(File dataFile : dataFiles) { + if(!dataFile.exists() || !dataFile.canRead()) { + throw new IllegalArgumentException("Data file \"" + dataFile.getName() + "\" does not exist or can not be read."); + } + } + } + } + /** * Checks an event for the DAQ configuration banks and passes them * to the <code>ConfigurationManager</code> if the driver is set to @@ -99,28 +99,28 @@ */ @Override public void process(EventHeader event) { - // If this is the first event and data files are to be read, - // import the data files and generate the DAQ information. - if(firstEvent && readDataFiles) { - // Get the data files in the form of a data array. - String[][] data; - try { data = getDataFileArrays(dataFiles); } - catch(IOException e) { - throw new RuntimeException("An error occurred when processing the data files."); - } - - // Instantiate an EvIO DAQ parser and feed it the data. - EvioDAQParser daqConfig = new EvioDAQParser(); - for(int i = 0; i < dataFiles.length; i++) { - daqConfig.parse(crateNumber[i], runNumber, data[i]); - } - - // Update the configuration manager. - ConfigurationManager.updateConfiguration(daqConfig); - } - + // If this is the first event and data files are to be read, + // import the data files and generate the DAQ information. + if(firstEvent && readDataFiles) { + // Get the data files in the form of a data array. + String[][] data; + try { data = getDataFileArrays(dataFiles); } + catch(IOException e) { + throw new RuntimeException("An error occurred when processing the data files."); + } + + // Instantiate an EvIO DAQ parser and feed it the data. + EvioDAQParser daqConfig = new EvioDAQParser(); + for(int i = 0; i < dataFiles.length; i++) { + daqConfig.parse(crateNumber[i], runNumber, data[i]); + } + + // Update the configuration manager. + ConfigurationManager.updateConfiguration(daqConfig); + } + // Check if a trigger configuration bank exists. - if(!readDataFiles && event.hasCollection(EvioDAQParser.class, "TriggerConfig")) { + if(!readDataFiles && event.hasCollection(EvioDAQParser.class, "TriggerConfig")) { // Get the trigger configuration bank. There should only be // one in the list. List<EvioDAQParser> configList = event.get(EvioDAQParser.class, "TriggerConfig"); @@ -134,7 +134,7 @@ // Note that it is no longer the first event. firstEvent = false; } - + /** * Converts DAQ configuration data files into an array of strings * where each array entry represents a line in the configuration @@ -152,44 +152,44 @@ * or reading the objects in the objects referred to by the files * pointed to in the <code>dataFiles</code> array. */ - private static final String[][] getDataFileArrays(File[] dataFiles) throws IOException { - // Create file readers to process the data files. - FileReader[] fr = new FileReader[dataFiles.length]; - BufferedReader[] reader = new BufferedReader[dataFiles.length]; - for(int i = 0; i < dataFiles.length; i++) { - fr[i] = new FileReader(dataFiles[i]); - reader[i] = new BufferedReader(fr[i]); - } - - // Generate String arrays where each entry in the array is - // a line from the data file. - String[][] data = new String[dataFiles.length][0]; - for(int i = 0; i < dataFiles.length; i++) { - // Create a list to hold the raw strings. - List<String> rawData = new ArrayList<String>(); - - // Add each line from the current data file to the list - // as a single entry. - String curLine = null; - while((curLine = reader[i].readLine()) != null) { - rawData.add(curLine); - } - - // Convert the list into a String array. - data[i] = rawData.toArray(new String[rawData.size()]); - } - - // Return the data array. - return data; - } - - /** - * Sets the run number of the DAQ configuration being processed. - * This is only used when reading from data files. - * @param run - The run number of the data files to be used. - */ + private static final String[][] getDataFileArrays(File[] dataFiles) throws IOException { + // Create file readers to process the data files. + FileReader[] fr = new FileReader[dataFiles.length]; + BufferedReader[] reader = new BufferedReader[dataFiles.length]; + for(int i = 0; i < dataFiles.length; i++) { + fr[i] = new FileReader(dataFiles[i]); + reader[i] = new BufferedReader(fr[i]); + } + + // Generate String arrays where each entry in the array is + // a line from the data file. + String[][] data = new String[dataFiles.length][0]; + for(int i = 0; i < dataFiles.length; i++) { + // Create a list to hold the raw strings. + List<String> rawData = new ArrayList<String>(); + + // Add each line from the current data file to the list + // as a single entry. + String curLine = null; + while((curLine = reader[i].readLine()) != null) { + rawData.add(curLine); + } + + // Convert the list into a String array. + data[i] = rawData.toArray(new String[rawData.size()]); + } + + // Return the data array. + return data; + } + + /** + * Sets the run number of the DAQ configuration being processed. + * This is only used when reading from data files. + * @param run - The run number of the data files to be used. + */ public void setRunNumber(int run) { - runNumber = run; + runNumber = run; } /** @@ -198,7 +198,7 @@ * @param filepath - The file path of the data file repository. */ public void setDataFileRepository(String filepath) { - this.filepath = filepath; + this.filepath = filepath; } /** @@ -211,6 +211,6 @@ * should be read from the EvIO stream. */ public void setReadDataFiles(boolean state) { - readDataFiles = state; + readDataFiles = state; } } Modified: java/trunk/record-util/src/main/java/org/hps/record/daqconfig/EvioDAQParser.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/daqconfig/EvioDAQParser.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/daqconfig/EvioDAQParser.java Wed Mar 9 11:43:24 2016 @@ -42,7 +42,7 @@ * * TODO: Restructure, clean up... */ - /** The EvIO bank identification tag for DAQ configuration banks. */ + /** The EvIO bank identification tag for DAQ configuration banks. */ public static final int BANK_TAG = 0xE10E; // Stores the hardware codes for each trigger type. @@ -204,7 +204,7 @@ * Instantiates the <code>EvioDAQParser</code>. */ public EvioDAQParser() { - // Create a map to map crystals to their database channel object. + // Create a map to map crystals to their database channel object. ecalConditions = DatabaseConditionsManager.getInstance().getEcalConditions(); for (int ii = 0; ii < 442; ii++) { channels.add(findChannel(ii + 1)); @@ -220,9 +220,9 @@ * parameters. */ public void parse(int crate, int runNumber, String[] configurationTables) { - // Track the number of banks that have been parsed. If the - // parameter values have not been populated after a certain - // number of banks, there is missing information. + // Track the number of banks that have been parsed. If the + // parameter values have not been populated after a certain + // number of banks, there is missing information. nBanks++; // Create a map that maps an identifier for each configuration @@ -256,10 +256,10 @@ * contain the DAQ configuration parameters. */ private void loadConfigMap(int crate, String[] configTables) { - // Iterate over each configuration table. + // Iterate over each configuration table. for(String configTable : configTables) { - // Split each table into rows and iterate over the rows. - rowLoop: + // Split each table into rows and iterate over the rows. + rowLoop: for(String line : configTable.trim().split("\n")) { // Split the first column from the row. String[] cols = line.trim().split(" +", 2); @@ -290,8 +290,8 @@ // This entry indicates which triggers are enabled and // needs to be parsed differently than normal. else if(key.startsWith("SSP_HPS_SET_IO_SRC")) { - // The first "parameter value" is a hardware code - // that identifies the trigger. Obtain it. + // The first "parameter value" is a hardware code + // that identifies the trigger. Obtain it. int trig = Integer.valueOf(vals.get(1)); // There are two trigger of each type, singles and @@ -313,8 +313,8 @@ // This indicates a regular parameter that does not // require any special parsing. if(vals.size() > 1 && key.startsWith("SSP")) { - // List the parameter by "[ROW NAME]_[KEY]" and - // remove the key so that only the values remain. + // List the parameter by "[ROW NAME]_[KEY]" and + // remove the key so that only the values remain. key += "_" + vals.remove(0); } @@ -330,7 +330,7 @@ * format of <code>[PARAMETER KEY] --> { [PARAMETER VALUES] }</code>. */ public void parseConfigMap() { - // Parse simple FADC data. + // Parse simple FADC data. fadcNSA = Integer.valueOf(getConfigParameter("FADC250_NSA", 0)); fadcNSB = Integer.valueOf(getConfigParameter("FADC250_NSB", 0)); fadcNPEAK = Integer.valueOf(getConfigParameter("FADC250_NPEAK", 0)); @@ -345,12 +345,12 @@ // Parse trigger data. for(int ii = 0; ii < 2; ii++) { - // Check singles trigger cuts enabled status. + // Check singles trigger cuts enabled status. singlesNhitsEn[ii] = getBoolConfigSSP(ii, "SINGLES_NMIN", 1); singlesEnergyMinEn[ii] = getBoolConfigSSP(ii, "SINGLES_EMIN", 1); singlesEnergyMaxEn[ii] = getBoolConfigSSP(ii, "SINGLES_EMAX", 1); - // Check pair trigger cuts enabled status. + // Check pair trigger cuts enabled status. pairsEnergySumMaxMinEn[ii] = getBoolConfigSSP(ii, "PAIRS_SUMMAX_MIN", 2); pairsEnergyDiffEn[ii] = getBoolConfigSSP(ii, "PAIRS_DIFFMAX", 1); pairsCoplanarityEn[ii] = getBoolConfigSSP(ii, "PAIRS_COPLANARITY", 1); @@ -383,7 +383,7 @@ * used to determine if the run is a "bugged" run. */ private void fixConfigMap2014Run(int runNumber) { - // If this is a good run, noting should be done. Return. + // If this is a good run, noting should be done. Return. if(runNumber > 3470 || runNumber < 3100) { return; } // Populate missing GTP entries. @@ -412,10 +412,10 @@ * the FADC channel with which they are associated. */ private void parseFADC(int crate, String key, List<String> vals) { - // The FADC slot is not stored on the same line as the other - // data and must be parsed and retained, as it is necessary - // for handling the subsequent lines. If this line is the - // FADC slot, store it. + // The FADC slot is not stored on the same line as the other + // data and must be parsed and retained, as it is necessary + // for handling the subsequent lines. If this line is the + // FADC slot, store it. if(key.equals("FADC250_SLOT")) { thisFadcSlot = Integer.valueOf(vals.get(0)); } @@ -449,8 +449,8 @@ * to FADC channels 0 - 15. */ private void setChannelParsFloat(int crate, int slot, Map<EcalChannel, Float> map, List<String> vals) { - // Iterate over each channel and map the database channel object - // to the corresponding list value. + // Iterate over each channel and map the database channel object + // to the corresponding list value. for(int ii = 0; ii < 16; ii++) { map.put(findChannel(crate, slot, ii), Float.valueOf(vals.get(ii))); } @@ -468,8 +468,8 @@ * objects representing the channel values. */ private void setChannelParsInt(int crate, int slot, Map<EcalChannel, Integer> map, List<String> vals) { - // Iterate over each channel and map the database channel object - // to the corresponding list value. + // Iterate over each channel and map the database channel object + // to the corresponding list value. for(int ii = 0; ii < 16; ii++) { map.put(findChannel(crate, slot, ii), Integer.valueOf(vals.get(ii))); } @@ -619,9 +619,9 @@ * can not be found, an error message is passed to the logger. */ public String getConfigParameter(String key, int ival) { - // Check the parameter map for the requested parameter key. + // Check the parameter map for the requested parameter key. if(configMap.containsKey(key)) { - // Get the list of values associated with this parameter key. + // Get the list of values associated with this parameter key. List<String> vals = configMap.get(key); // Check that the list of values contains a parameter for @@ -639,7 +639,7 @@ // If the key is not present... else { // If more than 2 banks have been read, the absence of a - // key represents an error. Log that this has occurred. + // key represents an error. Log that this has occurred. if(nBanks > 2) { Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "ConfigMap MISSING KEY: " + key); } @@ -659,13 +659,13 @@ * if it exists, and <code>null</code> if it does not. */ public EcalChannel findChannel(int crate, int fadcSlot, int fadcChan) { - // Search through the database channels for a channel that - // matches the the argument parameters. + // Search through the database channels for a channel that + // matches the the argument parameters. for (EcalChannel cc : channels) { - // A channel matches the argument if the slot and channel - // values are the same. Crate number must also match, but - // note that EcalChannel follows a different convention - // with respect to crate numbering. + // A channel matches the argument if the slot and channel + // values are the same. Crate number must also match, but + // note that EcalChannel follows a different convention + // with respect to crate numbering. if( ((cc.getCrate() - 1) * 2 == crate - 37) && (cc.getSlot() == fadcSlot) && (cc.getChannel() == fadcChan) ) { return cc; } Modified: java/trunk/record-util/src/main/java/org/hps/record/daqconfig/FADCConfig.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/daqconfig/FADCConfig.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/daqconfig/FADCConfig.java Wed Mar 9 11:43:24 2016 @@ -130,13 +130,13 @@ * per ADC. */ public float getGain(Point ixy) { - // Get the channel index. - Integer index = indexChannelMap.get(ixy); - - // If the channel index was defined, return the pedestal. + // Get the channel index. + Integer index = indexChannelMap.get(ixy); + + // If the channel index was defined, return the pedestal. if(index != null) { return getGain(index); } else { - throw new IllegalArgumentException(String.format("Crystal (%3d, %3d) does not exist.", ixy.x, ixy.y)); + throw new IllegalArgumentException(String.format("Crystal (%3d, %3d) does not exist.", ixy.x, ixy.y)); } } @@ -226,13 +226,13 @@ * of ADC. */ public float getPedestal(Point ixy) { - // Get the channel index. - Integer index = indexChannelMap.get(ixy); - - // If the channel index was defined, return the pedestal. + // Get the channel index. + Integer index = indexChannelMap.get(ixy); + + // If the channel index was defined, return the pedestal. if(index != null) { return getPedestal(index); } else { - throw new IllegalArgumentException(String.format("Crystal (%3d, %3d) does not exist.", ixy.x, ixy.y)); + throw new IllegalArgumentException(String.format("Crystal (%3d, %3d) does not exist.", ixy.x, ixy.y)); } } @@ -307,7 +307,7 @@ @Override public void printConfig(PrintStream ps) { - // Print the basic configuration information. + // Print the basic configuration information. ps.println("FADC Configuration:"); ps.printf("\tMode :: %d%n", mode); ps.printf("\tNSA :: %d%n", nsa); @@ -322,23 +322,23 @@ // Iterate over each crystal y-index. yLoop: for(int iy = -5; iy <= 5; iy++) { - // iy = 0 does not exists; skip it! - if(iy == 0) { continue yLoop; } - - // Iterate over each crystal x-index. - xLoop: - for(int ix = -23; ix <= 23; ix++) { - // ix = 0 and the beam hole do not exist; skip these! - if(ix == 0) { continue xLoop; } - if((ix >= -10 && ix <= -2) && (iy == -1 || iy == 1)) { - continue xLoop; - } - - // Output the crystal indices, pedestal, and gain. - int channelID = indexChannelMap.get(new Point(ix, iy)); - ps.printf("\t%3d\t%3d\t%8.3f\t%8.3f\t%4d%n", ix, iy, - getPedestal(channelID), getGain(channelID), getThreshold(channelID)); - } + // iy = 0 does not exists; skip it! + if(iy == 0) { continue yLoop; } + + // Iterate over each crystal x-index. + xLoop: + for(int ix = -23; ix <= 23; ix++) { + // ix = 0 and the beam hole do not exist; skip these! + if(ix == 0) { continue xLoop; } + if((ix >= -10 && ix <= -2) && (iy == -1 || iy == 1)) { + continue xLoop; + } + + // Output the crystal indices, pedestal, and gain. + int channelID = indexChannelMap.get(new Point(ix, iy)); + ps.printf("\t%3d\t%3d\t%8.3f\t%8.3f\t%4d%n", ix, iy, + getPedestal(channelID), getGain(channelID), getThreshold(channelID)); + } } } Modified: java/trunk/record-util/src/main/java/org/hps/record/triggerbank/SSPData.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/triggerbank/SSPData.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/triggerbank/SSPData.java Wed Mar 9 11:43:24 2016 @@ -175,7 +175,7 @@ * of <code>SSPCosmicTrigger</code> objects. */ public List<SSPCosmicTrigger> getCosmicTriggers() { - return cosmicList; + return cosmicList; } /** @@ -184,7 +184,7 @@ * of <code>SSPPairTrigger</code> objects. */ public List<SSPPairTrigger> getPairTriggers() { - return pairList; + return pairList; } /** @@ -193,7 +193,7 @@ * of <code>SSPSinglesTrigger</code> objects. */ public List<SSPSinglesTrigger> getSinglesTriggers() { - return singlesList; + return singlesList; } /** Modified: java/trunk/record-util/src/main/java/org/hps/record/triggerbank/SSPNumberedTrigger.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/triggerbank/SSPNumberedTrigger.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/triggerbank/SSPNumberedTrigger.java Wed Mar 9 11:43:24 2016 @@ -10,16 +10,16 @@ * @see SSPTrigger */ public abstract class SSPNumberedTrigger extends SSPTrigger { - /** - * Instantiates the <code>SSPNumberedTrigger</code>. + /** + * Instantiates the <code>SSPNumberedTrigger</code>. * @param type - The type of trigger. * @param time - The time at which the trigger occurred in ns. * @param data - The trigger bit data. - */ - public SSPNumberedTrigger(int type, int time, int data) { - super(type, time, data); - } - + */ + public SSPNumberedTrigger(int type, int time, int data) { + super(type, time, data); + } + /** * Indicates whether the trigger was reported by the first of the * singles triggers. Modified: java/trunk/record-util/src/main/java/org/hps/record/triggerbank/SSPPairTrigger.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/triggerbank/SSPPairTrigger.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/triggerbank/SSPPairTrigger.java Wed Mar 9 11:43:24 2016 @@ -21,12 +21,12 @@ @Override public boolean isFirstTrigger() { - return (type == SSPData.TRIG_TYPE_PAIR0); + return (type == SSPData.TRIG_TYPE_PAIR0); } @Override public boolean isSecondTrigger() { - return (type == SSPData.TRIG_TYPE_PAIR1); + return (type == SSPData.TRIG_TYPE_PAIR1); } /** @@ -71,9 +71,9 @@ @Override public String toString() { - return String.format("Trigger %d :: %3d ns :: ESum: %d, EDiff: %d, ESlope: %d, Coplanarity: %d", - isFirstTrigger() ? 1 : 2, getTime(), passCutEnergySum() ? 1 : 0, - passCutEnergyDifference() ? 1 : 0, passCutEnergySlope() ? 1 : 0, - passCutCoplanarity() ? 1 : 0); + return String.format("Trigger %d :: %3d ns :: ESum: %d, EDiff: %d, ESlope: %d, Coplanarity: %d", + isFirstTrigger() ? 1 : 2, getTime(), passCutEnergySum() ? 1 : 0, + passCutEnergyDifference() ? 1 : 0, passCutEnergySlope() ? 1 : 0, + passCutCoplanarity() ? 1 : 0); } } Modified: java/trunk/record-util/src/main/java/org/hps/record/triggerbank/SSPSinglesTrigger.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/triggerbank/SSPSinglesTrigger.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/triggerbank/SSPSinglesTrigger.java Wed Mar 9 11:43:24 2016 @@ -27,12 +27,12 @@ @Override public boolean isFirstTrigger() { - return (type == SSPData.TRIG_TYPE_SINGLES0_BOT) || (type == SSPData.TRIG_TYPE_SINGLES0_TOP); + return (type == SSPData.TRIG_TYPE_SINGLES0_BOT) || (type == SSPData.TRIG_TYPE_SINGLES0_TOP); } @Override public boolean isSecondTrigger() { - return (type == SSPData.TRIG_TYPE_SINGLES1_BOT) || (type == SSPData.TRIG_TYPE_SINGLES1_TOP); + return (type == SSPData.TRIG_TYPE_SINGLES1_BOT) || (type == SSPData.TRIG_TYPE_SINGLES1_TOP); } /** @@ -67,8 +67,8 @@ @Override public String toString() { - return String.format("Trigger %d :: %3d ns :: EClusterLow: %d; EClusterHigh %d; HitCount: %d", - isFirstTrigger() ? 1 : 2, getTime(), passCutEnergyMin() ? 1 : 0, - passCutEnergyMax() ? 1 : 0, passCutHitCount() ? 1 : 0); + return String.format("Trigger %d :: %3d ns :: EClusterLow: %d; EClusterHigh %d; HitCount: %d", + isFirstTrigger() ? 1 : 2, getTime(), passCutEnergyMin() ? 1 : 0, + passCutEnergyMax() ? 1 : 0, passCutHitCount() ? 1 : 0); } } Modified: java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerModule.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerModule.java (original) +++ java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerModule.java Wed Mar 9 11:43:24 2016 @@ -44,8 +44,8 @@ * @see SSPCluster */ public final class TriggerModule { - /** The calorimeter mid-plane, defined by the photon beam position - * (30.52 mrad) at the calorimeter face (z = 1393 mm). */ + /** The calorimeter mid-plane, defined by the photon beam position + * (30.52 mrad) at the calorimeter face (z = 1393 mm). */ private static final double ORIGIN_X = 1393.0 * Math.tan(0.03052); /** The value of the parameter "F" in the energy slope equation @@ -104,23 +104,23 @@ * above zero) will be accepted. */ public TriggerModule() { - // Set the cluster singles cuts to accept all values by default. - cuts.put(CLUSTER_HIT_COUNT_LOW, 0.0); - cuts.put(CLUSTER_SEED_ENERGY_LOW, 0.0); - cuts.put(CLUSTER_SEED_ENERGY_HIGH, Double.MAX_VALUE); - cuts.put(CLUSTER_TOTAL_ENERGY_LOW, 0.0); - cuts.put(CLUSTER_TOTAL_ENERGY_HIGH, Double.MAX_VALUE); - - // Set the cluster pair cuts to accept all values by default. - cuts.put(PAIR_COPLANARITY_HIGH, 180.0); - cuts.put(PAIR_ENERGY_DIFFERENCE_HIGH, Double.MAX_VALUE); - cuts.put(PAIR_ENERGY_SLOPE_LOW, 0.0); - cuts.put(PAIR_ENERGY_SUM_LOW, 0.0); - cuts.put(PAIR_ENERGY_SUM_HIGH, Double.MAX_VALUE); - cuts.put(PAIR_TIME_COINCIDENCE, Double.MAX_VALUE); - - // Set the default value of the energy slope parameter F. - cuts.put(PAIR_ENERGY_SLOPE_F, 0.0055); + // Set the cluster singles cuts to accept all values by default. + cuts.put(CLUSTER_HIT_COUNT_LOW, 0.0); + cuts.put(CLUSTER_SEED_ENERGY_LOW, 0.0); + cuts.put(CLUSTER_SEED_ENERGY_HIGH, Double.MAX_VALUE); + cuts.put(CLUSTER_TOTAL_ENERGY_LOW, 0.0); + cuts.put(CLUSTER_TOTAL_ENERGY_HIGH, Double.MAX_VALUE); + + // Set the cluster pair cuts to accept all values by default. + cuts.put(PAIR_COPLANARITY_HIGH, 180.0); + cuts.put(PAIR_ENERGY_DIFFERENCE_HIGH, Double.MAX_VALUE); + cuts.put(PAIR_ENERGY_SLOPE_LOW, 0.0); + cuts.put(PAIR_ENERGY_SUM_LOW, 0.0); + cuts.put(PAIR_ENERGY_SUM_HIGH, Double.MAX_VALUE); + cuts.put(PAIR_TIME_COINCIDENCE, Double.MAX_VALUE); + + // Set the default value of the energy slope parameter F. + cuts.put(PAIR_ENERGY_SLOPE_F, 0.0055); } /** @@ -142,25 +142,25 @@ * </ul> */ public TriggerModule(double... cutValues) { - // Set the cuts to the default values. - this(); - - // Define the cuts in the order that they correspond to the - // value arguments. - String[] cutID = { CLUSTER_HIT_COUNT_LOW, CLUSTER_SEED_ENERGY_LOW, CLUSTER_SEED_ENERGY_HIGH, - CLUSTER_TOTAL_ENERGY_LOW, CLUSTER_TOTAL_ENERGY_HIGH, PAIR_ENERGY_SUM_LOW, PAIR_ENERGY_SUM_HIGH, - PAIR_ENERGY_DIFFERENCE_HIGH, PAIR_ENERGY_SLOPE_LOW, PAIR_COPLANARITY_HIGH, PAIR_ENERGY_SLOPE_F }; - - // Iterate over the value arguments and assign them to the - // appropriate cut. - for(int i = 0; i < cutValues.length; i++) { - // If more values were given then cuts exist, break from - // the loop. - if(i == 11) { break; } - - // Set the current cut to its corresponding value. - cuts.put(cutID[i], cutValues[i]); - } + // Set the cuts to the default values. + this(); + + // Define the cuts in the order that they correspond to the + // value arguments. + String[] cutID = { CLUSTER_HIT_COUNT_LOW, CLUSTER_SEED_ENERGY_LOW, CLUSTER_SEED_ENERGY_HIGH, + CLUSTER_TOTAL_ENERGY_LOW, CLUSTER_TOTAL_ENERGY_HIGH, PAIR_ENERGY_SUM_LOW, PAIR_ENERGY_SUM_HIGH, + PAIR_ENERGY_DIFFERENCE_HIGH, PAIR_ENERGY_SLOPE_LOW, PAIR_COPLANARITY_HIGH, PAIR_ENERGY_SLOPE_F }; + + // Iterate over the value arguments and assign them to the + // appropriate cut. + for(int i = 0; i < cutValues.length; i++) { + // If more values were given then cuts exist, break from + // the loop. + if(i == 11) { break; } + + // Set the current cut to its corresponding value. + cuts.put(cutID[i], cutValues[i]); + } } /** @@ -172,14 +172,14 @@ * specified in the argument is not valid. */ public double getCutValue(String cut) throws IllegalArgumentException { - // Try to get the indicated cut. - Double value = cuts.get(cut); - - // If the cut is valid, return it. - if(value != null) { return value.doubleValue(); } - - // Otherwise, produce an exception. - else { throw new IllegalArgumentException(String.format("Cut \"%s\" does not exist.", cut)); } + // Try to get the indicated cut. + Double value = cuts.get(cut); + + // If the cut is valid, return it. + if(value != null) { return value.doubleValue(); } + + // Otherwise, produce an exception. + else { throw new IllegalArgumentException(String.format("Cut \"%s\" does not exist.", cut)); } } /** @@ -190,22 +190,22 @@ * @param config - The DAQ configuration settings. */ public void loadDAQConfiguration(SinglesTriggerConfig config) { - // Set the trigger values. - setCutValue(CLUSTER_TOTAL_ENERGY_LOW, config.getEnergyMinCutConfig().getLowerBound()); - setCutValue(CLUSTER_TOTAL_ENERGY_HIGH, config.getEnergyMaxCutConfig().getUpperBound()); - setCutValue(CLUSTER_HIT_COUNT_LOW, config.getHitCountCutConfig().getLowerBound()); - - // The remaining triggers should be set to their default values. - // These settings effectively accept all possible clusters. - cuts.put(PAIR_COPLANARITY_HIGH, 180.0); - cuts.put(PAIR_ENERGY_DIFFERENCE_HIGH, Double.MAX_VALUE); - cuts.put(PAIR_ENERGY_SLOPE_LOW, 0.0); - cuts.put(PAIR_ENERGY_SUM_LOW, 0.0); - cuts.put(PAIR_ENERGY_SUM_HIGH, Double.MAX_VALUE); - cuts.put(PAIR_TIME_COINCIDENCE, Double.MAX_VALUE); - - // Set the default value of the energy slope parameter F. - cuts.put(PAIR_ENERGY_SLOPE_F, 0.0055); + // Set the trigger values. + setCutValue(CLUSTER_TOTAL_ENERGY_LOW, config.getEnergyMinCutConfig().getLowerBound()); + setCutValue(CLUSTER_TOTAL_ENERGY_HIGH, config.getEnergyMaxCutConfig().getUpperBound()); + setCutValue(CLUSTER_HIT_COUNT_LOW, config.getHitCountCutConfig().getLowerBound()); + + // The remaining triggers should be set to their default values. + // These settings effectively accept all possible clusters. + cuts.put(PAIR_COPLANARITY_HIGH, 180.0); + cuts.put(PAIR_ENERGY_DIFFERENCE_HIGH, Double.MAX_VALUE); + cuts.put(PAIR_ENERGY_SLOPE_LOW, 0.0); + cuts.put(PAIR_ENERGY_SUM_LOW, 0.0); + cuts.put(PAIR_ENERGY_SUM_HIGH, Double.MAX_VALUE); + cuts.put(PAIR_TIME_COINCIDENCE, Double.MAX_VALUE); + + // Set the default value of the energy slope parameter F. + cuts.put(PAIR_ENERGY_SLOPE_F, 0.0055); } /** @@ -215,22 +215,22 @@ * @param config - The DAQ configuration settings. */ public void loadDAQConfiguration(PairTriggerConfig config) { - // Set the trigger values. - setCutValue(CLUSTER_TOTAL_ENERGY_LOW, config.getEnergyMinCutConfig().getLowerBound()); - setCutValue(CLUSTER_TOTAL_ENERGY_HIGH, config.getEnergyMaxCutConfig().getUpperBound()); - setCutValue(CLUSTER_HIT_COUNT_LOW, config.getHitCountCutConfig().getLowerBound()); - - // The remaining triggers should be set to their default values. - // These settings effectively accept all possible clusters. - cuts.put(PAIR_COPLANARITY_HIGH, config.getCoplanarityCutConfig().getUpperBound()); - cuts.put(PAIR_ENERGY_DIFFERENCE_HIGH, config.getEnergyDifferenceCutConfig().getUpperBound()); - cuts.put(PAIR_ENERGY_SLOPE_LOW, config.getEnergySlopeCutConfig().getLowerBound()); - cuts.put(PAIR_ENERGY_SUM_LOW, config.getEnergySumCutConfig().getLowerBound()); - cuts.put(PAIR_ENERGY_SUM_HIGH, config.getEnergySumCutConfig().getUpperBound()); - cuts.put(PAIR_TIME_COINCIDENCE, config.getTimeDifferenceCutConfig().getUpperBound() * 4.0); - - // Set the default value of the energy slope parameter F. - cuts.put(PAIR_ENERGY_SLOPE_F, config.getEnergySlopeCutConfig().getParameterF()); + // Set the trigger values. + setCutValue(CLUSTER_TOTAL_ENERGY_LOW, config.getEnergyMinCutConfig().getLowerBound()); + setCutValue(CLUSTER_TOTAL_ENERGY_HIGH, config.getEnergyMaxCutConfig().getUpperBound()); + setCutValue(CLUSTER_HIT_COUNT_LOW, config.getHitCountCutConfig().getLowerBound()); + + // The remaining triggers should be set to their default values. + // These settings effectively accept all possible clusters. + cuts.put(PAIR_COPLANARITY_HIGH, config.getCoplanarityCutConfig().getUpperBound()); + cuts.put(PAIR_ENERGY_DIFFERENCE_HIGH, config.getEnergyDifferenceCutConfig().getUpperBound()); + cuts.put(PAIR_ENERGY_SLOPE_LOW, config.getEnergySlopeCutConfig().getLowerBound()); + cuts.put(PAIR_ENERGY_SUM_LOW, config.getEnergySumCutConfig().getLowerBound()); + cuts.put(PAIR_ENERGY_SUM_HIGH, config.getEnergySumCutConfig().getUpperBound()); + cuts.put(PAIR_TIME_COINCIDENCE, config.getTimeDifferenceCutConfig().getUpperBound() * 4.0); + + // Set the default value of the energy slope parameter F. + cuts.put(PAIR_ENERGY_SLOPE_F, config.getEnergySlopeCutConfig().getParameterF()); } /** @@ -244,76 +244,76 @@ * identifier is not valid. */ public void setCutValue(String cut, double value) throws IllegalArgumentException { - // Make sure that the cut exists. If it does, change it to the - // new cut value. - if(cuts.containsKey(cut)) { - cuts.put(cut, value); - } - - // Otherwise, throw an exception. - else { throw new IllegalArgumentException(String.format("Cut \"%s\" does not exist.", cut)); } - } - - /** - * Sets the cluster singles cuts to the values parsed from an - * argument string. - * @param isSingles - Indicates whether the parser should expect - * 10 cut values (for pairs) or 3 (for singles). - * @param cutValues - A string representing the cuts values. This - * must be formatted in the style of "Emin Emax Nmin ...". - */ + // Make sure that the cut exists. If it does, change it to the + // new cut value. + if(cuts.containsKey(cut)) { + cuts.put(cut, value); + } + + // Otherwise, throw an exception. + else { throw new IllegalArgumentException(String.format("Cut \"%s\" does not exist.", cut)); } + } + + /** + * Sets the cluster singles cuts to the values parsed from an + * argument string. + * @param isSingles - Indicates whether the parser should expect + * 10 cut values (for pairs) or 3 (for singles). + * @param cutValues - A string representing the cuts values. This + * must be formatted in the style of "Emin Emax Nmin ...". + */ // TODO: Specify in JavaDoc what the order of these arguments is. - public void setCutValues(boolean isSingles, String cutValues) { - // Make sure that the string is not null. - if(cutValues == null) { - throw new NullPointerException(String.format("Cut arguments for trigger are null!")); - } - - // Tokenize the argument string. - StringTokenizer tokens = new StringTokenizer(cutValues); - - // Store the cut values. Entry format is: - // clusterEnergyMin clusterEnergyMax hitCountMin - // clusterEnergyMin clusterEnergyMax hitCountMin pairSumMin pairSumMax pairDiffMax pairSlopeMin pairSlopeF pairCoplanarityMax pairTimeCoincidence - double cuts[]; - if(isSingles) { cuts = new double[] { 0.0, 8.191, 0 }; } - else { cuts = new double[] { 0.0, 8.191, 0, 0, 8.191, 8.191, 0, 0.0055, 180, Double.MAX_VALUE }; } - String[] cutNames = { "clusterEnergyMin", "clusterEnergyMax", "hitCountMin", - "pairSumMin", "pairSumMax", "pairDiffMax", "pairSlopeMin", "pairSlopeF", - "pairCoplanarityMax", "pairTimeCoincidence" }; - - // Iterate over the number of cuts and extract that many values - // from the cut value string. - for(int cutNum = 0; cutNum < cuts.length; cutNum++) { - // If there are no more tokens left, the argument string - // is missing some values. Throw an exception! - if(tokens.hasMoreTokens()) { - // Get the next token from the string. - String arg = tokens.nextToken(); - - // Try to parse the token as a double. All cut values - // should be rendered as doubles (or integers, which - // can be parsed as doubles). If it is not, the string - // is improperly formatted. - try { cuts[cutNum] = Double.parseDouble(arg); } - catch(NumberFormatException e) { - throw new NumberFormatException(String.format("Argument for \"%s\" improperly formatted: %s", cutNames[cutNum], arg)); - } - } - } - - // Store the cuts in the trigger. - setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, cuts[0]); - setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, cuts[1]); - setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, cuts[2]); - setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, cuts[3]); - setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, cuts[4]); - setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, cuts[5]); - setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, cuts[6]); - setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_F, cuts[7]); - setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, cuts[8]); - setCutValue(TriggerModule.PAIR_TIME_COINCIDENCE, cuts[9]); - } + public void setCutValues(boolean isSingles, String cutValues) { + // Make sure that the string is not null. + if(cutValues == null) { + throw new NullPointerException(String.format("Cut arguments for trigger are null!")); + } + + // Tokenize the argument string. + StringTokenizer tokens = new StringTokenizer(cutValues); + + // Store the cut values. Entry format is: + // clusterEnergyMin clusterEnergyMax hitCountMin + // clusterEnergyMin clusterEnergyMax hitCountMin pairSumMin pairSumMax pairDiffMax pairSlopeMin pairSlopeF pairCoplanarityMax pairTimeCoincidence + double cuts[]; + if(isSingles) { cuts = new double[] { 0.0, 8.191, 0 }; } + else { cuts = new double[] { 0.0, 8.191, 0, 0, 8.191, 8.191, 0, 0.0055, 180, Double.MAX_VALUE }; } + String[] cutNames = { "clusterEnergyMin", "clusterEnergyMax", "hitCountMin", + "pairSumMin", "pairSumMax", "pairDiffMax", "pairSlopeMin", "pairSlopeF", + "pairCoplanarityMax", "pairTimeCoincidence" }; + + // Iterate over the number of cuts and extract that many values + // from the cut value string. + for(int cutNum = 0; cutNum < cuts.length; cutNum++) { + // If there are no more tokens left, the argument string + // is missing some values. Throw an exception! + if(tokens.hasMoreTokens()) { + // Get the next token from the string. + String arg = tokens.nextToken(); + + // Try to parse the token as a double. All cut values + // should be rendered as doubles (or integers, which + // can be parsed as doubles). If it is not, the string + // is improperly formatted. + try { cuts[cutNum] = Double.parseDouble(arg); } + catch(NumberFormatException e) { + throw new NumberFormatException(String.format("Argument for \"%s\" improperly formatted: %s", cutNames[cutNum], arg)); + } + } + } + + // Store the cuts in the trigger. + setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, cuts[0]); + setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, cuts[1]); + setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, cuts[2]); + setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, cuts[3]); + setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, cuts[4]); + setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, cuts[5]); + setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, cuts[6]); + setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_F, cuts[7]); + setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, cuts[8]); + setCutValue(TriggerModule.PAIR_TIME_COINCIDENCE, cuts[9]); + } /** * Checks whether a cluster passes the cluster hit count cut. This @@ -346,7 +346,7 @@ * and <code>false</code> if the cluster does not. */ public boolean clusterSeedEnergyCut(Cluster cluster) { - return clusterSeedEnergyCut(getValueClusterSeedEnergy(cluster)); + return clusterSeedEnergyCut(getValueClusterSeedEnergy(cluster)); } /** @@ -357,7 +357,7 @@ * and <code>false</code> if the cluster does not. */ public boolean clusterSeedEnergyCutHigh(Cluster cluster) { - return clusterSeedEnergyCutHigh(getValueClusterSeedEnergy(cluster)); + return clusterSeedEnergyCutHigh(getValueClusterSeedEnergy(cluster)); } /** @@ -368,7 +368,7 @@ * and <code>false</code> if the cluster does not. */ public boolean clusterSeedEnergyCutLow(Cluster cluster) { - return clusterSeedEnergyCutLow(getValueClusterSeedEnergy(cluster)); + return clusterSeedEnergyCutLow(getValueClusterSeedEnergy(cluster)); } /** @@ -380,7 +380,7 @@ * and <code>false</code> if the cluster does not. */ public boolean clusterTotalEnergyCut(Cluster cluster) { - return clusterTotalEnergyCut(getValueClusterTotalEnergy(cluster)); + return clusterTotalEnergyCut(getValueClusterTotalEnergy(cluster)); } /** @@ -392,7 +392,7 @@ * and <code>false</code> if the cluster does not. */ public boolean clusterTotalEnergyCutHigh(Cluster cluster) { - return clusterTotalEnergyCutHigh(getValueClusterTotalEnergy(cluster)); + return clusterTotalEnergyCutHigh(getValueClusterTotalEnergy(cluster)); } /** @@ -404,7 +404,7 @@ * and <code>false</code> if the cluster does not. */ public boolean clusterTotalEnergyCutLow(Cluster cluster) { - return clusterTotalEnergyCutLow(getValueClusterTotalEnergy(cluster)); + return clusterTotalEnergyCutLow(getValueClusterTotalEnergy(cluster)); } /** @@ -416,7 +416,7 @@ * and <code>false</code> if the cluster does not. */ public boolean clusterTotalEnergyCut(SSPCluster cluster) { - return clusterTotalEnergyCut(getValueClusterTotalEnergy(cluster)); + return clusterTotalEnergyCut(getValueClusterTotalEnergy(cluster)); } /** @@ -428,7 +428,7 @@ * and <code>false</code> if the cluster does not. */ public boolean clusterTotalEnergyCutHigh(SSPCluster cluster) { - return clusterTotalEnergyCutHigh(getValueClusterTotalEnergy(cluster)); + return clusterTotalEnergyCutHigh(getValueClusterTotalEnergy(cluster)); } /** @@ -440,7 +440,7 @@ * and <code>false</code> if the cluster does not. */ public boolean clusterTotalEnergyCutLow(SSPCluster cluster) { - return clusterTotalEnergyCutLow(getValueClusterTotalEnergy(cluster)); + return clusterTotalEnergyCutLow(getValueClusterTotalEnergy(cluster)); } /** @@ -450,12 +450,12 @@ * @return Returns displacement of the cluster. */ public static double getClusterDistance(Cluster cluster) { - // Get the variables from the cluster. - double x = getClusterX(cluster); - double y = getClusterY(cluster); - - // Perform the calculation. - return getClusterDistance(x, y); + // Get the variables from the cluster. + double x = getClusterX(cluster); + double y = getClusterY(cluster); + + // Perform the calculation. + return getClusterDistance(x, y); } /** @@ -465,12 +465,12 @@ * @return Returns displacement of the cluster. */ public static double getClusterDistance(SSPCluster cluster) { - // Get the variables from the cluster. - double x = getClusterX(cluster); - double y = getClusterY(cluster); - - // Perform the calculation. - return getClusterDistance(x, y); + // Get the variables from the cluster. + double x = getClusterX(cluster); + double y = getClusterY(cluster); + + // Perform the calculation. + return getClusterDistance(x, y); } /** @@ -480,7 +480,7 @@ * @return Returns the size as an <code>int</code>. */ public static final double getClusterHitCount(Cluster cluster) { - return cluster.getCalorimeterHits().size(); + return cluster.getCalorimeterHits().size(); } /** @@ -490,7 +490,7 @@ * @return Returns the size as an <code>int</code>. */ public static final double getClusterHitCount(SSPCluster cluster) { - return cluster.getHitCount(); + return cluster.getHitCount(); } /** @@ -500,11 +500,11 @@ * object. */ public static final CalorimeterHit getClusterSeedHit(Cluster cluster) { - if(getClusterHitCount(cluster) > 0) { - return cluster.getCalorimeterHits().get(0); - } else { - throw new NullPointerException("Cluster does not define hits!"); - } + if(getClusterHitCount(cluster) > 0) { + return cluster.getCalorimeterHits().get(0); + } else { + throw new NullPointerException("Cluster does not define hits!"); + } } /** @@ -514,7 +514,7 @@ * @return Returns the time as a <code>double</code>. */ public static final double getClusterTime(Cluster cluster) { - return getClusterSeedHit(cluster).getTime(); + return getClusterSeedHit(cluster).getTime(); } /** @@ -524,7 +524,7 @@ * @return Returns the time as a <code>double</code>. */ public static final double getClusterTime(SSPCluster cluster) { - return cluster.getTime(); + return cluster.getTime(); } /** @@ -534,7 +534,7 @@ * @return Returns the cluster x-position. */ public static double getClusterX(Cluster cluster) { - return getCrystalPosition(getClusterXIndex(cluster), getClusterYIndex(cluster))[0]; + return getCrystalPosition(getClusterXIndex(cluster), getClusterYIndex(cluster))[0]; } /** @@ -544,7 +544,7 @@ * @return Returns the cluster x-position. */ public static double getClusterX(SSPCluster cluster) { - return getCrystalPosition(cluster.getXIndex(), cluster.getYIndex())[0]; + return getCrystalPosition(cluster.getXIndex(), cluster.getYIndex())[0]; } /** @@ -553,7 +553,7 @@ * @return Returns the index as an <code>int</code>. */ public static final int getClusterXIndex(Cluster cluster) { - return getClusterSeedHit(cluster).getIdentifierFieldValue("ix"); + return getClusterSeedHit(cluster).getIdentifierFieldValue("ix"); } /** @@ -562,7 +562,7 @@ * @return Returns the index as an <code>int</code>. */ public static final int getClusterXIndex(SSPCluster cluster) { - return cluster.getXIndex(); + return cluster.getXIndex(); } /** @@ -572,7 +572,7 @@ * @return Returns the cluster y-position. */ public static double getClusterY(Cluster cluster) { - return getCrystalPosition(getClusterXIndex(cluster), getClusterYIndex(cluster))[1]; + return getCrystalPosition(getClusterXIndex(cluster), getClusterYIndex(cluster))[1]; } /** @@ -582,7 +582,7 @@ * @return Returns the cluster y-position. */ public static double getClusterY(SSPCluster cluster) { - return getCrystalPosition(cluster.getXIndex(), cluster.getYIndex())[1]; + return getCrystalPosition(cluster.getXIndex(), cluster.getYIndex())[1]; } /** @@ -591,7 +591,7 @@ * @return Returns the index as an <code>int</code>. */ public static final int getClusterYIndex(Cluster cluster) { - return getClusterSeedHit(cluster).getIdentifierFieldValue("iy"); + return getClusterSeedHit(cluster).getIdentifierFieldValue("iy"); } /** @@ -600,7 +600,7 @@ * @return Returns the index as an <code>int</code>. */ public static final int getClusterYIndex(SSPCluster cluster) { - return cluster.getYIndex(); + return cluster.getYIndex(); } /** @@ -610,7 +610,7 @@ * @return Returns the cluster z-position. */ public static double getClusterZ(Cluster cluster) { - return getCrystalPosition(getClusterXIndex(cluster), getClusterYIndex(cluster))[2]; + return getCrystalPosition(getClusterXIndex(cluster), getClusterYIndex(cluster))[2]; } /** @@ -620,7 +620,7 @@ * @return Returns the cluster z-position. */ public static double getClusterZ(SSPCluster cluster) { - return getCrystalPosition(cluster.getXIndex(), cluster.getYIndex())[2]; + return getCrystalPosition(cluster.getXIndex(), cluster.getYIndex())[2]; } /** @@ -632,48 +632,48 @@ * first entry in the array is always the top cluster, with the * bottom cluster in the next position. */ - public static <E> List<E[]> getTopBottomPairs(List<E> clusters, Class<E> clusterType) throws IllegalArgumentException { - // Ensure that only valid cluster types are processed. - if(!clusterType.equals(Cluster.class) && !clusterType.equals(SSPCluster.class)) { - throw new IllegalArgumentException("Class \"" + clusterType.getSimpleName() + "\" is not a supported cluster type."); - } - - // Create a list to store top clusters, bottom clusters, and - // cluster pairs. - List<E> topClusters = new ArrayList<E>(); - List<E> botClusters = new ArrayList<E>(); - List<E[]> pairClusters = new ArrayList<E[]>(); - - // Separate the cluster list into top/bottom clusters. - for(E cluster : clusters) { - // Process LCIO clusters... - if(clusterType.equals(Cluster.class)) { - if(getClusterYIndex((Cluster) cluster) > 0) { - topClusters.add(cluster); - } else { botClusters.add(cluster); } - } - - // Process SSP clusters... - else if(clusterType.equals(SSPCluster.class)) { - if(getClusterYIndex((SSPCluster) cluster) > 0) { - topClusters.add(cluster); - } else { botClusters.add(cluster); } - } - } - - // Form all top/bottom cluster pairs. - for(E topCluster : topClusters) { - for(E botCluster : botClusters) { - @SuppressWarnings("unchecked") - E[] pair = (E[]) Array.newInstance(clusterType, 2); - pair[0] = topCluster; - pair[1] = botCluster; - pairClusters.add(pair); - } - } - - // Return the cluster pairs. - return pairClusters; + public static <E> List<E[]> getTopBottomPairs(List<E> clusters, Class<E> clusterType) throws IllegalArgumentException { + // Ensure that only valid cluster types are processed. + if(!clusterType.equals(Cluster.class) && !clusterType.equals(SSPCluster.class)) { + throw new IllegalArgumentException("Class \"" + clusterType.getSimpleName() + "\" is not a supported cluster type."); + } + + // Create a list to store top clusters, bottom clusters, and + // cluster pairs. + List<E> topClusters = new ArrayList<E>(); + List<E> botClusters = new ArrayList<E>(); + List<E[]> pairClusters = new ArrayList<E[]>(); + + // Separate the cluster list into top/bottom clusters. + for(E cluster : clusters) { + // Process LCIO clusters... + if(clusterType.equals(Cluster.class)) { + if(getClusterYIndex((Cluster) cluster) > 0) { + topClusters.add(cluster); + } else { botClusters.add(cluster); } + } + + // Process SSP clusters... + else if(clusterType.equals(SSPCluster.class)) { + if(getClusterYIndex((SSPCluster) cluster) > 0) { + topClusters.add(cluster); + } else { botClusters.add(cluster); } + } + } + + // Form all top/bottom cluster pairs. + for(E topCluster : topClusters) { + for(E botCluster : botClusters) { + @SuppressWarnings("unchecked") + E[] pair = (E[]) Array.newInstance(clusterType, 2); + pair[0] = topCluster; + pair[1] = botCluster; + pairClusters.add(pair); + } + } + + // Return the cluster pairs. + return pairClusters; } /** @@ -685,29 +685,29 @@ * first entry in the array is always the top cluster, with the * bottom cluster in the next position. */ - public static List<Cluster[]> getTopBottomPairs(Cluster... clusters) { - // Create a list to store top clusters, bottom clusters, and - // cluster pairs. - List<Cluster> topClusters = new ArrayList<Cluster>(); - List<Cluster> botClusters = new ArrayList<Cluster>(); - List<Cluster[]> pairClusters = new ArrayList<Cluster[]>(); - - // Separate the cluster list into top/bottom clusters. - for(Cluster cluster : clusters) { - if(getClusterYIndex(cluster) > 0) { - topClusters.add(cluster); - } else { botClusters.add(cluster); } - } - - // Form all top/bottom cluster pairs. - for(Cluster topCluster : topClusters) { - for(Cluster botCluster : botClusters) { - pairClusters.add(new Cluster[] { topCluster, botCluster }); - } - } - - // Return the cluster pairs. - return pairClusters; + public static List<Cluster[]> getTopBottomPairs(Cluster... clusters) { + // Create a list to store top clusters, bottom clusters, and + // cluster pairs. + List<Cluster> topClusters = new ArrayList<Cluster>(); + List<Cluster> botClusters = new ArrayList<Cluster>(); + List<Cluster[]> pairClusters = new ArrayList<Cluster[]>(); + + // Separate the cluster list into top/bottom clusters. + for(Cluster cluster : clusters) { + if(getClusterYIndex(cluster) > 0) { + topClusters.add(cluster); + } else { botClusters.add(cluster); } + } + + // Form all top/bottom cluster pairs. + for(Cluster topCluster : topClusters) { + for(Cluster botCluster : botClusters) { + pairClusters.add(new Cluster[] { topCluster, botCluster }); + } + } + + // Return the cluster pairs. + return pairClusters; } /** @@ -719,29 +719,29 @@ * The first entry in the array is always the top cluster, with * the bottom cluster in the next position. */ - public static List<SSPCluster[]> getTopBottomPairs(SSPCluster... clusters) { - // Create a list to store top clusters, bottom clusters, and - // cluster pairs. - List<SSPCluster> topClusters = new ArrayList<SSPCluster>(); - List<SSPCluster> botClusters = new ArrayList<SSPCluster>(); - List<SSPCluster[]> pairClusters = new ArrayList<SSPCluster[]>(); - - // Separate the cluster list into top/bottom clusters. - for(SSPCluster cluster : clusters) { - if(getClusterYIndex(cluster) > 0) { - topClusters.add(cluster); - } else { botClusters.add(cluster); } - } - - // Form all top/bottom cluster pairs. - for(SSPCluster topCluster : topClusters) { - for(SSPCluster botCluster : botClusters) { - pairClusters.add(new SSPCluster[] { topCluster, botCluster }); - } - } - - // Return the cluster pairs. - return pairClusters; + public static List<SSPCluster[]> getTopBottomPairs(SSPCluster... clusters) { + // Create a list to store top clusters, bottom clusters, and + // cluster pairs. + List<SSPCluster> topClusters = new ArrayList<SSPCluster>(); + List<SSPCluster> botClusters = new ArrayList<SSPCluster>(); + List<SSPCluster[]> pairClusters = new ArrayList<SSPCluster[]>(); + + // Separate the cluster list into top/bottom clusters. + for(SSPCluster cluster : clusters) { + if(getClusterYIndex(cluster) > 0) { + topClusters.add(cluster); + } else { botClusters.add(cluster); } + } + + // Form all top/bottom cluster pairs. + for(SSPCluster topCluster : topClusters) { + for(SSPCluster botCluster : botClusters) { + pairClusters.add(new SSPCluster[] { topCluster, botCluster }); + } + } + + // Return the cluster pairs. + return pairClusters; } /** @@ -805,12 +805,12 @@ * @return Returns the cut value. */ public static double getValueCoplanarity(Cluster[] clusterPair) { - // Get the variables used by the calculation. - double x[] = { getClusterX(clusterPair[0]), getClusterX(clusterPair[1]) }; - double y[] = { getClusterY(clusterPair[0]), getClusterY(clusterPair[1]) }; - - // Return the calculated value. - return getValueCoplanarity(x, y); + // Get the variables used by the calculation. + double x[] = { getClusterX(clusterPair[0]), getClusterX(clusterPair[1]) }; + double y[] = { getClusterY(clusterPair[0]), getClusterY(clusterPair[1]) }; + + // Return the calculated value. + return getValueCoplanarity(x, y); } /** @@ -821,12 +821,12 @@ * @return Returns the cut value. */ public static double getValueCoplanarity(SSPCluster[] clusterPair) { - // Get the variables used by the calculation. - double x[] = { getClusterX(clusterPair[0]), getClusterX(clusterPair[1]) }; - double y[] = { getClusterY(clusterPair[0]), getClusterY(clusterPair[1]) }; - - // Return the calculated value. - return getValueCoplanarity(x, y); + // Get the variables used by the calculation. + double x[] = { getClusterX(clusterPair[0]), getClusterX(clusterPair[1]) }; + double y[] = { getClusterY(clusterPair[0]), getClusterY(clusterPair[1]) }; + + // Return the calculated value. + return getValueCoplanarity(x, y); } /** @@ -838,14 +838,14 @@ */ @Deprecated public static double getValueCoplanarityLegacy(Cluster[] clusterPair) { - // Get the variables used by the calculation. - double x[] = { getClusterSeedHit(clusterPair[0]).getIdentifierFieldValue("ix"), - getClusterSeedHit(clusterPair[1]).getIdentifierFieldValue("ix") }; - double y[] = { getClusterSeedHit(clusterPair[0]).getIdentifierFieldValue("iy"), - getClusterSeedHit(clusterPair[1]).getIdentifierFieldValue("iy") }; - - // Return the calculated value. - return getValueCoplanarityLegacy(x, y); + // Get the variables used by the calculation. + double x[] = { getClusterSeedHit(clusterPair[0]).getIdentifierFieldValue("ix"), + getClusterSeedHit(clusterPair[1]).getIdentifierFieldValue("ix") }; + double y[] = { getClusterSeedHit(clusterPair[0]).getIdentifierFieldValue("iy"), + getClusterSeedHit(clusterPair[1]).getIdentifierFieldValue("iy") }; + + // Return the calculated value. + return getValueCoplanarityLegacy(x, y); } /** @@ -855,10 +855,10 @@ * @return Returns the difference between the cluster energies. */ public static double getValueEnergyDifference(Cluster[] clusterPair) { - // Get the variables used by the calculation. - double[] energy = { clusterPair[0].getEnergy(), clusterPair[1].getEnergy() }; - - // Perform the calculation. + // Get the variables used by the calculation. + double[] energy = { clusterPair[0].getEnergy(), clusterPair[1].getEnergy() }; + + // Perform the calculation. return getValueEnergyDifference(energy); } @@ -869,10 +869,10 @@ * @return Returns the difference between the cluster energies. */ public static double getValueEnergyDifference(SSPCluster[] clusterPair) { - // Get the variables used by the calculation. - double[] energy = { clusterPair[0].getEnergy(), clusterPair[1].getEnergy() }; - - // Perform the calculation. + // Get the variables used by the calculation. + double[] energy = { clusterPair[0].getEnergy(), clusterPair[1].getEnergy() }; + + // Perform the calculation. return getValueEnergyDifference(energy); } @@ -885,13 +885,13 @@ * @return Returns the energy slope value. */ public static double getValueEnergySlope(Cluster[] clusterPair, double energySlopeParamF) { - // Get the variables used by the calculation. - double[] energy = { clusterPair[0].getEnergy(), clusterPair[1].getEnergy() }; - double x[] = { getClusterX(clusterPair[0]), getClusterX(clusterPair[1]) }; - double y[] = { getClusterY(clusterPair[0]), getClusterY(clusterPair[1]) }; - - // Perform the calculation. - return getValueEnergySlope(energy, x, y, energySlopeParamF); + // Get the variables used by the calculation. + double[] energy = { clusterPair[0].getEnergy(), clusterPair[1].getEnergy() }; + double x[] = { getClusterX(clusterPair[0]), getClusterX(clusterPair[1]) }; + double y[] = { getClusterY(clusterPair[0]), getClusterY(clusterPair[1]) }; + + // Perform the calculation. + return getValueEnergySlope(energy, x, y, energySlopeParamF); } /** @@ -903,13 +903,13 @@ * @return Returns the energy slope value. */ public static double getValueEnergySlope(SSPCluster[] clusterPair, double energySlopeParamF) { - // Get the variables used by the calculation. - double[] energy = { clusterPair[0].getEnergy(), clusterPair[1].getEnergy() }; - double x[] = { getClusterX(clusterPair[0]), getClusterX(clusterPair[1]) }; - double y[] = { getClusterY(clusterPair[0]), getClusterY(clusterPair[1]) }; - - // Perform the calculation. - return getValueEnergySlope(energy, x, y, energySlopeParamF); + // Get the variables used by the calculation. + double[] energy = { clusterPair[0].getEnergy(), clusterPair[1].getEnergy() }; + double x[] = { getClusterX(clusterPair[0]), getClusterX(clusterPair[1]) }; + double y[] = { getClusterY(clusterPair[0]), getClusterY(clusterPair[1]) }; + + // Perform the calculation. + return getValueEnergySlope(energy, x, y, energySlopeParamF); } /** @@ -924,15 +924,15 @@ */ @Deprecated public static double getValueEnergySlopeLegacy(Cluster[] clusterPair, double energySlopeParamF) { - // Get the variables used by the calculation. - double[] energy = { clusterPair[0].getEnergy(), clusterPair[1].getEnergy() }; - double x[] = { getClusterSeedHit(clusterPair[0]).getIdentifierFieldValue("ix"), - getClusterSeedHit(clusterPair[1]).getIdentifierFieldValue("ix") }; - double y[] = { getClusterSeedHit(clusterPair[0]).getIdentifierFieldValue("iy"), - getClusterSeedHit(clusterPair[1]).getIdentifierFieldValue("iy") }; - - // Perform the calculation. - return getValueEnergySlopeLegacy(energy, x, y, energySlopeParamF); + // Get the variables used by the calculation. + double[] energy = { clusterPair[0].getEnergy(), clusterPair[1].getEnergy() }; + double x[] = { getClusterSeedHit(clusterPair[0]).getIdentifierFieldValue("ix"), + getClusterSeedHit(clusterPair[1]).getIdentifierFieldValue("ix") }; + double y[] = { getClusterSeedHit(clusterPair[0]).getIdentifierFieldValue("iy"), + getClusterSeedHit(clusterPair[1]).getIdentifierFieldValue("iy") }; + + // Perform the calculation. + return getValueEnergySlopeLegacy(energy, x, y, energySlopeParamF); } /** @@ -942,11 +942,11 @@ * @return Returns the sum of the cluster energies. */ public static double getValueEnergySum(Cluster[] clusterPair) { - // Get the variables used by the calculation. - double[] energy = { clusterPair[0].getEnergy(), clusterPair[1].getEnergy() }; - - // Perform the calculation. - return getValueEnergySum(energy); + // Get the variables used by the calculation. + double[] energy = { clusterPair[0].getEnergy(), clusterPair[1].getEnergy() }; + + // Perform the calculation. + return getValueEnergySum(energy); } /** @@ -956,11 +956,11 @@ * @return Returns the sum of the cluster energies. */ public static double getValueEnergySum(SSPCluster[] clusterPair) { - // Get the variables used by the calculation. - double[] energy = { clusterPair[0].getEnergy(), clusterPair[1].getEnergy() }; - - // Perform the calculation. - return getValueEnergySum(energy); + // Get the variables used by the calculation. + double[] energy = { clusterPair[0].getEnergy(), clusterPair[1].getEnergy() }; + + // Perform the calculation. + return getValueEnergySum(energy); } /** @@ -970,12 +970,12 @@ * @return Returns the absolute difference in the cluster times.. */ public static double getValueTimeCoincidence(Cluster[] clusterPair) { - // Get the variables used by the calculation. - double[] time = { clusterPair[0].getCalorimeterHits().get(0).getTime(), - clusterPair[1].getCalorimeterHits().get(0).getTime() }; - - // Perform the calculation. - return getValueTimeCoincidence(time); + // Get the variables used by the calculation. + double[] time = { clusterPair[0].getCalorimeterHits().get(0).getTime(), + clusterPair[1].getCalorimeterHits().get(0).getTime() }; + + // Perform the calculation. + return getValueTimeCoincidence(time); } /** @@ -985,34 +985,34 @@ * @return Returns the absolute difference in the cluster times.. */ public static double getValueTimeCoincidence(SSPCluster[] clusterPair) { - // Get the variables used by the calculation. - double[] time = { clusterPair[0].getTime(), clusterPair[1].getTime() }; - - // Perform the calculation. - return getValueTimeCoincidence(time); - } - - /** - * Indicates whether the argument cluster is located in the fiducial - * region or not. - * @param cluster - The cluster to check. - * @return Returns <code>true</code> if the cluster is located in - * the fiducial region and <code>false</code> otherwise. - */ - public static final boolean inFiducialRegion(Cluster cluster) { - return inFiducialRegion(getClusterXIndex(cluster), getClusterYIndex(cluster)); - } - - /** - * Indicates whether the argument cluster is located in the fiducial - * region or not. - * @param cluster - The cluster to check. - * @return Returns <code>true</code> if the cluster is located in - * the fiducial region and <code>false</code> otherwise. - */ - public static final boolean inFiducialRegion(SSPCluster cluster) { - return inFiducialRegion(getClusterXIndex(cluster), getClusterYIndex(cluster)); - } + // Get the variables used by the calculation. + double[] time = { clusterPair[0].getTime(), clusterPair[1].getTime() }; + + // Perform the calculation. + return getValueTimeCoincidence(time); + } + + /** + * Indicates whether the argument cluster is located in the fiducial + * region or not. + * @param cluster - The cluster to check. + * @return Returns <code>true</code> if the cluster is located in + * the fiducial region and <code>false</code> otherwise. + */ + public static final boolean inFiducialRegion(Cluster cluster) { + return inFiducialRegion(getClusterXIndex(cluster), getClusterYIndex(cluster)); + } + + /** + * Indicates whether the argument cluster is located in the fiducial + * region or not. + * @param cluster - The cluster to check. + * @return Returns <code>true</code> if the cluster is located in + * the fiducial region and <code>false</code> otherwise. + */ + public static final boolean inFiducialRegion(SSPCluster cluster) { + return inFiducialRegion(getClusterXIndex(cluster), getClusterYIndex(cluster)); + } /** * Checks if a cluster pair is coplanar to the beam within a given @@ -1094,7 +1094,7 @@ * the cut and <code>false</code> if it does not. */ public boolean pairEnergySumCut(Cluster[] clusterPair) { - return pairEnergySumCut(getValueEnergySum(clusterPair)); + return pairEnergySumCut(getValueEnergySum(clusterPair)); } /** @@ -1106,7 +1106,7 @@ * the cut and <code>false</code> if it does not. */ public boolean pairEnergySumCutHigh(Cluster[] clusterPair) { - return pairEnergySumCutHigh(getValueEnergySum(clusterPair)); + return pairEnergySumCutHigh(getValueEnergySum(clusterPair)); } /** @@ -1118,7 +1118,7 @@ * the cut and <code>false</code> if it does not. */ public boolean pairEnergySumCutLow(Cluster[] clusterPair) { - return pairEnergySumCutLow(getValueEnergySum(clusterPair)); + return pairEnergySumCutLow(getValueEnergySum(clusterPair)); } /** @@ -1131,7 +1131,7 @@ * the cut and <code>false</code> if it does not. */ public boolean pairEnergySumCut(SSPCluster[] clusterPair) { - return pairEnergySumCut(getValueEnergySum(clusterPair)); + return pairEnergySumCut(getValueEnergySum(clusterPair)); } /** @@ -1143,7 +1143,7 @@ * the cut and <code>false</code> if it does not. */ public boolean pairEnergySumCutHigh(SSPCluster[] clusterPair) { - return pairEnergySumCutHigh(getValueEnergySum(clusterPair)); + return pairEnergySumCutHigh(getValueEnergySum(clusterPair)); } /** @@ -1155,7 +1155,7 @@ * the cut and <code>false</code> if it does not. */ public boolean pairEnergySumCutLow(SSPCluster[] clusterPair) { - return pairEnergySumCutLow(getValueEnergySum(clusterPair)); + return pairEnergySumCutLow(getValueEnergySum(clusterPair)); } /** @@ -1167,7 +1167,7 @@ * the cut and <code>false</code> if it does not. */ public boolean pairTimeCoincidenceCut(Cluster[] clusterPair) { - return pairTimeCoincidenceCut(getValueTimeCoincidence(clusterPair)); + return pairTimeCoincidenceCut(getValueTimeCoincidence(clusterPair)); } /** @@ -1179,7 +1179,7 @@ * the cut and <code>false</code> if it does not. */ public boolean pairTimeCoincidenceCut(SSPCluster[] clusterPair) { - return pairTimeCoincidenceCut(getValueTimeCoincidence(clusterPair)); + return pairTimeCoincidenceCut(getValueTimeCoincidence(clusterPair)); } /** @@ -1280,22 +1280,22 @@ * the x-index and either of the cases where <code>iy == 0</code> * or <code>|iy| > 5</code> for the y-index. */ - private static double[] getCrystalPosition(int ix, int iy) throws IndexOutOfBoundsException { - // Make sure that the requested crystal is a valid crystal. - if(ix == 0 || ix < -23 || ix > 23) { - throw new IndexOutOfBoundsException(String.format("Value \"%d\" is invalid for field x-index.", ix)); - } if(iy == 0 || iy < -5 || iy > 5) { - throw new IndexOutOfBoundsException(String.format("Value \"%d\" is invalid for field y-index.", iy)); - } - - // Get the position map. - double posMap[]; - if(ix < 1) { posMap = position[5 - iy][22 - ix]; } - else { posMap = position[5 - iy][23 - ix]; } - - // Return the corrected mapped position. - return new double[] { posMap[0], posMap[2], posMap[1] }; - } + private static double[] getCrystalPosition(int ix, int iy) throws IndexOutOfBoundsException { + // Make sure that the requested crystal is a valid crystal. + if(ix == 0 || ix < -23 || ix > 23) { + throw new IndexOutOfBoundsException(String.format("Value \"%d\" is invalid for field x-index.", ix)); + } if(iy == 0 || iy < -5 || iy > 5) { + throw new IndexOutOfBoundsException(String.format("Value \"%d\" is invalid for field y-index.", iy)); + } + + // Get the position map. + double posMap[]; + if(ix < 1) { posMap = position[5 - iy][22 - ix]; } + else { posMap = position[5 - iy][23 - ix]; } + + // Return the corrected mapped position. + return new double[] { posMap[0], posMap[2], posMap[1] }; + } /** * Calculates the value used by the coplanarity cut. @@ -1309,7 +1309,7 @@ // Get the cluster angles. int[] clusterAngle = new int[2]; for(int i = 0; i < 2; i++) { - clusterAngle[i] = (int) Math.round(Math.atan(x[i] / y[i]) * 180.0 / Math.PI); + clusterAngle[i] = (int) Math.round(Math.atan(x[i] / y[i]) * 180.0 / Math.PI); } // Calculate the coplanarity cut value. @@ -1357,9 +1357,9 @@ * @return Returns the cut value. */ private static double getValueEnergySlope(double energy[], double x[], double y[], double energySlopeParamF) { - // Determine which cluster is the lower-energy cluster. - int lei = energy[0] < energy[1] ? 0 : 1; - + // Determine which cluster is the lower-energy cluster. + int lei = energy[0] < energy[1] ? 0 : 1; + // E + R*F // Get the low energy cluster energy. double slopeParamE = energy[lei]; @@ -1383,9 +1383,9 @@ */ @Deprecated private static double getValueEnergySlopeLegacy(double energy[], double x[], double y[], double energySlopeParamF) { - // Determine which cluster is the lower-energy cluster. - int lei = energy[0] < energy[1] ? 0 : 1; - + // Determine which cluster is the lower-energy cluster. + int lei = energy[0] < energy[1] ? 0 : 1; + // E + R*F // Get the low energy cluster energy. double slopeParamE = energy[lei]; @@ -1415,52 +1415,52 @@ * the two clusters. */ private static double getValueTimeCoincidence(double[] time) { - return Math.abs(time[0] - time[1]); - } - - /** - * Indicates whether the argument cluster is located in the fiducial - * region or not. - * @param cluster - The cluster to check. - * @return Returns <code>true</code> if the cluster is located in - * the fiducial region and <code>false</code> otherwise. - */ - private static final boolean inFiducialRegion(int ix, int iy) { - // Get the x and y indices for the cluster. - int absx = Math.abs(ix); - int absy = Math.abs(iy); - - // Check if the cluster is on the top or the bottom of the - // calorimeter, as defined by |y| == 5. This is an edge cluster - // and is not in the fiducial region. - if(absy == 5) { - return false; - } - - // Check if the cluster is on the extreme left or right side - // of the calorimeter, as defined by |x| == 23. This is also - // and edge cluster is not in the fiducial region. - if(absx == 23) { - return false; - } - - // Check if the cluster is along the beam gap, as defined by - // |y| == 1. This is an internal edge cluster and is not in the - // fiducial region. - if(absy == 1) { - return false; - } - - // Lastly, check if the cluster falls along the beam hole, as - // defined by clusters with -11 <= x <= -1 and |y| == 2. This - // is not the fiducial region. - if(absy == 2 && ix <= -1 && ix >= -11) { - return false; - } - - // If all checks fail, the cluster is in the fiducial region. - return true; - } + return Math.abs(time[0] - time[1]); + } + + /** + * Indicates whether the argument cluster is located in the fiducial + * region or not. + * @param cluster - The cluster to check. + * @return Returns <code>true</code> if the cluster is located in + * the fiducial region and <code>false</code> otherwise. + */ + private static final boolean inFiducialRegion(int ix, int iy) { + // Get the x and y indices for the cluster. + int absx = Math.abs(ix); + int absy = Math.abs(iy); + + // Check if the cluster is on the top or the bottom of the + // calorimeter, as defined by |y| == 5. This is an edge cluster + // and is not in the fiducial region. + if(absy == 5) { + return false; + } + + // Check if the cluster is on the extreme left or right side + // of the calorimeter, as defined by |x| == 23. This is also + // and edge cluster is not in the fiducial region. + if(absx == 23) { + return false; + } + + // Check if the cluster is along the beam gap, as defined by + // |y| == 1. This is an internal edge cluster and is not in the + // fiducial region. + if(absy == 1) { + return false; + } + + // Lastly, check if the cluster falls along the beam hole, as + // defined by clusters with -11 <= x <= -1 and |y| == 2. This + // is not the fiducial region. + if(absy == 2 && ix <= -1 && ix >= -11) { + return false; + } + + // If all checks fail, the cluster is in the fiducial region. + return true; + } /** * Checks if a coplanarity angle is within threshold. @@ -1536,7 +1536,7 @@ * the cut and <code>false</code> if it does not. */ private boolean pairTimeCoincidenceCut(double timeDifference) { - return (timeDifference <= cuts.get(PAIR_TIME_COINCIDENCE)); + return (timeDifference <= cuts.get(PAIR_TIME_COINCIDENCE)); } /** @@ -1549,193 +1549,193 @@ * Note that in this table, position[][] = { x, z, y } by in the * coordinate system employed by the rest of the class. */ - private static final double[][][] position = { - { { -340.003, 97.065, 87.845 }, { -324.283, 97.450, 87.875 }, { -308.648, 97.810, 87.900 }, - { -293.093, 98.150, 87.920 }, { -277.618, 98.470, 87.940 }, { -262.213, 98.765, 87.965 }, - { -246.878, 99.040, 87.980 }, { -231.603, 99.290, 87.995 }, { -216.393, 99.520, 88.010 }, - { -201.228, 99.725, 88.030 }, { -186.118, 99.905, 88.040 }, { -171.058, 100.070, 88.050 }, - { -156.038, 100.205, 88.055 }, { -141.058, 100.325, 88.070 }, { -126.113, 100.415, 88.075 }, - { -111.198, 100.485, 88.075 }, { -96.313, 100.530, 88.080 }, { -81.453, 100.555, 88.085 }, - { -66.608, 100.560, 88.085 }, { -51.788, 100.540, 88.080 }, { -36.983, 100.490, 88.075 }, - { -22.183, 100.425, 88.075 }, { -7.393, 100.335, 88.070 }, { 7.393, 100.335, 88.070 }, - { 22.183, 100.425, 88.075 }, { 36.983, 100.490, 88.075 }, { 51.793, 100.540, 88.080 }, - { 66.613, 100.560, 88.085 }, { 81.453, 100.555, 88.085 }, { 96.313, 100.530, 88.080 }, - { 111.198, 100.485, 88.075 }, { 126.113, 100.415, 88.075 }, { 141.053, 100.325, 88.070 }, - { 156.038, 100.205, 88.055 }, { 171.053, 100.070, 88.050 }, { 186.118, 99.905, 88.040 }, - { 201.228, 99.725, 88.030 }, { 216.388, 99.520, 88.010 }, { 231.608, 99.290, 87.995 }, - { 246.878, 99.040, 87.980 }, { 262.218, 98.765, 87.965 }, { 277.623, 98.470, 87.940 }, - { 293.098, 98.150, 87.920 }, { 308.653, 97.810, 87.900 }, { 324.288, 97.450, 87.875 }, - { 340.008, 97.065, 87.845 } - }, - { { -340.003, 97.040, 72.715 }, { -324.283, 97.420, 72.735 }, { -308.648, 97.785, 72.750 }, - { -293.093, 98.125, 72.765 }, { -277.618, 98.450, 72.785 }, { -262.213, 98.745, 72.800 }, - { -246.878, 99.015, 72.815 }, { -231.603, 99.265, 72.825 }, { -216.388, 99.495, 72.840 }, - { -201.228, 99.700, 72.850 }, { -186.118, 99.885, 72.860 }, { -171.058, 100.045, 72.865 }, - { -156.033, 100.185, 72.875 }, { -141.053, 100.300, 72.880 }, { -126.108, 100.395, 72.880 }, - { -111.193, 100.460, 72.890 }, { -96.308, 100.510, 72.890 }, { -81.448, 100.535, 72.895 }, - { -66.608, 100.535, 72.890 }, { -51.788, 100.510, 72.890 }, { -36.978, 100.470, 72.890 }, - { -22.183, 100.405, 72.880 }, { -7.388, 100.310, 72.880 }, { 7.393, 100.310, 72.880 }, - { 22.188, 100.405, 72.885 }, { 36.983, 100.470, 72.890 }, { 51.793, 100.510, 72.890 }, - { 66.613, 100.535, 72.890 }, { 81.453, 100.535, 72.895 }, { 96.313, 100.510, 72.890 }, - { 111.198, 100.460, 72.890 }, { 126.113, 100.395, 72.880 }, { 141.063, 100.300, 72.880 }, - { 156.043, 100.185, 72.875 }, { 171.063, 100.045, 72.865 }, { 186.123, 99.885, 72.860 }, - { 201.233, 99.700, 72.850 }, { 216.393, 99.495, 72.840 }, { 231.608, 99.265, 72.825 }, - { 246.883, 99.015, 72.815 }, { 262.218, 98.745, 72.800 }, { 277.623, 98.450, 72.785 }, - { 293.098, 98.125, 72.765 }, { 308.653, 97.785, 72.750 }, { 324.288, 97.420, 72.735 }, - { 340.008, 97.040, 72.715 } - }, - { { -340.003, 96.990, 57.600 }, { -324.283, 97.375, 57.610 }, { -308.648, 97.740, 57.625 }, - { -293.093, 98.080, 57.630 }, { -277.618, 98.395, 57.645 }, { -262.213, 98.700, 57.655 }, - { -246.873, 98.970, 57.660 }, { -231.603, 99.220, 57.670 }, { -216.383, 99.450, 57.680 }, - { -201.228, 99.660, 57.685 }, { -186.113, 99.840, 57.695 }, { -171.053, 100.005, 57.695 }, - { -156.033, 100.140, 57.700 }, { -141.053, 100.255, 57.710 }, { -126.108, 100.345, 57.710 }, - { -111.193, 100.420, 57.710 }, { -96.308, 100.465, 57.715 }, { -81.448, 100.490, 57.715 }, - { -66.608, 100.490, 57.715 }, { -51.788, 100.470, 57.710 }, { -36.978, 100.425, 57.710 }, - { -22.178, 100.355, 57.710 }, { -7.388, 100.265, 57.705 }, { 7.398, 100.265, 57.705 }, - { 22.188, 100.355, 57.710 }, { 36.988, 100.425, 57.710 }, { 51.793, 100.470, 57.710 }, - { 66.613, 100.490, 57.715 }, { 81.458, 100.490, 57.715 }, { 96.318, 100.465, 57.715 }, - { 111.198, 100.420, 57.710 }, { 126.118, 100.345, 57.710 }, { 141.063, 100.255, 57.710 }, - { 156.043, 100.140, 57.700 }, { 171.063, 100.005, 57.695 }, { 186.123, 99.840, 57.695 }, - { 201.233, 99.660, 57.685 }, { 216.393, 99.450, 57.680 }, { 231.608, 99.220, 57.670 }, - { 246.883, 98.970, 57.660 }, { 262.218, 98.700, 57.655 }, { 277.623, 98.395, 57.645 }, - { 293.098, 98.080, 57.630 }, { 308.653, 97.740, 57.625 }, { 324.288, 97.375, 57.610 }, - { 340.008, 96.990, 57.600 } - }, - { { -340.003, 96.925, 42.490 }, { -324.283, 97.305, 42.495 }, { -308.648, 97.675, 42.505 }, - { -293.093, 98.010, 42.510 }, { -277.618, 98.330, 42.510 }, { -262.213, 98.625, 42.515 }, - { -246.873, 98.900, 42.525 }, { -231.603, 99.155, 42.530 }, { -216.383, 99.385, 42.535 }, - { -201.223, 99.590, 42.530 }, { -186.113, 99.775, 42.535 }, { -171.048, 99.930, 42.540 }, - { -156.033, 100.070, 42.545 }, { -141.048, 100.185, 42.545 }, { -126.108, 100.280, 42.550 }, - { -111.193, 100.350, 42.545 }, { -96.308, 100.400, 42.545 }, { -81.448, 100.420, 42.550 }, - { -66.608, 100.425, 42.550 }, { -51.788, 100.405, 42.550 }, { -36.978, 100.355, 42.545 }, - { -22.178, 100.290, 42.545 }, { -7.388, 100.200, 42.545 }, { 7.398, 100.200, 42.545 }, - { 22.188, 100.290, 42.545 }, { 36.988, 100.355, 42.545 }, { 51.793, 100.405, 42.550 }, - { 66.613, 100.425, 42.550 }, { 81.458, 100.420, 42.550 }, { 96.318, 100.400, 42.545 }, - { 111.198, 100.350, 42.545 }, { 126.118, 100.280, 42.550 }, { 141.063, 100.185, 42.545 }, - { 156.043, 100.070, 42.545 }, { 171.063, 99.930, 42.540 }, { 186.123, 99.775, 42.535 }, - { 201.233, 99.590, 42.530 }, { 216.393, 99.385, 42.535 }, { 231.608, 99.155, 42.530 }, - { 246.883, 98.900, 42.525 }, { 262.218, 98.625, 42.515 }, { 277.628, 98.330, 42.510 }, - { 293.098, 98.010, 42.510 }, { 308.653, 97.675, 42.505 }, { 324.288, 97.305, 42.495 }, - { 340.008, 96.925, 42.490 } - }, - { { -340.003, 96.830, 27.385 }, { -324.278, 97.215, 27.385 }, { -308.648, 97.575, 27.385 }, - { -293.093, 97.915, 27.385 }, { -277.613, 98.240, 27.385 }, { -262.213, 98.535, 27.385 }, - { -246.878, 98.810, 27.385 }, { -231.603, 99.060, 27.385 }, { -216.383, 99.290, 27.385 }, - { -201.223, 99.495, 27.385 }, { -186.113, 99.680, 27.385 }, { -171.048, 99.840, 27.385 }, - { -156.033, 99.980, 27.385 }, { -141.048, 100.095, 27.385 }, { -126.103, 100.185, 27.385 }, - { -111.193, 100.255, 27.385 }, { -96.303, 100.305, 27.385 }, { -81.448, 100.330, 27.385 }, - { -66.608, 100.330, 27.385 }, { -51.783, 100.310, 27.385 }, { -36.973, 100.265, 27.385 }, - { -22.178, 100.200, 27.385 }, { -7.388, 100.105, 27.385 }, { 7.403, 100.105, 27.385 }, - { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 156.078, 99.980, 27.385 }, { 171.103, 99.840, 27.385 }, { 186.168, 99.680, 27.385 }, - { 201.268, 99.495, 27.385 }, { 216.423, 99.290, 27.385 }, { 231.638, 99.060, 27.385 }, - { 246.913, 98.810, 27.385 }, { 262.248, 98.535, 27.385 }, { 277.658, 98.240, 27.385 }, - { 293.133, 97.920, 27.385 }, { 308.688, 97.575, 27.385 }, { 324.323, 97.215, 27.385 }, - { 340.043, 96.830, 27.385 } - }, - { { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 0.000, 0.000, 0.000 } - }, - { { -339.998, 96.840, -27.330 }, { -324.278, 97.225, -27.340 }, { -308.643, 97.585, -27.345 }, - { -293.093, 97.925, -27.350 }, { -277.613, 98.245, -27.360 }, { -262.213, 98.545, -27.365 }, - { -246.868, 98.820, -27.365 }, { -231.598, 99.070, -27.370 }, { -216.383, 99.300, -27.375 }, - { -201.223, 99.505, -27.380 }, { -186.113, 99.690, -27.385 }, { -171.048, 99.850, -27.380 }, - { -156.028, 99.990, -27.385 }, { -141.048, 100.100, -27.390 }, { -126.103, 100.195, -27.390 }, - { -111.193, 100.265, -27.395 }, { -96.303, 100.315, -27.395 }, { -81.443, 100.340, -27.390 }, - { -66.603, 100.335, -27.390 }, { -51.783, 100.315, -27.390 }, { -36.973, 100.275, -27.395 }, - { -22.173, 100.205, -27.390 }, { -7.383, 100.115, -27.385 }, { 7.403, 100.115, -27.385 }, - { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, - { 156.088, 99.985, -27.385 }, { 171.103, 99.845, -27.380 }, { 186.168, 99.680, -27.385 }, - { 201.268, 99.495, -27.380 }, { 216.428, 99.290, -27.375 }, { 231.643, 99.060, -27.370 }, - { 246.913, 98.810, -27.365 }, { 262.258, 98.535, -27.365 }, { 277.658, 98.240, -27.360 }, - { 293.138, 97.925, -27.350 }, { 308.688, 97.580, -27.345 }, { 324.323, 97.215, -27.340 }, - { 340.043, 96.835, -27.330 } - }, - { { -339.998, 96.930, -42.435 }, { -324.278, 97.315, -42.445 }, { -308.648, 97.680, -42.455 }, - { -293.093, 98.015, -42.470 }, { -277.613, 98.340, -42.480 }, { -262.208, 98.635, -42.490 }, - { -246.873, 98.910, -42.500 }, { -231.593, 99.160, -42.510 }, { -216.383, 99.390, -42.515 }, - { -201.223, 99.595, -42.525 }, { -186.113, 99.780, -42.525 }, { -171.048, 99.940, -42.535 }, - { -156.028, 100.080, -42.540 }, { -141.048, 100.195, -42.540 }, { -126.103, 100.290, -42.545 }, - { -111.193, 100.355, -42.550 }, { -96.303, 100.405, -42.550 }, { -81.443, 100.430, -42.550 }, - { -66.608, 100.430, -42.550 }, { -51.783, 100.405, -42.550 }, { -36.973, 100.365, -42.550 }, - { -22.178, 100.295, -42.545 }, { -7.388, 100.205, -42.545 }, { 7.403, 100.205, -42.545 }, - { 22.193, 100.295, -42.545 }, { 36.988, 100.365, -42.550 }, { 51.798, 100.405, -42.550 }, - { 66.623, 100.430, -42.550 }, { 81.458, 100.430, -42.550 }, { 96.318, 100.405, -42.550 }, - { 111.208, 100.355, -42.550 }, { 126.118, 100.290, -42.545 }, { 141.063, 100.195, -42.540 }, - { 156.043, 100.080, -42.540 }, { 171.063, 99.940, -42.535 }, { 186.128, 99.780, -42.525 }, - { 201.238, 99.595, -42.525 }, { 216.398, 99.390, -42.515 }, { 231.613, 99.160, -42.510 }, - { 246.888, 98.910, -42.500 }, { 262.223, 98.635, -42.490 }, { 277.628, 98.340, -42.480 }, - { 293.108, 98.015, -42.470 }, { 308.663, 97.680, -42.455 }, { 324.293, 97.315, -42.445 }, - { 340.013, 96.930, -42.435 } - }, - { { -339.998, 97.000, -57.540 }, { -324.278, 97.385, -57.560 }, { -308.648, 97.745, -57.575 }, - { -293.093, 98.090, -57.595 }, { -277.613, 98.410, -57.610 }, { -262.208, 98.705, -57.625 }, - { -246.873, 98.975, -57.640 }, { -231.593, 99.225, -57.655 }, { -216.383, 99.455, -57.665 }, - { -201.223, 99.665, -57.675 }, { -186.113, 99.845, -57.685 }, { -171.048, 100.010, -57.690 }, - { -156.028, 100.145, -57.700 }, { -141.048, 100.265, -57.705 }, { -126.103, 100.355, -57.710 }, - { -111.193, 100.425, -57.710 }, { -96.303, 100.475, -57.720 }, { -81.443, 100.495, -57.715 }, - { -66.608, 100.500, -57.720 }, { -51.783, 100.480, -57.715 }, { -36.973, 100.430, -57.710 }, - { -22.178, 100.365, -57.710 }, { -7.388, 100.275, -57.705 }, { 7.403, 100.275, -57.705 }, - { 22.193, 100.365, -57.710 }, { 36.988, 100.430, -57.710 }, { 51.798, 100.480, -57.715 }, - { 66.623, 100.500, -57.720 }, { 81.458, 100.495, -57.715 }, { 96.318, 100.475, -57.720 }, - { 111.208, 100.425, -57.710 }, { 126.118, 100.355, -57.710 }, { 141.063, 100.265, -57.705 }, - { 156.043, 100.145, -57.700 }, { 171.063, 100.010, -57.690 }, { 186.128, 99.845, -57.685 }, - { 201.238, 99.665, -57.675 }, { 216.398, 99.455, -57.665 }, { 231.613, 99.225, -57.655 }, - { 246.888, 98.975, -57.640 }, { 262.223, 98.705, -57.625 }, { 277.628, 98.410, -57.610 }, - { 293.108, 98.090, -57.595 }, { 308.663, 97.745, -57.575 }, { 324.293, 97.385, -57.560 }, - { 340.013, 97.000, -57.540 } - }, - { { -339.998, 97.045, -72.655 }, { -324.278, 97.435, -72.680 }, { -308.648, 97.795, -72.710 }, - { -293.093, 98.135, -72.730 }, { -277.613, 98.455, -72.750 }, { -262.208, 98.750, -72.775 }, - { -246.873, 99.020, -72.795 }, { -231.593, 99.280, -72.810 }, { -216.383, 99.505, -72.820 }, - { -201.223, 99.710, -72.840 }, { -186.113, 99.895, -72.850 }, { -171.048, 100.055, -72.860 }, - { -156.028, 100.190, -72.870 }, { -141.048, 100.305, -72.880 }, { -126.103, 100.400, -72.885 }, - { -111.193, 100.470, -72.890 }, { -96.303, 100.520, -72.890 }, { -81.443, 100.540, -72.895 }, - { -66.608, 100.540, -72.895 }, { -51.783, 100.520, -72.895 }, { -36.973, 100.480, -72.890 }, - { -22.178, 100.405, -72.885 }, { -7.388, 100.320, -72.880 }, { 7.403, 100.320, -72.880 }, - { 22.193, 100.405, -72.885 }, { 36.988, 100.480, -72.890 }, { 51.798, 100.520, -72.895 }, - { 66.623, 100.540, -72.895 }, { 81.458, 100.540, -72.895 }, { 96.318, 100.520, -72.890 }, - { 111.208, 100.470, -72.890 }, { 126.118, 100.400, -72.885 }, { 141.063, 100.305, -72.880 }, - { 156.043, 100.190, -72.870 }, { 171.063, 100.055, -72.860 }, { 186.128, 99.895, -72.850 }, - { 201.238, 99.710, -72.840 }, { 216.398, 99.505, -72.820 }, { 231.613, 99.280, -72.810 }, - { 246.888, 99.020, -72.795 }, { 262.223, 98.750, -72.775 }, { 277.628, 98.455, -72.750 }, - { 293.108, 98.135, -72.730 }, { 308.663, 97.795, -72.710 }, { 324.293, 97.435, -72.680 }, - { 340.013, 97.045, -72.655 } - }, - { { -339.998, 97.070, -87.790 }, { -324.278, 97.460, -87.820 }, { -308.648, 97.820, -87.850 }, - { -293.093, 98.160, -87.885 }, { -277.613, 98.480, -87.910 }, { -262.208, 98.775, -87.935 }, - { -246.873, 99.050, -87.960 }, { -231.593, 99.300, -87.980 }, { -216.383, 99.530, -88.000 }, - { -201.223, 99.735, -88.015 }, { -186.113, 99.920, -88.030 }, { -171.048, 100.080, -88.045 }, - { -156.028, 100.215, -88.055 }, { -141.048, 100.335, -88.065 }, { -126.103, 100.420, -88.070 }, - { -111.193, 100.490, -88.075 }, { -96.303, 100.540, -88.085 }, { -81.443, 100.565, -88.085 }, - { -66.608, 100.560, -88.085 }, { -51.783, 100.540, -88.085 }, { -36.973, 100.500, -88.080 }, - { -22.178, 100.430, -88.075 }, { -7.388, 100.340, -88.065 }, { 7.403, 100.340, -88.070 }, - { 22.193, 100.430, -88.075 }, { 36.988, 100.500, -88.080 }, { 51.798, 100.540, -88.085 }, - { 66.623, 100.560, -88.085 }, { 81.458, 100.565, -88.085 }, { 96.318, 100.540, -88.085 }, - { 111.208, 100.490, -88.075 }, { 126.118, 100.420, -88.070 }, { 141.063, 100.335, -88.065 }, - { 156.043, 100.215, -88.055 }, { 171.063, 100.080, -88.045 }, { 186.128, 99.915, -88.030 }, - { 201.238, 99.735, -88.015 }, { 216.398, 99.530, -88.000 }, { 231.613, 99.300, -87.980 }, - { 246.888, 99.050, -87.960 }, { 262.223, 98.775, -87.935 }, { 277.628, 98.480, -87.910 }, - { 293.108, 98.160, -87.885 }, { 308.663, 97.820, -87.850 }, { 324.293, 97.460, -87.820 }, - { 340.013, 97.070, -87.790 } - } - }; + private static final double[][][] position = { + { { -340.003, 97.065, 87.845 }, { -324.283, 97.450, 87.875 }, { -308.648, 97.810, 87.900 }, + { -293.093, 98.150, 87.920 }, { -277.618, 98.470, 87.940 }, { -262.213, 98.765, 87.965 }, + { -246.878, 99.040, 87.980 }, { -231.603, 99.290, 87.995 }, { -216.393, 99.520, 88.010 }, + { -201.228, 99.725, 88.030 }, { -186.118, 99.905, 88.040 }, { -171.058, 100.070, 88.050 }, + { -156.038, 100.205, 88.055 }, { -141.058, 100.325, 88.070 }, { -126.113, 100.415, 88.075 }, + { -111.198, 100.485, 88.075 }, { -96.313, 100.530, 88.080 }, { -81.453, 100.555, 88.085 }, + { -66.608, 100.560, 88.085 }, { -51.788, 100.540, 88.080 }, { -36.983, 100.490, 88.075 }, + { -22.183, 100.425, 88.075 }, { -7.393, 100.335, 88.070 }, { 7.393, 100.335, 88.070 }, + { 22.183, 100.425, 88.075 }, { 36.983, 100.490, 88.075 }, { 51.793, 100.540, 88.080 }, + { 66.613, 100.560, 88.085 }, { 81.453, 100.555, 88.085 }, { 96.313, 100.530, 88.080 }, + { 111.198, 100.485, 88.075 }, { 126.113, 100.415, 88.075 }, { 141.053, 100.325, 88.070 }, + { 156.038, 100.205, 88.055 }, { 171.053, 100.070, 88.050 }, { 186.118, 99.905, 88.040 }, + { 201.228, 99.725, 88.030 }, { 216.388, 99.520, 88.010 }, { 231.608, 99.290, 87.995 }, + { 246.878, 99.040, 87.980 }, { 262.218, 98.765, 87.965 }, { 277.623, 98.470, 87.940 }, + { 293.098, 98.150, 87.920 }, { 308.653, 97.810, 87.900 }, { 324.288, 97.450, 87.875 }, + { 340.008, 97.065, 87.845 } + }, + { { -340.003, 97.040, 72.715 }, { -324.283, 97.420, 72.735 }, { -308.648, 97.785, 72.750 }, + { -293.093, 98.125, 72.765 }, { -277.618, 98.450, 72.785 }, { -262.213, 98.745, 72.800 }, + { -246.878, 99.015, 72.815 }, { -231.603, 99.265, 72.825 }, { -216.388, 99.495, 72.840 }, + { -201.228, 99.700, 72.850 }, { -186.118, 99.885, 72.860 }, { -171.058, 100.045, 72.865 }, + { -156.033, 100.185, 72.875 }, { -141.053, 100.300, 72.880 }, { -126.108, 100.395, 72.880 }, + { -111.193, 100.460, 72.890 }, { -96.308, 100.510, 72.890 }, { -81.448, 100.535, 72.895 }, + { -66.608, 100.535, 72.890 }, { -51.788, 100.510, 72.890 }, { -36.978, 100.470, 72.890 }, + { -22.183, 100.405, 72.880 }, { -7.388, 100.310, 72.880 }, { 7.393, 100.310, 72.880 }, + { 22.188, 100.405, 72.885 }, { 36.983, 100.470, 72.890 }, { 51.793, 100.510, 72.890 }, + { 66.613, 100.535, 72.890 }, { 81.453, 100.535, 72.895 }, { 96.313, 100.510, 72.890 }, + { 111.198, 100.460, 72.890 }, { 126.113, 100.395, 72.880 }, { 141.063, 100.300, 72.880 }, + { 156.043, 100.185, 72.875 }, { 171.063, 100.045, 72.865 }, { 186.123, 99.885, 72.860 }, + { 201.233, 99.700, 72.850 }, { 216.393, 99.495, 72.840 }, { 231.608, 99.265, 72.825 }, + { 246.883, 99.015, 72.815 }, { 262.218, 98.745, 72.800 }, { 277.623, 98.450, 72.785 }, + { 293.098, 98.125, 72.765 }, { 308.653, 97.785, 72.750 }, { 324.288, 97.420, 72.735 }, + { 340.008, 97.040, 72.715 } + }, + { { -340.003, 96.990, 57.600 }, { -324.283, 97.375, 57.610 }, { -308.648, 97.740, 57.625 }, + { -293.093, 98.080, 57.630 }, { -277.618, 98.395, 57.645 }, { -262.213, 98.700, 57.655 }, + { -246.873, 98.970, 57.660 }, { -231.603, 99.220, 57.670 }, { -216.383, 99.450, 57.680 }, + { -201.228, 99.660, 57.685 }, { -186.113, 99.840, 57.695 }, { -171.053, 100.005, 57.695 }, + { -156.033, 100.140, 57.700 }, { -141.053, 100.255, 57.710 }, { -126.108, 100.345, 57.710 }, + { -111.193, 100.420, 57.710 }, { -96.308, 100.465, 57.715 }, { -81.448, 100.490, 57.715 }, + { -66.608, 100.490, 57.715 }, { -51.788, 100.470, 57.710 }, { -36.978, 100.425, 57.710 }, + { -22.178, 100.355, 57.710 }, { -7.388, 100.265, 57.705 }, { 7.398, 100.265, 57.705 }, + { 22.188, 100.355, 57.710 }, { 36.988, 100.425, 57.710 }, { 51.793, 100.470, 57.710 }, + { 66.613, 100.490, 57.715 }, { 81.458, 100.490, 57.715 }, { 96.318, 100.465, 57.715 }, + { 111.198, 100.420, 57.710 }, { 126.118, 100.345, 57.710 }, { 141.063, 100.255, 57.710 }, + { 156.043, 100.140, 57.700 }, { 171.063, 100.005, 57.695 }, { 186.123, 99.840, 57.695 }, + { 201.233, 99.660, 57.685 }, { 216.393, 99.450, 57.680 }, { 231.608, 99.220, 57.670 }, + { 246.883, 98.970, 57.660 }, { 262.218, 98.700, 57.655 }, { 277.623, 98.395, 57.645 }, + { 293.098, 98.080, 57.630 }, { 308.653, 97.740, 57.625 }, { 324.288, 97.375, 57.610 }, + { 340.008, 96.990, 57.600 } + }, + { { -340.003, 96.925, 42.490 }, { -324.283, 97.305, 42.495 }, { -308.648, 97.675, 42.505 }, + { -293.093, 98.010, 42.510 }, { -277.618, 98.330, 42.510 }, { -262.213, 98.625, 42.515 }, + { -246.873, 98.900, 42.525 }, { -231.603, 99.155, 42.530 }, { -216.383, 99.385, 42.535 }, + { -201.223, 99.590, 42.530 }, { -186.113, 99.775, 42.535 }, { -171.048, 99.930, 42.540 }, + { -156.033, 100.070, 42.545 }, { -141.048, 100.185, 42.545 }, { -126.108, 100.280, 42.550 }, + { -111.193, 100.350, 42.545 }, { -96.308, 100.400, 42.545 }, { -81.448, 100.420, 42.550 }, + { -66.608, 100.425, 42.550 }, { -51.788, 100.405, 42.550 }, { -36.978, 100.355, 42.545 }, + { -22.178, 100.290, 42.545 }, { -7.388, 100.200, 42.545 }, { 7.398, 100.200, 42.545 }, + { 22.188, 100.290, 42.545 }, { 36.988, 100.355, 42.545 }, { 51.793, 100.405, 42.550 }, + { 66.613, 100.425, 42.550 }, { 81.458, 100.420, 42.550 }, { 96.318, 100.400, 42.545 }, + { 111.198, 100.350, 42.545 }, { 126.118, 100.280, 42.550 }, { 141.063, 100.185, 42.545 }, + { 156.043, 100.070, 42.545 }, { 171.063, 99.930, 42.540 }, { 186.123, 99.775, 42.535 }, + { 201.233, 99.590, 42.530 }, { 216.393, 99.385, 42.535 }, { 231.608, 99.155, 42.530 }, + { 246.883, 98.900, 42.525 }, { 262.218, 98.625, 42.515 }, { 277.628, 98.330, 42.510 }, + { 293.098, 98.010, 42.510 }, { 308.653, 97.675, 42.505 }, { 324.288, 97.305, 42.495 }, + { 340.008, 96.925, 42.490 } + }, + { { -340.003, 96.830, 27.385 }, { -324.278, 97.215, 27.385 }, { -308.648, 97.575, 27.385 }, + { -293.093, 97.915, 27.385 }, { -277.613, 98.240, 27.385 }, { -262.213, 98.535, 27.385 }, + { -246.878, 98.810, 27.385 }, { -231.603, 99.060, 27.385 }, { -216.383, 99.290, 27.385 }, + { -201.223, 99.495, 27.385 }, { -186.113, 99.680, 27.385 }, { -171.048, 99.840, 27.385 }, + { -156.033, 99.980, 27.385 }, { -141.048, 100.095, 27.385 }, { -126.103, 100.185, 27.385 }, + { -111.193, 100.255, 27.385 }, { -96.303, 100.305, 27.385 }, { -81.448, 100.330, 27.385 }, + { -66.608, 100.330, 27.385 }, { -51.783, 100.310, 27.385 }, { -36.973, 100.265, 27.385 }, + { -22.178, 100.200, 27.385 }, { -7.388, 100.105, 27.385 }, { 7.403, 100.105, 27.385 }, + { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 156.078, 99.980, 27.385 }, { 171.103, 99.840, 27.385 }, { 186.168, 99.680, 27.385 }, + { 201.268, 99.495, 27.385 }, { 216.423, 99.290, 27.385 }, { 231.638, 99.060, 27.385 }, + { 246.913, 98.810, 27.385 }, { 262.248, 98.535, 27.385 }, { 277.658, 98.240, 27.385 }, + { 293.133, 97.920, 27.385 }, { 308.688, 97.575, 27.385 }, { 324.323, 97.215, 27.385 }, + { 340.043, 96.830, 27.385 } + }, + { { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 0.000, 0.000, 0.000 } + }, + { { -339.998, 96.840, -27.330 }, { -324.278, 97.225, -27.340 }, { -308.643, 97.585, -27.345 }, + { -293.093, 97.925, -27.350 }, { -277.613, 98.245, -27.360 }, { -262.213, 98.545, -27.365 }, + { -246.868, 98.820, -27.365 }, { -231.598, 99.070, -27.370 }, { -216.383, 99.300, -27.375 }, + { -201.223, 99.505, -27.380 }, { -186.113, 99.690, -27.385 }, { -171.048, 99.850, -27.380 }, + { -156.028, 99.990, -27.385 }, { -141.048, 100.100, -27.390 }, { -126.103, 100.195, -27.390 }, + { -111.193, 100.265, -27.395 }, { -96.303, 100.315, -27.395 }, { -81.443, 100.340, -27.390 }, + { -66.603, 100.335, -27.390 }, { -51.783, 100.315, -27.390 }, { -36.973, 100.275, -27.395 }, + { -22.173, 100.205, -27.390 }, { -7.383, 100.115, -27.385 }, { 7.403, 100.115, -27.385 }, + { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, { 0.000, 0.000, 0.000 }, + { 156.088, 99.985, -27.385 }, { 171.103, 99.845, -27.380 }, { 186.168, 99.680, -27.385 }, + { 201.268, 99.495, -27.380 }, { 216.428, 99.290, -27.375 }, { 231.643, 99.060, -27.370 }, + { 246.913, 98.810, -27.365 }, { 262.258, 98.535, -27.365 }, { 277.658, 98.240, -27.360 }, + { 293.138, 97.925, -27.350 }, { 308.688, 97.580, -27.345 }, { 324.323, 97.215, -27.340 }, + { 340.043, 96.835, -27.330 } + }, + { { -339.998, 96.930, -42.435 }, { -324.278, 97.315, -42.445 }, { -308.648, 97.680, -42.455 }, + { -293.093, 98.015, -42.470 }, { -277.613, 98.340, -42.480 }, { -262.208, 98.635, -42.490 }, + { -246.873, 98.910, -42.500 }, { -231.593, 99.160, -42.510 }, { -216.383, 99.390, -42.515 }, + { -201.223, 99.595, -42.525 }, { -186.113, 99.780, -42.525 }, { -171.048, 99.940, -42.535 }, + { -156.028, 100.080, -42.540 }, { -141.048, 100.195, -42.540 }, { -126.103, 100.290, -42.545 }, + { -111.193, 100.355, -42.550 }, { -96.303, 100.405, -42.550 }, { -81.443, 100.430, -42.550 }, + { -66.608, 100.430, -42.550 }, { -51.783, 100.405, -42.550 }, { -36.973, 100.365, -42.550 }, + { -22.178, 100.295, -42.545 }, { -7.388, 100.205, -42.545 }, { 7.403, 100.205, -42.545 }, + { 22.193, 100.295, -42.545 }, { 36.988, 100.365, -42.550 }, { 51.798, 100.405, -42.550 }, + { 66.623, 100.430, -42.550 }, { 81.458, 100.430, -42.550 }, { 96.318, 100.405, -42.550 }, + { 111.208, 100.355, -42.550 }, { 126.118, 100.290, -42.545 }, { 141.063, 100.195, -42.540 }, + { 156.043, 100.080, -42.540 }, { 171.063, 99.940, -42.535 }, { 186.128, 99.780, -42.525 }, + { 201.238, 99.595, -42.525 }, { 216.398, 99.390, -42.515 }, { 231.613, 99.160, -42.510 }, + { 246.888, 98.910, -42.500 }, { 262.223, 98.635, -42.490 }, { 277.628, 98.340, -42.480 }, + { 293.108, 98.015, -42.470 }, { 308.663, 97.680, -42.455 }, { 324.293, 97.315, -42.445 }, + { 340.013, 96.930, -42.435 } + }, + { { -339.998, 97.000, -57.540 }, { -324.278, 97.385, -57.560 }, { -308.648, 97.745, -57.575 }, + { -293.093, 98.090, -57.595 }, { -277.613, 98.410, -57.610 }, { -262.208, 98.705, -57.625 }, + { -246.873, 98.975, -57.640 }, { -231.593, 99.225, -57.655 }, { -216.383, 99.455, -57.665 }, + { -201.223, 99.665, -57.675 }, { -186.113, 99.845, -57.685 }, { -171.048, 100.010, -57.690 }, + { -156.028, 100.145, -57.700 }, { -141.048, 100.265, -57.705 }, { -126.103, 100.355, -57.710 }, + { -111.193, 100.425, -57.710 }, { -96.303, 100.475, -57.720 }, { -81.443, 100.495, -57.715 }, + { -66.608, 100.500, -57.720 }, { -51.783, 100.480, -57.715 }, { -36.973, 100.430, -57.710 }, + { -22.178, 100.365, -57.710 }, { -7.388, 100.275, -57.705 }, { 7.403, 100.275, -57.705 }, + { 22.193, 100.365, -57.710 }, { 36.988, 100.430, -57.710 }, { 51.798, 100.480, -57.715 }, + { 66.623, 100.500, -57.720 }, { 81.458, 100.495, -57.715 }, { 96.318, 100.475, -57.720 }, + { 111.208, 100.425, -57.710 }, { 126.118, 100.355, -57.710 }, { 141.063, 100.265, -57.705 }, + { 156.043, 100.145, -57.700 }, { 171.063, 100.010, -57.690 }, { 186.128, 99.845, -57.685 }, + { 201.238, 99.665, -57.675 }, { 216.398, 99.455, -57.665 }, { 231.613, 99.225, -57.655 }, + { 246.888, 98.975, -57.640 }, { 262.223, 98.705, -57.625 }, { 277.628, 98.410, -57.610 }, + { 293.108, 98.090, -57.595 }, { 308.663, 97.745, -57.575 }, { 324.293, 97.385, -57.560 }, + { 340.013, 97.000, -57.540 } + }, + { { -339.998, 97.045, -72.655 }, { -324.278, 97.435, -72.680 }, { -308.648, 97.795, -72.710 }, + { -293.093, 98.135, -72.730 }, { -277.613, 98.455, -72.750 }, { -262.208, 98.750, -72.775 }, + { -246.873, 99.020, -72.795 }, { -231.593, 99.280, -72.810 }, { -216.383, 99.505, -72.820 }, + { -201.223, 99.710, -72.840 }, { -186.113, 99.895, -72.850 }, { -171.048, 100.055, -72.860 }, + { -156.028, 100.190, -72.870 }, { -141.048, 100.305, -72.880 }, { -126.103, 100.400, -72.885 }, + { -111.193, 100.470, -72.890 }, { -96.303, 100.520, -72.890 }, { -81.443, 100.540, -72.895 }, + { -66.608, 100.540, -72.895 }, { -51.783, 100.520, -72.895 }, { -36.973, 100.480, -72.890 }, + { -22.178, 100.405, -72.885 }, { -7.388, 100.320, -72.880 }, { 7.403, 100.320, -72.880 }, + { 22.193, 100.405, -72.885 }, { 36.988, 100.480, -72.890 }, { 51.798, 100.520, -72.895 }, + { 66.623, 100.540, -72.895 }, { 81.458, 100.540, -72.895 }, { 96.318, 100.520, -72.890 }, + { 111.208, 100.470, -72.890 }, { 126.118, 100.400, -72.885 }, { 141.063, 100.305, -72.880 }, + { 156.043, 100.190, -72.870 }, { 171.063, 100.055, -72.860 }, { 186.128, 99.895, -72.850 }, + { 201.238, 99.710, -72.840 }, { 216.398, 99.505, -72.820 }, { 231.613, 99.280, -72.810 }, + { 246.888, 99.020, -72.795 }, { 262.223, 98.750, -72.775 }, { 277.628, 98.455, -72.750 }, + { 293.108, 98.135, -72.730 }, { 308.663, 97.795, -72.710 }, { 324.293, 97.435, -72.680 }, + { 340.013, 97.045, -72.655 } + }, + { { -339.998, 97.070, -87.790 }, { -324.278, 97.460, -87.820 }, { -308.648, 97.820, -87.850 }, + { -293.093, 98.160, -87.885 }, { -277.613, 98.480, -87.910 }, { -262.208, 98.775, -87.935 }, + { -246.873, 99.050, -87.960 }, { -231.593, 99.300, -87.980 }, { -216.383, 99.530, -88.000 }, + { -201.223, 99.735, -88.015 }, { -186.113, 99.920, -88.030 }, { -171.048, 100.080, -88.045 }, + { -156.028, 100.215, -88.055 }, { -141.048, 100.335, -88.065 }, { -126.103, 100.420, -88.070 }, + { -111.193, 100.490, -88.075 }, { -96.303, 100.540, -88.085 }, { -81.443, 100.565, -88.085 }, + { -66.608, 100.560, -88.085 }, { -51.783, 100.540, -88.085 }, { -36.973, 100.500, -88.080 }, + { -22.178, 100.430, -88.075 }, { -7.388, 100.340, -88.065 }, { 7.403, 100.340, -88.070 }, + { 22.193, 100.430, -88.075 }, { 36.988, 100.500, -88.080 }, { 51.798, 100.540, -88.085 }, + { 66.623, 100.560, -88.085 }, { 81.458, 100.565, -88.085 }, { 96.318, 100.540, -88.085 }, + { 111.208, 100.490, -88.075 }, { 126.118, 100.420, -88.070 }, { 141.063, 100.335, -88.065 }, + { 156.043, 100.215, -88.055 }, { 171.063, 100.080, -88.045 }, { 186.128, 99.915, -88.030 }, + { 201.238, 99.735, -88.015 }, { 216.398, 99.530, -88.000 }, { 231.613, 99.300, -87.980 }, + { 246.888, 99.050, -87.960 }, { 262.223, 98.775, -87.935 }, { 277.628, 98.480, -87.910 }, + { 293.108, 98.160, -87.885 }, { 308.663, 97.820, -87.850 }, { 324.293, 97.460, -87.820 }, + { 340.013, 97.070, -87.790 } + } + }; } Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/analysis/StarterAnalysis.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/analysis/StarterAnalysis.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/analysis/StarterAnalysis.lcsim Wed Mar 9 11:43:24 2016 @@ -20,4 +20,4 @@ </driver> </drivers> </lcsim> - + Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalLedSequenceMonitoringApp.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalLedSequenceMonitoringApp.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalLedSequenceMonitoringApp.lcsim Wed Mar 9 11:43:24 2016 @@ -1,9 +1,9 @@ <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> <execute> - <driver name="EventMarkerDriver"/> + <driver name="EventMarkerDriver"/> <driver name="EcalRunningPedestal"/> - <driver name="EcalRawConverter" /> + <driver name="EcalRawConverter" /> <driver name="LedAnalysisDriver"/> <driver name="EcalEventDisplay" /> <!-- Ecal event display --> <driver name="AidaSaveDriver"/> @@ -48,5 +48,5 @@ <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver"> <outputFileName>LedSequenceMonitorOut.aida</outputFileName> </driver> - </drivers> + </drivers> </lcsim> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalLedSequenceStandalone.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalLedSequenceStandalone.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalLedSequenceStandalone.lcsim Wed Mar 9 11:43:24 2016 @@ -1,43 +1,43 @@ - <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" - xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> - <execute> - <driver name="EventMarkerDriver"/> - <driver name="EcalRunningPedestal"/> - <driver name="EcalRawConverter" /> - <driver name="LedAnalysisDriver"/> - <driver name="AidaSaveDriver"/> - </execute> - <drivers> - <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> - <eventInterval>100000</eventInterval> - </driver> - <driver name="EcalRunningPedestal" type="org.hps.recon.ecal.EcalRunningPedestalDriver"> - <minLookbackEvents>10</minLookbackEvents> - <maxLookbackEvents>50</maxLookbackEvents> - </driver> - <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver"> - <ecalCollectionName>EcalCalHits</ecalCollectionName> - <useTimestamps>false</useTimestamps> - <useTruthTime>false</useTruthTime> - <useRunningPedestal>true</useRunningPedestal> - <useTimeWalkCorrection>true</useTimeWalkCorrection> - <nsa>60</nsa> <!-- these are critical since the defaults in software are 100 - 20, as in prod. runs --> - <nsb>16</nsb> - </driver> - <driver name="LedAnalysisDriver" type="org.hps.monitoring.ecal.plots.EcalLedSequenceMonitor"> - <isMonitoringApp>false</isMonitoringApp> - <doFullAnalysis>false</doFullAnalysis> - <skipMin>0.2</skipMin> - <skipInitial>0.05</skipInitial> - <useRawEnergy>true</useRawEnergy> - <energyCut>2.0</energyCut> - <nEventsMin>300</nEventsMin> - <evnMinDraw>0.</evnMinDraw> - <evnMaxDraw>80000.</evnMaxDraw> - <saveTuple>false</saveTuple> - </driver> - <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver"> - <outputFileName>${outputFile}.LedAnalysis.aida</outputFileName> - </driver> - </drivers> - </lcsim> + <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" + xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> + <execute> + <driver name="EventMarkerDriver"/> + <driver name="EcalRunningPedestal"/> + <driver name="EcalRawConverter" /> + <driver name="LedAnalysisDriver"/> + <driver name="AidaSaveDriver"/> + </execute> + <drivers> + <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> + <eventInterval>100000</eventInterval> + </driver> + <driver name="EcalRunningPedestal" type="org.hps.recon.ecal.EcalRunningPedestalDriver"> + <minLookbackEvents>10</minLookbackEvents> + <maxLookbackEvents>50</maxLookbackEvents> + </driver> + <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver"> + <ecalCollectionName>EcalCalHits</ecalCollectionName> + <useTimestamps>false</useTimestamps> + <useTruthTime>false</useTruthTime> + <useRunningPedestal>true</useRunningPedestal> + <useTimeWalkCorrection>true</useTimeWalkCorrection> + <nsa>60</nsa> <!-- these are critical since the defaults in software are 100 - 20, as in prod. runs --> + <nsb>16</nsb> + </driver> + <driver name="LedAnalysisDriver" type="org.hps.monitoring.ecal.plots.EcalLedSequenceMonitor"> + <isMonitoringApp>false</isMonitoringApp> + <doFullAnalysis>false</doFullAnalysis> + <skipMin>0.2</skipMin> + <skipInitial>0.05</skipInitial> + <useRawEnergy>true</useRawEnergy> + <energyCut>2.0</energyCut> + <nEventsMin>300</nEventsMin> + <evnMinDraw>0.</evnMinDraw> + <evnMaxDraw>80000.</evnMaxDraw> + <saveTuple>false</saveTuple> + </driver> + <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver"> + <outputFileName>${outputFile}.LedAnalysis.aida</outputFileName> + </driver> + </drivers> + </lcsim> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalMonitoringFinal.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalMonitoringFinal.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalMonitoringFinal.lcsim Wed Mar 9 11:43:24 2016 @@ -1,7 +1,7 @@ <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> <execute> <driver name="EcalRawConverter" /> - <driver name="EcalClusterer" /> + <driver name="EcalClusterer" /> <driver name="EcalMonitoringPlots" /> <!-- General plots --> <driver name="EcalHitPlots" /> <!-- Single hit distributions --> <driver name="EcalClusterPlots" /> <!-- Clusters distributions --> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalMonitoringOnly.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalMonitoringOnly.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/EcalMonitoringOnly.lcsim Wed Mar 9 11:43:24 2016 @@ -1,7 +1,7 @@ <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> <execute> <driver name="EcalRawConverter" /> - <driver name="EcalClusterer" /> + <driver name="EcalClusterer" /> <driver name="EcalMonitoringPlots" /> <!-- General plots --> <driver name="EcalHitPlots" /> <!-- Single hit distributions --> <driver name="EcalClusterPlots" /> <!-- Clusters distributions --> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/SvtOnlineMonitoring.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/SvtOnlineMonitoring.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/SvtOnlineMonitoring.lcsim Wed Mar 9 11:43:24 2016 @@ -17,7 +17,7 @@ </execute> <drivers> <driver name="SensorOccupancy" type="org.hps.monitoring.drivers.svt.SensorOccupancyPlotsDriver" > - <eventRefreshRate>100</eventRefreshRate> + <eventRefreshRate>100</eventRefreshRate> <enablePositionPlots>false</enablePositionPlots> <enableMaxSamplePlots>true</enableMaxSamplePlots> <maxSamplePosition>3</maxSamplePosition> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/readout/CommRun2014TightPairs.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/readout/CommRun2014TightPairs.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/readout/CommRun2014TightPairs.lcsim Wed Mar 9 11:43:24 2016 @@ -44,7 +44,7 @@ <applyBadCrystalMap>false</applyBadCrystalMap> <use2014Gain>false</use2014Gain> <debug>true</debug> - </driver> + </driver> <driver name="EcalClusterer" type="org.hps.recon.ecal.cluster.GTPClusterDriver"> <inputHitCollectionName>EcalCorrectedHits</inputHitCollectionName> <clusterWindow>1</clusterWindow> @@ -62,7 +62,7 @@ <energySlopeParamF>0.005500</energySlopeParamF> <energySlopeLow>0.4</energySlopeLow> <outputFileName>${outputFile}.triggers</outputFileName> - </driver> + </driver> <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver"> <outputFileName>${outputFile}_triggerPlots</outputFileName> @@ -73,4 +73,4 @@ </driver> </drivers> </lcsim> - + Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/readout/EngineeringRun2014PrescaledTriggers.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/readout/EngineeringRun2014PrescaledTriggers.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/readout/EngineeringRun2014PrescaledTriggers.lcsim Wed Mar 9 11:43:24 2016 @@ -54,7 +54,7 @@ <nsa>100</nsa> <nsb>20</nsb> <use2014Gain>false</use2014Gain> - </driver> + </driver> <driver name="EcalClustererGTP" type="org.hps.recon.ecal.cluster.GTPClusterDriver"> <inputHitCollectionName>EcalCorrectedHits</inputHitCollectionName> <outputClusterCollectionName>EcalClusters</outputClusterCollectionName> @@ -82,7 +82,7 @@ <outputFileName>${outputFile}.triggers.singles0</outputFileName> <lcioFile>${outputFile}.singles0.slcio</lcioFile> <!--<verbose>true</verbose>--> - </driver> + </driver> <driver name="SinglesTrigger1" type="org.hps.readout.ecal.SinglesTriggerDriver"> <clusterCollectionName>EcalClusters</clusterCollectionName> <deadTime>32</deadTime> @@ -94,7 +94,7 @@ <outputFileName>${outputFile}.triggers.singles1</outputFileName> <lcioFile>${outputFile}.singles1.slcio</lcioFile> <!--<verbose>true</verbose>--> - </driver> + </driver> <driver name="PairTrigger0" type="org.hps.readout.ecal.FADCPrimaryTriggerDriver"> <clusterCollectionName>EcalClusters</clusterCollectionName> <deadTime>32</deadTime> @@ -113,7 +113,7 @@ <outputFileName>${outputFile}.triggers.pairs0</outputFileName> <lcioFile>${outputFile}.pairs0.slcio</lcioFile> <!--<verbose>true</verbose>--> - </driver> + </driver> <driver name="PairTrigger1" type="org.hps.readout.ecal.FADCPrimaryTriggerDriver"> <clusterCollectionName>EcalClusters</clusterCollectionName> <deadTime>32</deadTime> @@ -132,7 +132,7 @@ <outputFileName>${outputFile}.triggers.pairs1</outputFileName> <lcioFile>${outputFile}.pairs1.slcio</lcioFile> <!--<verbose>true</verbose>--> - </driver> + </driver> <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver"> <outputFileName>${outputFile}_triggerPlots</outputFileName> @@ -143,4 +143,4 @@ </driver> </drivers> </lcsim> - + Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutNoPileup.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutNoPileup.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutNoPileup.lcsim Wed Mar 9 11:43:24 2016 @@ -48,7 +48,7 @@ <deadTime>0</deadTime> <pairCoincidence>0</pairCoincidence> <lcioFile>${outputFile}.slcio</lcioFile> - </driver> + </driver> <driver name="SimpleSVTReadout" type="org.hps.readout.svt.SimpleSvtReadout"> <noPileup>true</noPileup> </driver> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutToEvio.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutToEvio.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/readout/HPS2014ReadoutToEvio.lcsim Wed Mar 9 11:43:24 2016 @@ -44,7 +44,7 @@ <applyBadCrystalMap>false</applyBadCrystalMap> <use2014Gain>true</use2014Gain> <!-- <debug>true</debug>--> - </driver> + </driver> <driver name="EcalClusterer" type="org.hps.recon.ecal.cluster.GTPClusterDriver"> <inputHitCollectionName>EcalCorrectedHits</inputHitCollectionName> <clusterWindow>1</clusterWindow> @@ -54,7 +54,7 @@ <deadTime>10</deadTime> <pairCoincidence>2</pairCoincidence> <outputFileName>${outputFile}.triggers</outputFileName> - </driver> + </driver> <driver name="SimpleSVTReadout" type="org.hps.readout.svt.SimpleSvtReadout" /> <driver name="ClockDriver" type="org.hps.readout.ecal.ClockDriver"/> <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver"> @@ -62,4 +62,4 @@ </driver> </drivers> </lcsim> - + Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/readout/HPS2014TruthReadoutToLcio.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/readout/HPS2014TruthReadoutToLcio.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/readout/HPS2014TruthReadoutToLcio.lcsim Wed Mar 9 11:43:24 2016 @@ -47,7 +47,7 @@ <applyBadCrystalMap>false</applyBadCrystalMap> <use2014Gain>true</use2014Gain> <!-- <debug>true</debug>--> - </driver> + </driver> <driver name="EcalClusterer" type="org.hps.recon.ecal.cluster.GTPClusterDriver"> <inputHitCollectionName>EcalCorrectedHits</inputHitCollectionName> <clusterWindow>1</clusterWindow> @@ -57,7 +57,7 @@ <deadTime>10</deadTime> <pairCoincidence>2</pairCoincidence> <outputFileName>${outputFile}.triggers</outputFileName> - </driver> + </driver> <driver name="SimpleSVTReadout" type="org.hps.readout.svt.SimpleSvtReadout"> </driver> <driver name="AidaSaveDriver" @@ -70,4 +70,4 @@ </driver> </drivers> </lcsim> - + Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/readout/LcioToEvio.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/readout/LcioToEvio.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/readout/LcioToEvio.lcsim Wed Mar 9 11:43:24 2016 @@ -15,7 +15,7 @@ <period>1</period> <deadTime>0</deadTime> <triggerDelay>0</triggerDelay> - </driver> + </driver> <driver name="TestRunReconToEvio" type="org.hps.evio.TestRunTriggeredReconToEvio"> <evioOutputFile>${outputFile}.evio</evioOutputFile> </driver> @@ -23,4 +23,4 @@ </driver> </drivers> </lcsim> - + Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/readout/TestRunNoPileup.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/readout/TestRunNoPileup.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/readout/TestRunNoPileup.lcsim Wed Mar 9 11:43:24 2016 @@ -39,7 +39,7 @@ <clusterCollectionName>EcalTriggerClusters</clusterCollectionName> <deadTime>0</deadTime> <lcioFile>${outputFile}.slcio</lcioFile> - </driver> + </driver> <driver name="ClockDriver" type="org.hps.readout.ecal.ClockDriver"/> <driver name="CleanupDriver" type="org.lcsim.recon.tracking.digitization.sisim.config.ReadoutCleanupDriver"/> </drivers> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/readout/TestRunReadoutToEvio.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/readout/TestRunReadoutToEvio.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/readout/TestRunReadoutToEvio.lcsim Wed Mar 9 11:43:24 2016 @@ -20,7 +20,7 @@ <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>1000</eventInterval> </driver> - <driver name="BadChannelFilter" type="org.hps.recon.tracking.SVTBadChannelFilterDriver" /> + <driver name="BadChannelFilter" type="org.hps.recon.tracking.SVTBadChannelFilterDriver" /> <driver name="EcalReadout" type="org.hps.readout.ecal.FADCEcalReadoutDriver"> <coincidenceWindow>8</coincidenceWindow> <ecalName>Ecal</ecalName> @@ -39,7 +39,7 @@ <rawCollectionName>EcalRawHits</rawCollectionName> <ecalCollectionName>EcalCorrectedHits</ecalCollectionName> <scale>1</scale> - </driver> + </driver> <driver name="EcalTriggerFilter" type="org.hps.recon.ecal.EcalTriggerFilterDriver"> <inputCollection>EcalCorrectedHits</inputCollection> <outputCollection>EcalFilteredHits</outputCollection> @@ -55,7 +55,7 @@ <clusterCollectionName>EcalClusters</clusterCollectionName> <deadTime>10</deadTime> <outputFileName>${outputFile}.triggers</outputFileName> - </driver> + </driver> <driver name="SimpleSVTReadout" type="org.hps.readout.svt.SimpleSvtReadout" /> <driver name="ClockDriver" type="org.hps.readout.ecal.ClockDriver"/> <driver name="TestRunReconToEvio" type="org.hps.evio.TestRunTriggeredReconToEvio"> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/recon/EngineeringRun2015FullRecon.lcsim Wed Mar 9 11:43:24 2016 @@ -7,8 +7,8 @@ @author <a href="mailto:[log in to unmask]">Omar Moreno</a> --> <execute> - <!--RF driver--> - <driver name="RfFitter"/> + <!--RF driver--> + <driver name="RfFitter"/> <!-- Ecal reconstruction drivers --> <driver name="EcalRunningPedestal"/> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/baltzell/EngineeringRun2015FullRecon.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/baltzell/EngineeringRun2015FullRecon.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/baltzell/EngineeringRun2015FullRecon.lcsim Wed Mar 9 11:43:24 2016 @@ -12,8 +12,8 @@ <driver name="UnblinderTriggerSkimmer"/> - <!--RF driver--> - <driver name="RfFitter"/> + <!--RF driver--> + <driver name="RfFitter"/> <driver name="EcalRawConverter" /> <driver name="ReconClusterer" /> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/celentan/LedAnalysisFromEvio.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/celentan/LedAnalysisFromEvio.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/celentan/LedAnalysisFromEvio.lcsim Wed Mar 9 11:43:24 2016 @@ -1,9 +1,9 @@ <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> <execute> - <driver name="EventMarkerDriver"/> + <driver name="EventMarkerDriver"/> <driver name="EcalRunningPedestal"/> - <driver name="EcalRawConverter" /> + <driver name="EcalRawConverter" /> <driver name="AidaSaveDriver"/> </execute> <drivers> @@ -25,5 +25,5 @@ <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver"> <outputFileName>${outputFile}.aida</outputFileName> </driver> - </drivers> + </drivers> </lcsim> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/celentan/LedOnlineOfflineComparison.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/celentan/LedOnlineOfflineComparison.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/celentan/LedOnlineOfflineComparison.lcsim Wed Mar 9 11:43:24 2016 @@ -1,7 +1,7 @@ <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> <execute> - <driver name="EventMarkerDriver"/> + <driver name="EventMarkerDriver"/> <driver name="LedOnlineOfflineComparison"/> <driver name="AidaSaveDriver"/> </execute> @@ -14,5 +14,5 @@ <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver"> <outputFileName>${outputFile}.root</outputFileName> </driver> - </drivers> + </drivers> </lcsim> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/ClusterRecon.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/ClusterRecon.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/ClusterRecon.lcsim Wed Mar 9 11:43:24 2016 @@ -5,7 +5,7 @@ @author Holly Szumila <[log in to unmask]> --> <execute> - <driver name="EventMarkerDriver"/> + <driver name="EventMarkerDriver"/> <driver name="EcalRunningPedestal"/> <driver name="EcalRawConverter" /> <driver name="ReconClusterer" /> @@ -13,7 +13,7 @@ <driver name="LCIOWriter"/> </execute> <drivers> - <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> + <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> <eventInterval>1000</eventInterval> </driver> <driver name="EcalRunningPedestal" type="org.hps.recon.ecal.EcalRunningPedestalDriver"> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/EcalFeeViewer.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/EcalFeeViewer.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/EcalFeeViewer.lcsim Wed Mar 9 11:43:24 2016 @@ -1,7 +1,7 @@ <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> <execute> - <driver name="EcalRunningPedestal"/> + <driver name="EcalRunningPedestal"/> <driver name="EcalRawConverter" /> <driver name="ReconClusterer"/> <driver name="FEEPlotter"/> @@ -10,7 +10,7 @@ </execute> <drivers> <driver name="EcalRunningPedestal" type="org.hps.recon.ecal.EcalRunningPedestalDriver"> - <logLevel>CONFIG</logLevel> + <logLevel>CONFIG</logLevel> </driver> <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver"> </driver> @@ -18,7 +18,7 @@ <logLevel>WARNING</logLevel> </driver> <driver name="FEEPlotter" type="org.hps.analysis.ecal.FEEClusterPlotter"> - <outputPlots>yes</outputPlots> + <outputPlots>yes</outputPlots> </driver> <driver name="EcalFeeMonitor" type="org.hps.monitoring.ecal.plots.EcalFeeMonitor"> </driver> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/EcalSimReadout.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/EcalSimReadout.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/EcalSimReadout.lcsim Wed Mar 9 11:43:24 2016 @@ -21,11 +21,11 @@ <eventInterval>1000</eventInterval> </driver> <driver name="ConditionsDriver" type="org.hps.conditions.ConditionsDriver"> - <runNumber>0</runNumber> - <freeze>true</freeze> - <detectorName>HPS-ECalCommissioning-v3-fieldmap</detectorName> - </driver> -<!-- <driver name="TestRunReconToLcio" type="org.hps.evio.TestRunTriggeredReconToLcio"> + <runNumber>0</runNumber> + <freeze>true</freeze> + <detectorName>HPS-ECalCommissioning-v3-fieldmap</detectorName> + </driver> +<!-- <driver name="TestRunReconToLcio" type="org.hps.evio.TestRunTriggeredReconToLcio"> <outputFile>${outputFile}.slcio</outputFile> <rejectBackground>true</rejectBackground> </driver>--> @@ -45,7 +45,7 @@ <ecalCollectionName>EcalCorrectedHits</ecalCollectionName> <applyBadCrystalMap>false</applyBadCrystalMap> <use2014Gain>false</use2014Gain> - </driver> + </driver> <driver name="ReconClusterer" type="org.hps.recon.ecal.cluster.ReconClusterDriver"> <logLevel>WARNING</logLevel> <inputHitCollectionName>EcalCorrectedHits</inputHitCollectionName> @@ -65,4 +65,4 @@ </driver> </drivers> </lcsim> - + Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/EngRun2015FullReconMC_FEE.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/EngRun2015FullReconMC_FEE.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/EngRun2015FullReconMC_FEE.lcsim Wed Mar 9 11:43:24 2016 @@ -74,11 +74,11 @@ <eventInterval>1000</eventInterval> </driver> <driver name="RfFitter" type="org.hps.evio.RfFitterDriver"/> - <driver name="FEEFilterDriver" type="org.hps.recon.filtering.FEEFilterDriver"> + <driver name="FEEFilterDriver" type="org.hps.recon.filtering.FEEFilterDriver"> </driver> <driver name="FEEPlotter" type="org.hps.analysis.ecal.FEEClusterPlotter"> - <inputCollection>EcalClusters</inputCollection> - <outputPlots>yes</outputPlots> + <inputCollection>EcalClusters</inputCollection> + <outputPlots>yes</outputPlots> </driver> <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver"> <outputFileName>${outputFile}.root</outputFileName> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/EngineeringRun2015EcalOnly.lcsim ============================================================================= Binary files - no diff available. Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/EngineeringRun2015_FEEIter_Filter.lcsim ============================================================================= Binary files - no diff available. Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/QuickEcalReadout.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/QuickEcalReadout.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/holly/QuickEcalReadout.lcsim Wed Mar 9 11:43:24 2016 @@ -18,11 +18,11 @@ <eventInterval>1000</eventInterval> </driver> <driver name="ConditionsDriver" type="org.hps.conditions.ConditionsDriver"> - <runNumber>0</runNumber> - <freeze>true</freeze> - <detectorName>HPS-Proposal2014-v7-2pt2</detectorName> - </driver> - <driver name="TestRunReconToLcio" type="org.hps.evio.TestRunTriggeredReconToLcio"> + <runNumber>0</runNumber> + <freeze>true</freeze> + <detectorName>HPS-Proposal2014-v7-2pt2</detectorName> + </driver> + <driver name="TestRunReconToLcio" type="org.hps.evio.TestRunTriggeredReconToLcio"> <outputFile>${outputFile}.slcio</outputFile> <rejectBackground>true</rejectBackground> </driver> @@ -44,4 +44,4 @@ </driver> </drivers> </lcsim> - + Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/EcalScoring.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/EcalScoring.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/EcalScoring.lcsim Wed Mar 9 11:43:24 2016 @@ -25,4 +25,4 @@ </drivers> </lcsim> - + Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/HitTimes.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/HitTimes.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/HitTimes.lcsim Wed Mar 9 11:43:24 2016 @@ -1,14 +1,14 @@ <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> - <execute> - <driver name="EventMarkerDriver"/> - <driver name="HitTimePrintDriver"/> - </execute> - <drivers> - <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> - <eventInterval>1</eventInterval> - </driver> - <driver name="HitTimePrintDriver" type="org.hps.users.meeg.HitTimePrintDriver"/> - </drivers> + <execute> + <driver name="EventMarkerDriver"/> + <driver name="HitTimePrintDriver"/> + </execute> + <drivers> + <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> + <eventInterval>1</eventInterval> + </driver> + <driver name="HitTimePrintDriver" type="org.hps.users.meeg.HitTimePrintDriver"/> + </drivers> </lcsim> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/PairsSkimmer.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/PairsSkimmer.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/PairsSkimmer.lcsim Wed Mar 9 11:43:24 2016 @@ -44,4 +44,4 @@ </driver> </drivers> </lcsim> - + Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/SmallHits.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/SmallHits.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/SmallHits.lcsim Wed Mar 9 11:43:24 2016 @@ -1,18 +1,18 @@ <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> - <execute> - <driver name="EventMarkerDriver"/> - <driver name="SVTSmallHitsDriver"/> + <execute> + <driver name="EventMarkerDriver"/> + <driver name="SVTSmallHitsDriver"/> <driver name="AidaSaveDriver"/> - </execute> - <drivers> - <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> - <eventInterval>1000</eventInterval> - </driver> - <driver name="SVTSmallHitsDriver" type="org.hps.users.meeg.SVTSmallHitsDriver"/> + </execute> + <drivers> + <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> + <eventInterval>1000</eventInterval> + </driver> + <driver name="SVTSmallHitsDriver" type="org.hps.users.meeg.SVTSmallHitsDriver"/> <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver"> <outputFileName>smallhits.root</outputFileName> </driver> - </drivers> + </drivers> </lcsim> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/TridentMCSkim.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/TridentMCSkim.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/TridentMCSkim.lcsim Wed Mar 9 11:43:24 2016 @@ -27,4 +27,4 @@ </driver> </drivers> </lcsim> - + Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/ecal_fadc_bkgd.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/ecal_fadc_bkgd.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/ecal_fadc_bkgd.lcsim Wed Mar 9 11:43:24 2016 @@ -10,11 +10,11 @@ <driver name="EcalConverter" /> <driver name="EcalClusterer" /> <driver name="EcalTrigger" /> -<!-- <driver name="EcalPlots"/>--> +<!-- <driver name="EcalPlots"/>--> <driver name="EcalFADCPlots" /> <driver name="EcalTriggerPlots" /> <driver name="MCParticlePlots" /> -<!-- <driver name="Writer"/>--> +<!-- <driver name="Writer"/>--> <driver name="AidaSaveDriver" /> <driver name="ClockDriver" /> </execute> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/raw_triggers.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/raw_triggers.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/raw_triggers.lcsim Wed Mar 9 11:43:24 2016 @@ -5,10 +5,10 @@ --> <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> <execute> -<!-- <driver name="EventMarkerDriver"/>--> +<!-- <driver name="EventMarkerDriver"/>--> <driver name="EcalClusterer" /> <driver name="EcalTrigger" /> -<!-- <driver name="MCParticlePlots"/>--> +<!-- <driver name="MCParticlePlots"/>--> <driver name="AidaSaveDriver" /> <driver name="ClockDriver" /> </execute> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/phansson/TestRunOfflineRecon.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/phansson/TestRunOfflineRecon.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/phansson/TestRunOfflineRecon.lcsim Wed Mar 9 11:43:24 2016 @@ -39,7 +39,7 @@ </driver> <driver name="TrackerReconDriver" type="org.hps.recon.tracking.TrackerReconDriver"> <debug>false</debug> - <!--<strategyResource>/org/hps/recon/tracking/strategies/HPS-Test-All.xml</strategyResource>--> + <!--<strategyResource>/org/hps/recon/tracking/strategies/HPS-Test-All.xml</strategyResource>--> <strategyResource>/org/hps/recon/tracking/strategies/HPS-TestRun-357.xml</strategyResource> </driver> <driver name="EcalRawConverter" type="org.hps.recon.ecal.EcalRawConverterDriver"> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/rafo/TestSteering.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/rafo/TestSteering.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/rafo/TestSteering.lcsim Wed Mar 9 11:43:24 2016 @@ -17,4 +17,4 @@ </driver> </drivers> </lcsim> - + Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/spaul/MollerBeamtilt.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/spaul/MollerBeamtilt.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/spaul/MollerBeamtilt.lcsim Wed Mar 9 11:43:24 2016 @@ -15,13 +15,13 @@ <eventInterval>1000</eventInterval> </driver> - <driver name="MollerBeamtilt" type="org.hps.users.spaul.moller.MollerBeamtiltAnalysis"> - <maxVtxChi2>15</maxVtxChi2> - <maxTrkChi2>30</maxTrkChi2> - <minMass>.030</minMass> - <maxMass>.036</maxMass> - <minPz>1.0</minPz> - <maxPz>1.1</maxPz> + <driver name="MollerBeamtilt" type="org.hps.users.spaul.moller.MollerBeamtiltAnalysis"> + <maxVtxChi2>15</maxVtxChi2> + <maxTrkChi2>30</maxTrkChi2> + <minMass>.030</minMass> + <maxMass>.036</maxMass> + <minPz>1.0</minPz> + <maxPz>1.1</maxPz> </driver> <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver"> <outputFileName>${outputFile}</outputFileName> Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/DumbShaperFit.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/DumbShaperFit.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/DumbShaperFit.java Wed Mar 9 11:43:24 2016 @@ -34,7 +34,7 @@ } public Collection<ShapeFitParameters> fitShape(int channel, short[] samples, HpsSiSensor sensor){ - + ShapeFitParameters fitresults = new ShapeFitParameters(); double[] pedSub = {-99.0, -99.0, -99.0, -99.0, -99.0, -99.0}; double maxADC = -99999; Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/NearestNeighborRMSClusterer.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/NearestNeighborRMSClusterer.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/NearestNeighborRMSClusterer.java Wed Mar 9 11:43:24 2016 @@ -161,7 +161,7 @@ double signal = base_hit.getAmp(); double noiseRMS = 0; for(int sampleN = 0; sampleN < HPSSVTConstants.TOTAL_NUMBER_OF_SAMPLES; sampleN++){ - noiseRMS += ((HpsSiSensor) rth.getDetectorElement()).getNoise(channel_number, sampleN); + noiseRMS += ((HpsSiSensor) rth.getDetectorElement()).getNoise(channel_number, sampleN); } noiseRMS = noiseRMS/HPSSVTConstants.TOTAL_NUMBER_OF_SAMPLES; @@ -225,7 +225,7 @@ cluster_signal += hit.getAmp(); double strip_noise = 0; for(int sampleN = 0; sampleN < HPSSVTConstants.TOTAL_NUMBER_OF_SAMPLES; sampleN++){ - strip_noise += ((HpsSiSensor) hit.getRawTrackerHit().getDetectorElement()).getNoise(clustered_cell, sampleN); + strip_noise += ((HpsSiSensor) hit.getRawTrackerHit().getDetectorElement()).getNoise(clustered_cell, sampleN); } strip_noise = strip_noise/HPSSVTConstants.TOTAL_NUMBER_OF_SAMPLES; cluster_noise_squared += Math.pow(strip_noise, 2); Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/NoiselessReadoutChip.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/NoiselessReadoutChip.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/NoiselessReadoutChip.java Wed Mar 9 11:43:24 2016 @@ -164,8 +164,8 @@ // Loop over the channels contained in the SiElectrodeDataCollection for (Integer channel : data.keySet()) { - - if(dropBadChannels && ((HpsSiSensor) electrodes.getDetectorElement()).isBadChannel(channel)){ + + if(dropBadChannels && ((HpsSiSensor) electrodes.getDetectorElement()).isBadChannel(channel)){ //===> if (dropBadChannels && HPSSVTCalibrationConstants.isBadChannel((SiSensor) electrodes.getDetectorElement(), channel)) { // System.out.format("%d bad\n", channel); continue; Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/SVTBadChannelFilterDriver.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/SVTBadChannelFilterDriver.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/SVTBadChannelFilterDriver.java Wed Mar 9 11:43:24 2016 @@ -19,33 +19,33 @@ */ public class SVTBadChannelFilterDriver extends Driver { - // RawTrackerHit collection name + // RawTrackerHit collection name private String rawTrackerHitCollection = "SVTRawTrackerHits"; @Override public void process(EventHeader event) { - + if (event.hasCollection(RawTrackerHit.class, rawTrackerHitCollection)) { - // Get the list of raw hits from the event - List<RawTrackerHit> hits = event.get(RawTrackerHit.class, rawTrackerHitCollection); - + // Get the list of raw hits from the event + List<RawTrackerHit> hits = event.get(RawTrackerHit.class, rawTrackerHitCollection); + // Get the hits meta data from the event - LCMetaData meta = event.getMetaData(hits); + LCMetaData meta = event.getMetaData(hits); - // Iterate over all raw hits in the event. If the raw hit is - // identified to come from a noisy/bad channel, remove it from - // the list of raw hits. + // Iterate over all raw hits in the event. If the raw hit is + // identified to come from a noisy/bad channel, remove it from + // the list of raw hits. Iterator<RawTrackerHit> hitsIterator = hits.iterator(); while (hitsIterator.hasNext()) { - RawTrackerHit hit = hitsIterator.next(); + RawTrackerHit hit = hitsIterator.next(); //hit.setMetaData(meta); int strip = hit.getIdentifierFieldValue("strip"); HpsSiSensor sensor = (HpsSiSensor) hit.getDetectorElement(); if(sensor.isBadChannel(strip)){ - hitsIterator.remove(); + hitsIterator.remove(); } if (!sensor.getReadout().getHits(RawTrackerHit.class).isEmpty()) { Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackResidualsData.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackResidualsData.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackResidualsData.java Wed Mar 9 11:43:24 2016 @@ -13,84 +13,84 @@ */ public class TrackResidualsData implements GenericObject { - List<Double> trackResidualsX = new ArrayList<Double>(); - List<Float> trackResidualsY = new ArrayList<Float>(); - List<Integer> layers = new ArrayList<Integer>(); - - /** - * Default Ctor - * - * @param trackerVolume : The SVT volume to which the track used to calculate - * the residuals corresponds to. - */ - public TrackResidualsData(int trackerVolume, List<Integer> layers, List<Double> trackResidualsX, List<Float> trackResidualsY){ - this.layers.addAll(layers); - this.layers.add(trackerVolume); - this.trackResidualsX.addAll(trackResidualsX); - this.trackResidualsY.addAll(trackResidualsY); - } + List<Double> trackResidualsX = new ArrayList<Double>(); + List<Float> trackResidualsY = new ArrayList<Float>(); + List<Integer> layers = new ArrayList<Integer>(); + + /** + * Default Ctor + * + * @param trackerVolume : The SVT volume to which the track used to calculate + * the residuals corresponds to. + */ + public TrackResidualsData(int trackerVolume, List<Integer> layers, List<Double> trackResidualsX, List<Float> trackResidualsY){ + this.layers.addAll(layers); + this.layers.add(trackerVolume); + this.trackResidualsX.addAll(trackResidualsX); + this.trackResidualsY.addAll(trackResidualsY); + } - /** - * - * @return tracker volume : 0 if top 1 if bottom - */ - public int getTrackerVolume(){ - return layers.get(layers.size() - 1); - } - - /** - * - */ - @Override - public double getDoubleVal(int index) { - return trackResidualsX.get(index); - } + /** + * + * @return tracker volume : 0 if top 1 if bottom + */ + public int getTrackerVolume(){ + return layers.get(layers.size() - 1); + } + + /** + * + */ + @Override + public double getDoubleVal(int index) { + return trackResidualsX.get(index); + } - /** - * - */ - @Override - public float getFloatVal(int index) { - return trackResidualsY.get(index); - } + /** + * + */ + @Override + public float getFloatVal(int index) { + return trackResidualsY.get(index); + } - /** - * - */ - @Override - public int getIntVal(int index) { - return layers.get(index); - } + /** + * + */ + @Override + public int getIntVal(int index) { + return layers.get(index); + } - /** - * - */ - @Override - public int getNDouble() { - return trackResidualsX.size(); - } + /** + * + */ + @Override + public int getNDouble() { + return trackResidualsX.size(); + } - /** - * - */ - @Override - public int getNFloat() { - return trackResidualsY.size(); - } + /** + * + */ + @Override + public int getNFloat() { + return trackResidualsY.size(); + } - /** - * - */ - @Override - public int getNInt() { - return layers.size(); - } + /** + * + */ + @Override + public int getNInt() { + return layers.size(); + } - /** - * - */ - @Override - public boolean isFixedSize() { - return false; - } + /** + * + */ + @Override + public boolean isFixedSize() { + return false; + } } Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackTimeData.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackTimeData.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackTimeData.java Wed Mar 9 11:43:24 2016 @@ -12,124 +12,124 @@ */ public class TrackTimeData implements GenericObject { - List<Float> trackTimeData = new ArrayList<Float>(); - List<Double> t0Residuals = new ArrayList<Double>(); - List<Integer> layers = new ArrayList<Integer>(); - - // Constants - private final static int SVT_VOLUME_INDEX = 0; - private final static int TRACK_TIME_INDEX = 1; - - /** - * Default Ctor - * - * @param trackTime : The mean t0 time of all hits of a track - * @param trackerVolume : The SVT volume to which the track used to calculate - * the track time corresponds to. - * - */ - public TrackTimeData(float trackerVolume, double trackTime, List<Integer> layers, List<Double> t0Residuals){ - trackTimeData.add(trackerVolume); - trackTimeData.add((float) trackTime); - this.layers.addAll(layers); - this.t0Residuals.addAll(t0Residuals); - } - - /** - * - * - * @param layer : - * @param t0Residual : - * - */ - private void addResidual(int layer, double t0Residual) { - layers.add(layer); - t0Residuals.add(t0Residual); - } + List<Float> trackTimeData = new ArrayList<Float>(); + List<Double> t0Residuals = new ArrayList<Double>(); + List<Integer> layers = new ArrayList<Integer>(); + + // Constants + private final static int SVT_VOLUME_INDEX = 0; + private final static int TRACK_TIME_INDEX = 1; + + /** + * Default Ctor + * + * @param trackTime : The mean t0 time of all hits of a track + * @param trackerVolume : The SVT volume to which the track used to calculate + * the track time corresponds to. + * + */ + public TrackTimeData(float trackerVolume, double trackTime, List<Integer> layers, List<Double> t0Residuals){ + trackTimeData.add(trackerVolume); + trackTimeData.add((float) trackTime); + this.layers.addAll(layers); + this.t0Residuals.addAll(t0Residuals); + } + + /** + * + * + * @param layer : + * @param t0Residual : + * + */ + private void addResidual(int layer, double t0Residual) { + layers.add(layer); + t0Residuals.add(t0Residual); + } - /** - * - */ - public double getTrackTime() { - return trackTimeData.get(TRACK_TIME_INDEX); - } - - /** - * - * - */ - public double getT0Residual(int layer) { - return this.getDoubleVal(layer); - } + /** + * + */ + public double getTrackTime() { + return trackTimeData.get(TRACK_TIME_INDEX); + } + + /** + * + * + */ + public double getT0Residual(int layer) { + return this.getDoubleVal(layer); + } - /** - * - */ - public double getClusterTime(int layer) { - return this.getTrackTime() - this.getT0Residual(layer); - } - - /** - * - * - */ - public boolean isTopSvtVolume() { - return (trackTimeData.get(SVT_VOLUME_INDEX) == 0) ? true : false; - } - - /** - * - */ - @Override - public double getDoubleVal(int index) { - return t0Residuals.get(index); - } + /** + * + */ + public double getClusterTime(int layer) { + return this.getTrackTime() - this.getT0Residual(layer); + } + + /** + * + * + */ + public boolean isTopSvtVolume() { + return (trackTimeData.get(SVT_VOLUME_INDEX) == 0) ? true : false; + } + + /** + * + */ + @Override + public double getDoubleVal(int index) { + return t0Residuals.get(index); + } - /** - * - */ - @Override - public float getFloatVal(int index) { - return trackTimeData.get(index); - } + /** + * + */ + @Override + public float getFloatVal(int index) { + return trackTimeData.get(index); + } - /** - * - */ - @Override - public int getIntVal(int index) { - return layers.get(index); - } + /** + * + */ + @Override + public int getIntVal(int index) { + return layers.get(index); + } - /** - * - */ - @Override - public int getNDouble() { - return t0Residuals.size(); - } + /** + * + */ + @Override + public int getNDouble() { + return t0Residuals.size(); + } - /** - * - */ - @Override - public int getNFloat() { - return trackTimeData.size(); - } + /** + * + */ + @Override + public int getNFloat() { + return trackTimeData.size(); + } - /** - * - */ - @Override - public int getNInt() { - return layers.size(); - } + /** + * + */ + @Override + public int getNInt() { + return layers.size(); + } - /** - * - */ - @Override - public boolean isFixedSize() { - return false; - } + /** + * + */ + @Override + public boolean isFixedSize() { + return false; + } } Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/WTrack.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/WTrack.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/WTrack.java Wed Mar 9 11:43:24 2016 @@ -38,8 +38,8 @@ * @param bfield value and sign of magnetic field */ public WTrack(HelicalTrackFit track, double bfield) { - _htf = track; - //_bfield = flip ? -1.0 * bfield : bfield; // flip if needed + _htf = track; + //_bfield = flip ? -1.0 * bfield : bfield; // flip if needed _bfield = bfield; _a = -1 * Constants.fieldConversion * _bfield * Math.signum(track.R()); double p = track.p(Math.abs(_bfield)); @@ -228,8 +228,8 @@ } /* - Calculate the exact position of the new helix parameters at path length s in an arbitrarily oriented, - constant magnetic field point xp is the point h is a unit vector in the direction of the magnetic field. + Calculate the exact position of the new helix parameters at path length s in an arbitrarily oriented, + constant magnetic field point xp is the point h is a unit vector in the direction of the magnetic field. * @param s - path length * @param h - magnetic field unit vector * @return track parameters Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLEventData.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLEventData.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLEventData.java Wed Mar 9 11:43:24 2016 @@ -3,87 +3,87 @@ import org.lcsim.event.GenericObject; public class GBLEventData implements GenericObject { - - /* - * - * Interface enumerator to access the correct data - * - */ - private static class GBLINT { - public static final int RUNNR = 0; - public static final int BANK_INT_SIZE = 1; - } - private static class GBLDOUBLE { - public static final int BFIELD = 0; - public static final int BANK_DOUBLE_SIZE = 1; - } - // array holding the integer data - private int bank_int[] = new int[GBLINT.BANK_INT_SIZE]; - private double bank_double[] = new double[GBLDOUBLE.BANK_DOUBLE_SIZE]; - + + /* + * + * Interface enumerator to access the correct data + * + */ + private static class GBLINT { + public static final int RUNNR = 0; + public static final int BANK_INT_SIZE = 1; + } + private static class GBLDOUBLE { + public static final int BFIELD = 0; + public static final int BANK_DOUBLE_SIZE = 1; + } + // array holding the integer data + private int bank_int[] = new int[GBLINT.BANK_INT_SIZE]; + private double bank_double[] = new double[GBLDOUBLE.BANK_DOUBLE_SIZE]; + - /** - * Constructor with event number as parameter - * @param eventNumber the event number - * - */ - public GBLEventData(int eventNumber,double Bz) { - setRunNr(eventNumber); - setBfield(Bz); - } - - public void setRunNr(int val) { - bank_int[GBLINT.RUNNR] = val; - } - - public int getRunNr() { - return this.getIntVal(GBLINT.RUNNR); - } - - public void setBfield(double val) { - bank_double[GBLDOUBLE.BFIELD] = val; - } - - public double getBfield() { - return this.getDoubleVal(GBLDOUBLE.BFIELD); - } - - - @Override - public int getNInt() { - return GBLINT.BANK_INT_SIZE; - } + /** + * Constructor with event number as parameter + * @param eventNumber the event number + * + */ + public GBLEventData(int eventNumber,double Bz) { + setRunNr(eventNumber); + setBfield(Bz); + } + + public void setRunNr(int val) { + bank_int[GBLINT.RUNNR] = val; + } + + public int getRunNr() { + return this.getIntVal(GBLINT.RUNNR); + } + + public void setBfield(double val) { + bank_double[GBLDOUBLE.BFIELD] = val; + } + + public double getBfield() { + return this.getDoubleVal(GBLDOUBLE.BFIELD); + } + + + @Override + public int getNInt() { + return GBLINT.BANK_INT_SIZE; + } - @Override - public int getNFloat() { - return 0; - } + @Override + public int getNFloat() { + return 0; + } - @Override - public int getNDouble() { - return GBLDOUBLE.BANK_DOUBLE_SIZE; - } + @Override + public int getNDouble() { + return GBLDOUBLE.BANK_DOUBLE_SIZE; + } - @Override - public int getIntVal(int index) { - return bank_int[index]; - } + @Override + public int getIntVal(int index) { + return bank_int[index]; + } - @Override - public float getFloatVal(int index) { - // TODO Auto-generated method stub - return 0; - } + @Override + public float getFloatVal(int index) { + // TODO Auto-generated method stub + return 0; + } - @Override - public double getDoubleVal(int index) { - return bank_double[index]; - } + @Override + public double getDoubleVal(int index) { + return bank_double[index]; + } - @Override - public boolean isFixedSize() { - // TODO Auto-generated method stub - return false; - } + @Override + public boolean isFixedSize() { + // TODO Auto-generated method stub + return false; + } } Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLFileIO.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLFileIO.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLFileIO.java Wed Mar 9 11:43:24 2016 @@ -47,11 +47,11 @@ } } private void openFile(String fileName) { - if(fileName.equalsIgnoreCase("")) { - System.out.printf("%s: no file name specified \n", this.getClass().getSimpleName()); - System.exit(1); - } - try { + if(fileName.equalsIgnoreCase("")) { + System.out.printf("%s: no file name specified \n", this.getClass().getSimpleName()); + System.exit(1); + } + try { _fWriter = new FileWriter(fileName); _pWriter = new PrintWriter(_fWriter); } catch (IOException ex) { Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLStripClusterData.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLStripClusterData.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLStripClusterData.java Wed Mar 9 11:43:24 2016 @@ -13,55 +13,55 @@ * @version $Id: */ public class GBLStripClusterData implements GenericObject { - - /* - * - * Interface enumerator to access the correct data - * - */ - public static class GBLINT { - public static final int ID = 0; - public static final int BANK_INT_SIZE = 1; - } - public static class GBLDOUBLE { - public static final int PATH3D = 0; - public static final int PATH = 1; - public static final int UX = 2; - public static final int UY = 3; - public static final int UZ = 4; - public static final int VX = 5; - public static final int VY = 6; - public static final int VZ = 7; - public static final int WX = 8; - public static final int WY = 9; - public static final int WZ = 10; - public static final int TDIRX = 11; - public static final int TDIRY = 12; - public static final int TDIRZ = 13; - public static final int TPHI = 14; - public static final int UMEAS = 15; - public static final int TPOSU = 16 ; - public static final int TPOSV = 17; - public static final int TPOSW = 18; - public static final int UMEASERR = 19; - public static final int MSANGLE = 20; - public static final int TLAMBDA = 21; - - - public static final int BANK_DOUBLE_SIZE = 22; - - } - // array holding the integer data - private int bank_int[] = new int[GBLINT.BANK_INT_SIZE]; - // array holding the double data - private double bank_double[] = new double[GBLDOUBLE.BANK_DOUBLE_SIZE]; - - /** - * Default constructor - */ - public GBLStripClusterData(int id) { - setId(id); - } + + /* + * + * Interface enumerator to access the correct data + * + */ + public static class GBLINT { + public static final int ID = 0; + public static final int BANK_INT_SIZE = 1; + } + public static class GBLDOUBLE { + public static final int PATH3D = 0; + public static final int PATH = 1; + public static final int UX = 2; + public static final int UY = 3; + public static final int UZ = 4; + public static final int VX = 5; + public static final int VY = 6; + public static final int VZ = 7; + public static final int WX = 8; + public static final int WY = 9; + public static final int WZ = 10; + public static final int TDIRX = 11; + public static final int TDIRY = 12; + public static final int TDIRZ = 13; + public static final int TPHI = 14; + public static final int UMEAS = 15; + public static final int TPOSU = 16 ; + public static final int TPOSV = 17; + public static final int TPOSW = 18; + public static final int UMEASERR = 19; + public static final int MSANGLE = 20; + public static final int TLAMBDA = 21; + + + public static final int BANK_DOUBLE_SIZE = 22; + + } + // array holding the integer data + private int bank_int[] = new int[GBLINT.BANK_INT_SIZE]; + // array holding the double data + private double bank_double[] = new double[GBLDOUBLE.BANK_DOUBLE_SIZE]; + + /** + * Default constructor + */ + public GBLStripClusterData(int id) { + setId(id); + } /* * Constructor from GenericObject @@ -79,239 +79,239 @@ } } - - /** - * @param set track id to val - */ - public void setId(int val) { - bank_int[GBLINT.ID] = val; - } - - /** - * @return track id for this object - */ - public int getId() { - return this.getIntVal(GBLINT.ID); - } - - /** - * Set path length to this strip cluster - * @param val - */ - public void setPath(double val) { - bank_double[GBLDOUBLE.PATH] = val; - } - - /** - * Get path length to this strip cluster - */ - public double getPath() { - return getDoubleVal(GBLDOUBLE.PATH); - } - - /** - * Set path length to this strip cluster - * @param val - */ - public void setPath3D(double val) { - bank_double[GBLDOUBLE.PATH3D] = val; - } - - /** - * Get path length to this strip cluster - */ - public double getPath3D() { - return getDoubleVal(GBLDOUBLE.PATH3D); - } - - - /** - * Set and get u vector for this strip sensor - */ - public void setU(Hep3Vector u) { - bank_double[GBLDOUBLE.UX] = u.x(); - bank_double[GBLDOUBLE.UY] = u.y(); - bank_double[GBLDOUBLE.UZ] = u.z(); - } - public Hep3Vector getU() { - return new BasicHep3Vector(getUx(),getUy(),getUz()); - } - public double getUx() { - return getDoubleVal(GBLDOUBLE.UX); - } - public double getUy() { - return getDoubleVal(GBLDOUBLE.UY); - } - public double getUz() { - return getDoubleVal(GBLDOUBLE.UZ); - } - - /** - * Set and get v vector for this strip sensor - */ - - public void setV(Hep3Vector v) { - bank_double[GBLDOUBLE.VX] = v.x(); - bank_double[GBLDOUBLE.VY] = v.y(); - bank_double[GBLDOUBLE.VZ] = v.z(); - } - public Hep3Vector getV() { - return new BasicHep3Vector(getVx(),getVy(),getVz()); - } - public double getVx() { - return getDoubleVal(GBLDOUBLE.VX); - } - public double getVy() { - return getDoubleVal(GBLDOUBLE.VY); - } - public double getVz() { - return getDoubleVal(GBLDOUBLE.VZ); - } - - /** - * Set and get w vector for this strip sensor - */ - - public void setW(Hep3Vector v) { - bank_double[GBLDOUBLE.WX] = v.x(); - bank_double[GBLDOUBLE.WY] = v.y(); - bank_double[GBLDOUBLE.WZ] = v.z(); - } - public Hep3Vector getW() { - return new BasicHep3Vector(getWx(),getWy(),getWz()); - } - public double getWx() { - return getDoubleVal(GBLDOUBLE.WX); - } - public double getWy() { - return getDoubleVal(GBLDOUBLE.WY); - } - public double getWz() { - return getDoubleVal(GBLDOUBLE.WZ); - } - - /** - * Set track direction at this cluster - * - * @param tDir - */ - public void setTrackDir(Hep3Vector v) { - bank_double[GBLDOUBLE.TDIRX] = v.x(); - bank_double[GBLDOUBLE.TDIRY] = v.y(); - bank_double[GBLDOUBLE.TDIRZ] = v.z(); - } - public Hep3Vector getTrackDirection() { - return new BasicHep3Vector(getTx(),getTy(),getTz()); - } - public double getTx() { - return getDoubleVal(GBLDOUBLE.TDIRX); - } - public double getTy() { - return getDoubleVal(GBLDOUBLE.TDIRY); - } - public double getTz() { - return getDoubleVal(GBLDOUBLE.TDIRZ); - } - - public void setTrackPhi(double phi) { - bank_double[GBLDOUBLE.TPHI] = phi; - } - - public double getTrackPhi() { - return getDoubleVal(GBLDOUBLE.TPHI); - } - - public void setTrackLambda(double lambda) { - bank_double[GBLDOUBLE.TLAMBDA] = lambda; - } - - public double getTrackLambda() { - return getDoubleVal(GBLDOUBLE.TLAMBDA); - } - - - public void setMeas(double umeas) { - bank_double[GBLDOUBLE.UMEAS] = umeas; - } - - public double getMeas() { - return getDoubleVal(GBLDOUBLE.UMEAS); - } - - public void setMeasErr(double x) { - bank_double[GBLDOUBLE.UMEASERR] = x; - } - - public double getMeasErr() { - return getDoubleVal(GBLDOUBLE.UMEASERR); - } - - - /** - * Set track position in local frame - * @param trkpos_meas - */ - public void setTrackPos(Hep3Vector trkpos_meas) { - bank_double[GBLDOUBLE.TPOSU] = trkpos_meas.x(); - bank_double[GBLDOUBLE.TPOSV] = trkpos_meas.y(); - bank_double[GBLDOUBLE.TPOSW] = trkpos_meas.z(); - } - - public Hep3Vector getTrackPos() { - return new BasicHep3Vector(getTrackPosU(),getTrackPosV(),getTrackPosW()); - } - - public double getTrackPosU() { - return getDoubleVal(GBLDOUBLE.TPOSU); - } - - public double getTrackPosV() { - return getDoubleVal(GBLDOUBLE.TPOSV); - } - - public double getTrackPosW() { - return getDoubleVal(GBLDOUBLE.TPOSW); - } - - public void setScatterAngle(double scatAngle) { - bank_double[GBLDOUBLE.MSANGLE] = scatAngle; - } - - public double getScatterAngle() { - return getDoubleVal(GBLDOUBLE.MSANGLE); - } - - /* - * The functions below are all overide from - * @see org.lcsim.event.GenericObject#getNInt() - */ - - public int getNInt() { - return GBLINT.BANK_INT_SIZE; - } - - public int getNFloat() { - return 0; - } - - public int getNDouble() { - return GBLDOUBLE.BANK_DOUBLE_SIZE; - } - - public int getIntVal(int index) { - return bank_int[index]; - } - - public float getFloatVal(int index) { - return 0; - } - - public double getDoubleVal(int index) { - return bank_double[index]; - } - - public boolean isFixedSize() { - return false; - } + + /** + * @param set track id to val + */ + public void setId(int val) { + bank_int[GBLINT.ID] = val; + } + + /** + * @return track id for this object + */ + public int getId() { + return this.getIntVal(GBLINT.ID); + } + + /** + * Set path length to this strip cluster + * @param val + */ + public void setPath(double val) { + bank_double[GBLDOUBLE.PATH] = val; + } + + /** + * Get path length to this strip cluster + */ + public double getPath() { + return getDoubleVal(GBLDOUBLE.PATH); + } + + /** + * Set path length to this strip cluster + * @param val + */ + public void setPath3D(double val) { + bank_double[GBLDOUBLE.PATH3D] = val; + } + + /** + * Get path length to this strip cluster + */ + public double getPath3D() { + return getDoubleVal(GBLDOUBLE.PATH3D); + } + + + /** + * Set and get u vector for this strip sensor + */ + public void setU(Hep3Vector u) { + bank_double[GBLDOUBLE.UX] = u.x(); + bank_double[GBLDOUBLE.UY] = u.y(); + bank_double[GBLDOUBLE.UZ] = u.z(); + } + public Hep3Vector getU() { + return new BasicHep3Vector(getUx(),getUy(),getUz()); + } + public double getUx() { + return getDoubleVal(GBLDOUBLE.UX); + } + public double getUy() { + return getDoubleVal(GBLDOUBLE.UY); + } + public double getUz() { + return getDoubleVal(GBLDOUBLE.UZ); + } + + /** + * Set and get v vector for this strip sensor + */ + + public void setV(Hep3Vector v) { + bank_double[GBLDOUBLE.VX] = v.x(); + bank_double[GBLDOUBLE.VY] = v.y(); + bank_double[GBLDOUBLE.VZ] = v.z(); + } + public Hep3Vector getV() { + return new BasicHep3Vector(getVx(),getVy(),getVz()); + } + public double getVx() { + return getDoubleVal(GBLDOUBLE.VX); + } + public double getVy() { + return getDoubleVal(GBLDOUBLE.VY); + } + public double getVz() { + return getDoubleVal(GBLDOUBLE.VZ); + } + + /** + * Set and get w vector for this strip sensor + */ + + public void setW(Hep3Vector v) { + bank_double[GBLDOUBLE.WX] = v.x(); + bank_double[GBLDOUBLE.WY] = v.y(); + bank_double[GBLDOUBLE.WZ] = v.z(); + } + public Hep3Vector getW() { + return new BasicHep3Vector(getWx(),getWy(),getWz()); + } + public double getWx() { + return getDoubleVal(GBLDOUBLE.WX); + } + public double getWy() { + return getDoubleVal(GBLDOUBLE.WY); + } + public double getWz() { + return getDoubleVal(GBLDOUBLE.WZ); + } + + /** + * Set track direction at this cluster + * + * @param tDir + */ + public void setTrackDir(Hep3Vector v) { + bank_double[GBLDOUBLE.TDIRX] = v.x(); + bank_double[GBLDOUBLE.TDIRY] = v.y(); + bank_double[GBLDOUBLE.TDIRZ] = v.z(); + } + public Hep3Vector getTrackDirection() { + return new BasicHep3Vector(getTx(),getTy(),getTz()); + } + public double getTx() { + return getDoubleVal(GBLDOUBLE.TDIRX); + } + public double getTy() { + return getDoubleVal(GBLDOUBLE.TDIRY); + } + public double getTz() { + return getDoubleVal(GBLDOUBLE.TDIRZ); + } + + public void setTrackPhi(double phi) { + bank_double[GBLDOUBLE.TPHI] = phi; + } + + public double getTrackPhi() { + return getDoubleVal(GBLDOUBLE.TPHI); + } + + public void setTrackLambda(double lambda) { + bank_double[GBLDOUBLE.TLAMBDA] = lambda; + } + + public double getTrackLambda() { + return getDoubleVal(GBLDOUBLE.TLAMBDA); + } + + + public void setMeas(double umeas) { + bank_double[GBLDOUBLE.UMEAS] = umeas; + } + + public double getMeas() { + return getDoubleVal(GBLDOUBLE.UMEAS); + } + + public void setMeasErr(double x) { + bank_double[GBLDOUBLE.UMEASERR] = x; + } + + public double getMeasErr() { + return getDoubleVal(GBLDOUBLE.UMEASERR); + } + + + /** + * Set track position in local frame + * @param trkpos_meas + */ + public void setTrackPos(Hep3Vector trkpos_meas) { + bank_double[GBLDOUBLE.TPOSU] = trkpos_meas.x(); + bank_double[GBLDOUBLE.TPOSV] = trkpos_meas.y(); + bank_double[GBLDOUBLE.TPOSW] = trkpos_meas.z(); + } + + public Hep3Vector getTrackPos() { + return new BasicHep3Vector(getTrackPosU(),getTrackPosV(),getTrackPosW()); + } + + public double getTrackPosU() { + return getDoubleVal(GBLDOUBLE.TPOSU); + } + + public double getTrackPosV() { + return getDoubleVal(GBLDOUBLE.TPOSV); + } + + public double getTrackPosW() { + return getDoubleVal(GBLDOUBLE.TPOSW); + } + + public void setScatterAngle(double scatAngle) { + bank_double[GBLDOUBLE.MSANGLE] = scatAngle; + } + + public double getScatterAngle() { + return getDoubleVal(GBLDOUBLE.MSANGLE); + } + + /* + * The functions below are all overide from + * @see org.lcsim.event.GenericObject#getNInt() + */ + + public int getNInt() { + return GBLINT.BANK_INT_SIZE; + } + + public int getNFloat() { + return 0; + } + + public int getNDouble() { + return GBLDOUBLE.BANK_DOUBLE_SIZE; + } + + public int getIntVal(int index) { + return bank_int[index]; + } + + public float getFloatVal(int index) { + return 0; + } + + public double getDoubleVal(int index) { + return bank_double[index]; + } + + public boolean isFixedSize() { + return false; + } } Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblData.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblData.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblData.java Wed Mar 9 11:43:24 2016 @@ -69,8 +69,8 @@ nExt = extDer.getColumnDimension(); } int nParMax = 5 + nLocal + nExt; -// theParameters.reserve(nParMax); // have to be sorted -// theDerivatives.reserve(nParMax); +// theParameters.reserve(nParMax); // have to be sorted +// theDerivatives.reserve(nParMax); if (derLocal != null) { for (int i = 0; i < derLocal.getColumnDimension(); ++i) // local derivatives @@ -123,8 +123,8 @@ nExtDer = extDer.getColumnDimension(); } int nParMax = 7 + nExtDer; -// theParameters.reserve(nParMax); // have to be sorted -// theDerivatives.reserve(nParMax); +// theParameters.reserve(nParMax); // have to be sorted +// theDerivatives.reserve(nParMax); if (extDer != null) { for (int i = 0; i < extDer.getColumnDimension(); ++i) // external derivatives @@ -151,14 +151,14 @@ // * \param [in] derivatives Derivatives (vector) // */ //void addDerivatives(const std::vector<unsigned int> &index, -// const std::vector<double> &derivatives) { -// for (unsigned int i = 0; i < derivatives.size(); ++i) // any derivatives -// { -// if (derivatives[i]) { -// theParameters.push_back(index[i]); -// theDerivatives.push_back(derivatives[i]); -// } -// } +// const std::vector<double> &derivatives) { +// for (unsigned int i = 0; i < derivatives.size(); ++i) // any derivatives +// { +// if (derivatives[i]) { +// theParameters.push_back(index[i]); +// theDerivatives.push_back(derivatives[i]); +// } +// } //} /// Calculate prediction for data from fit (by GblTrajectory::fit). void setPrediction(VVector aVector) @@ -176,27 +176,27 @@ // */ //double setDownWeighting(unsigned int aMethod) { // -// double aWeight = 1.; -// double scaledResidual = fabs(theValue - thePrediction) * sqrt(thePrecision); -// if (aMethod == 1) // Tukey -// { -// if (scaledResidual < 4.6851) { -// aWeight = (1.0 - 0.045558 * scaledResidual * scaledResidual); -// aWeight *= aWeight; -// } else { -// aWeight = 0.; -// } -// } else if (aMethod == 2) //Huber -// { -// if (scaledResidual >= 1.345) { -// aWeight = 1.345 / scaledResidual; -// } -// } else if (aMethod == 3) //Cauchy -// { -// aWeight = 1.0 / (1.0 + (scaledResidual * scaledResidual / 5.6877)); -// } -// theDownWeight = aWeight; -// return aWeight; +// double aWeight = 1.; +// double scaledResidual = fabs(theValue - thePrediction) * sqrt(thePrecision); +// if (aMethod == 1) // Tukey +// { +// if (scaledResidual < 4.6851) { +// aWeight = (1.0 - 0.045558 * scaledResidual * scaledResidual); +// aWeight *= aWeight; +// } else { +// aWeight = 0.; +// } +// } else if (aMethod == 2) //Huber +// { +// if (scaledResidual >= 1.345) { +// aWeight = 1.345 / scaledResidual; +// } +// } else if (aMethod == 3) //Cauchy +// { +// aWeight = 1.0 / (1.0 + (scaledResidual * scaledResidual / 5.6877)); +// } +// theDownWeight = aWeight; +// return aWeight; //} // /// Calculate Chi2 contribution. Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblPoint.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblPoint.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblPoint.java Wed Mar 9 11:43:24 2016 @@ -486,7 +486,7 @@ { int ifail = 0; // to optimize: need only two last rows of inverse -// prevJacobian = aJac.InverseFast(ifail); +// prevJacobian = aJac.InverseFast(ifail); // block matrix algebra Matrix CA = aJac.sub(2, 3, 3, 0).times(aJac.sub(3, 0, 0).inverse()); // C*A^-1 Matrix DCAB = aJac.sub(2, 3, 3).minus(CA.times(aJac.sub(3, 2, 0, 3))); // D - C*A^-1 *B @@ -531,14 +531,14 @@ } matW.placeAt(matWt.inverse(), 0, 0); -// if (!matW.InvertFast()) { -// std::cout << " getDerivatives failed to invert matrix: " -// << matW << "\n"; -// std::cout -// << " Possible reason for singular matrix: multiple GblPoints at same arc-length" -// << "\n"; -// throw std::overflow_error("Singular matrix inversion exception"); -// } +// if (!matW.InvertFast()) { +// std::cout << " getDerivatives failed to invert matrix: " +// << matW << "\n"; +// std::cout +// << " Possible reason for singular matrix: multiple GblPoints at same arc-length" +// << "\n"; +// throw std::overflow_error("Singular matrix inversion exception"); +// } matWJ.placeAt(matW.times(matJ), 0, 0); vecWd.placeAt(matW.times(vecd), 0, 0); Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblTrajectory.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblTrajectory.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblTrajectory.java Wed Mar 9 11:43:24 2016 @@ -268,7 +268,7 @@ List<GblPoint> list = thePoints.get(iTraj); int size = list.size(); // first point is offset - list.get(0).setOffset(numOffsets++); // intermediate scatterers are offsets + list.get(0).setOffset(numOffsets++); // intermediate scatterers are offsets for (int i = 1; i < size - 1; ++i) { GblPoint p = list.get(i); if (p.hasScatterer()) { @@ -434,7 +434,7 @@ aPoint.getDerivatives(0, prevW, prevWJ, prevWd); // W-, W- * J-, W- * d- aPoint.getDerivatives(1, nextW, nextWJ, nextWd); // W-, W- * J-, W- * d- Matrix sumWJ = prevWJ.plus(nextWJ); -//? matN = sumWJ.inverse(ierr); // N = (W- * J- + W+ * J+)^-1 +//? matN = sumWJ.inverse(ierr); // N = (W- * J- + W+ * J+)^-1 // derivatives for u_int Matrix prevNW = matN.times(prevW); // N * W- Matrix nextNW = matN.times(nextW); // N * W+ Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblUtils.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblUtils.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblUtils.java Wed Mar 9 11:43:24 2016 @@ -234,7 +234,7 @@ /* Simple jacobian: quadratic in arc length difference. using lambda phi as directions - + @param ds: arc length difference @type ds: float @param cosl: cos(lambda) Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/HpsGblRefitter.java Wed Mar 9 11:43:24 2016 @@ -341,11 +341,11 @@ // measurement/residual in the measurement system // only 1D measurement in u-direction, set strip measurement direction to zero Vector meas = new Vector(2); -// double uRes = strip->GetUmeas() - strip->GetTrackPos().x(); // how can this be correct? +// double uRes = strip->GetUmeas() - strip->GetTrackPos().x(); // how can this be correct? double uRes = strip.getMeas() - strip.getTrackPos().x(); meas.set(0, uRes); meas.set(1, 0.); -// //meas[0][0] += deltaU[iLayer] # misalignment +// //meas[0][0] += deltaU[iLayer] # misalignment Vector measErr = new Vector(2); measErr.set(0, strip.getMeasErr()); measErr.set(1, 0.); Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/TruthResiduals.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/TruthResiduals.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/TruthResiduals.java Wed Mar 9 11:43:24 2016 @@ -73,14 +73,14 @@ Map<Integer, List<SimTrackerHit>> simHitsLayerMap = new HashMap<Integer, List<SimTrackerHit> >(); Map<MCParticle, List<SimTrackerHit> > mcPartSimHitsMap = new HashMap<MCParticle, List<SimTrackerHit > >(); for(SimTrackerHit sh : simTrackerHits) { - Hep3Vector shpos = CoordinateTransformations.transformVectorToTracking(sh.getPositionVec()); - if(Math.abs(shpos.x()) < 50.0) { - System.out.printf("%s: Weird hit at %s (%s) in layer %d for MC part %d org %s p %s\n", + Hep3Vector shpos = CoordinateTransformations.transformVectorToTracking(sh.getPositionVec()); + if(Math.abs(shpos.x()) < 50.0) { + System.out.printf("%s: Weird hit at %s (%s) in layer %d for MC part %d org %s p %s\n", this.getClass().getSimpleName(),sh.getPositionVec().toString(),shpos.toString(),sh.getIdentifierFieldValue("layer"), sh.getMCParticle().getPDGID(),sh.getMCParticle().getOrigin().toString(),sh.getMCParticle().getMomentum().toString()); - System.exit(1); - } - + System.exit(1); + } + int layer = sh.getIdentifierFieldValue("layer"); if(!simHitsLayerMap.containsKey(layer)) { simHitsLayerMap.put(layer, new ArrayList<SimTrackerHit>()); @@ -96,28 +96,28 @@ for(MCParticle mcp : mcPartSimHitsMap.keySet()) { - this.h_mcp_org.fill(mcp.getOriginX(), mcp.getOriginY()); + this.h_mcp_org.fill(mcp.getOriginX(), mcp.getOriginY()); } // Find the particle responsible for the hit in each layer and compute the residual for(int layer=1;layer<13;++layer) { - //System.out.printf("layer %d: \n",layer); + //System.out.printf("layer %d: \n",layer); List<SimTrackerHit> simHitsLayer = simHitsLayerMap.get(layer); - + if(simHitsLayer != null ) { - - if(simHitsLayer.size()==2) continue; - + + if(simHitsLayer.size()==2) continue; + for(SimTrackerHit simHit : simHitsLayer) { - - // Find the MC particle + + // Find the MC particle MCParticle mcp = simHit.getMCParticle(); if(mcp.getMomentum().magnitude()<0.5) continue; - + // Position in tracking coord Hep3Vector simHitPosTracking = CoordinateTransformations.transformVectorToTracking(simHit.getPositionVec()); @@ -171,24 +171,24 @@ } if(layer == 1 && res.y() > 0.1 && this.firstWeirdTrack) { - double dx = 1.0; - double xpos = mcp.getOriginZ(); - while(xpos< 100.) { - xpos += dx; - trkposExtraPolator = CoordinateTransformations.transformVectorToTracking(TrackUtils.extrapolateTrack(htfTruth,xpos)); - double ypos = trkposExtraPolator.y(); - trkpos_y_vs_x.fill(xpos,ypos); - } - - int idummy = 0; - while(idummy<2) { - trkpos_y_vs_x.fill(simHitPosTracking.x(),simHitPosTracking.y()); - idummy++; - //System.out.printf("weird simhit res pos %s \n", simHitPosTracking.toString()); - } - - this.firstWeirdTrack = false; - + double dx = 1.0; + double xpos = mcp.getOriginZ(); + while(xpos< 100.) { + xpos += dx; + trkposExtraPolator = CoordinateTransformations.transformVectorToTracking(TrackUtils.extrapolateTrack(htfTruth,xpos)); + double ypos = trkposExtraPolator.y(); + trkpos_y_vs_x.fill(xpos,ypos); + } + + int idummy = 0; + while(idummy<2) { + trkpos_y_vs_x.fill(simHitPosTracking.x(),simHitPosTracking.y()); + idummy++; + //System.out.printf("weird simhit res pos %s \n", simHitPosTracking.toString()); + } + + this.firstWeirdTrack = false; + } @@ -200,12 +200,12 @@ public IHistogram getResidual(int layer,String coord) { - if( !this.res_truthsimhit.containsKey(layer) ) - throw new RuntimeException("Error the layer number is not valid"); - if( coord!="x" || coord!="y") - throw new RuntimeException("Error the coord is not valid"); - IHistogram1D h = this.res_truthsimhit.get(layer).get(coord=="x"?0:1); - return h; + if( !this.res_truthsimhit.containsKey(layer) ) + throw new RuntimeException("Error the layer number is not valid"); + if( coord!="x" || coord!="y") + throw new RuntimeException("Error the coord is not valid"); + IHistogram1D h = this.res_truthsimhit.get(layer).get(coord=="x"?0:1); + return h; } Modified: java/trunk/tracking/src/main/java/org/hps/svt/alignment/BuildCompact.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/svt/alignment/BuildCompact.java (original) +++ java/trunk/tracking/src/main/java/org/hps/svt/alignment/BuildCompact.java Wed Mar 9 11:43:24 2016 @@ -49,361 +49,361 @@ * Class building a new compact.xml detector based on MillepedeII input * corrections. * - * @author Per Ola Hansson Adrian <[log in to unmask]> - * @date January 15, 2014 + * @author Per Ola Hansson Adrian <[log in to unmask]> + * @date January 15, 2014 */ public class BuildCompact { - private static int runNumber = -1; //1351; - private static String detectorName = ""; //"HPS-TestRun-v7"; - private static ConditionsManager conditionsManager = null; - - private static Options createCmdLineOpts() { - Options options = new Options(); - options.addOption(new Option("c",true,"The path to the compact xml file.")); - options.addOption(new Option("o",true,"The name of the new compact xml file.")); - options.addOption(new Option("d",true,"Detector name.")); - options.addOption(new Option("r",true,"Run number.")); - - return options; - } - - private static void printHelpAndExit(Options options) { - HelpFormatter help = new HelpFormatter(); - help.printHelp(" ", options); - System.exit(1); - } - - //private static buildDetector() - - - - - - - private static class MilleParameterSet { - private IDetectorElement _det = null; - List<MilleParameter> params = new ArrayList<MilleParameter>(); - public MilleParameterSet(IDetectorElement d) { - setDetector(d); - } - public void setDetector(IDetectorElement d) { - _det = d; - } - public IDetectorElement getDetector() { - return _det; - } - public void add(MilleParameter par) { - params.add(par); - } - public Hep3Vector getLocalTranslation() { - Map<String,Double> m = new HashMap<String,Double>(); - for(MilleParameter p : params) { - if (p.getType() == 1) { - if (p.getDim() == 1) m.put("u", p.getValue()); - else if(p.getDim() == 2) m.put("v", p.getValue()); - else m.put("w", p.getValue()); - } - } - if(m.size() != 3) { - System.out.println("bad trans!!"); - System.exit(1); - } - return new BasicHep3Vector(m.get("u"),m.get("v"),m.get("w")); - - } - public Hep3Vector getLocalRotation() { - Map<String,Double> m = new HashMap<String,Double>(); - for(MilleParameter p : params) { - if (p.getType() == 2) { - if (p.getDim() == 1) m.put("alpha",p.getValue()); - else if(p.getDim() == 2) m.put("beta", p.getValue()); - else m.put("gamma", p.getValue()); - } - } - if(m.size() != 3) { - System.out.println("bad rot!!"); - System.exit(1); - } - return new BasicHep3Vector(m.get("alpha"),m.get("beta"),m.get("gamma")); - } - public Hep3Vector getGlobalTranslation() { - ITransform3D localToGlobal = getLocalToGlobal(); - return localToGlobal.getRotation().rotated(getLocalTranslation()); - } - public double getGlobalTranslation(int d) { - return getGlobalTranslation().v()[d-1]; - } - public Hep3Vector getGlobalRotation() { - ITransform3D localToGlobal = getLocalToGlobal(); - return localToGlobal.getRotation().rotated(getLocalRotation()); - } - public double getGlobalRotation(int d) { - return getGlobalRotation().v()[d-1]; - } - public ITransform3D getLocalToGlobal() { - ITransform3D localToGlobal = ( (SiSensor) _det).getReadoutElectrodes(ChargeCarrier.HOLE).getLocalToGlobal(); - return localToGlobal; - } - - } - - public static void main(String[] args) { - - // Setup command line input - Options options = createCmdLineOpts(); - if (args.length == 0) { - printHelpAndExit(options); - } - - CommandLineParser parser = new PosixParser(); - CommandLine cl = null; - try { - cl = parser.parse(options, args); - } catch (ParseException e) { - throw new RuntimeException("Problem parsing command line options.",e); - } - - String compactFilename = null; - if(cl.hasOption("c")) { - compactFilename = cl.getOptionValue("c"); - } else { - printHelpAndExit(options); - } - - if(cl.hasOption("d")) { - detectorName = cl.getOptionValue("d"); - } else { - printHelpAndExit(options); - } - - if(cl.hasOption("r")) { - runNumber = Integer.parseInt(cl.getOptionValue("r")); - } else { - printHelpAndExit(options); - } - - String compactFilenameNew = "compact_new.xml"; - if(cl.hasOption("o")) { - compactFilenameNew = cl.getOptionValue("o"); - } - - - - File compactFile = new File(compactFilename); - - // read XML - SAXBuilder builder = new SAXBuilder(); - Document compact_document = null; - try { - compact_document = (Document) builder.build(compactFile); - } catch (JDOMException | IOException e1) { - throw new RuntimeException("problem with JDOM ", e1); - } - - // read detector geometry - FileInputStream inCompact; - try { - inCompact = new FileInputStream(compactFile); - } catch (FileNotFoundException e) { - throw new RuntimeException("cannot open compact file",e); - } - - GeometryReader reader = new GeometryReader(); - Detector det; - try { - det = reader.read(inCompact); - } catch (IOException | JDOMException | ElementCreationException e) { - throw new RuntimeException("problem reading compact file",e); - } - - - // set conditions in order to be able to determine which sensors are where in the geometry - setConditions(detectorName,runNumber); - - // Loop over all millepede input files and match parameters with detectors - - List<MilleParameterSet> list_det = new ArrayList<MilleParameterSet>(); - - FileInputStream inMille = null; - BufferedReader brMille = null; - try { - for(String milleFilename : cl.getArgs()) { - inMille = new FileInputStream(milleFilename); - brMille = new BufferedReader(new InputStreamReader(inMille)); - String line; - while((line = brMille.readLine()) != null) { - //System.out.printf("%s\n",line); - if(!line.contains("Parameter") && !line.contains("!")) { - - MilleParameter par = new MilleParameter(line); - //System.out.println(par.getXMLName() + " " + par.getValue()); - - SiSensor detEle = getTrackerDetElement( det, par); - if(detEle == null) { - System.out.println("Couldn't find detector for param " + par.getId()); - System.exit(1); - } - System.out.println("Found detector " + detEle.getName()); - if(detEle.getClass().isInstance(SiSensor.class)) { - System.out.println("yeah"); - } - - // do we have it already? - MilleParameterSet useSet = null; - for(MilleParameterSet set : list_det) { - if(set.getDetector() == detEle) { - useSet = set; - } - } - - if (useSet == null) { - useSet = new MilleParameterSet(detEle); - list_det.add(useSet); - } - - //add the parameter - useSet.add(par); - - - } - } - brMille.close(); - } - } - catch (IOException e) { - throw new RuntimeException("problem reading mille file",e); - } - - for(MilleParameterSet set : list_det) { - System.out.println("Detector " + set.getDetector().getName()); - List<MilleParameter> pars = set.params; - for(MilleParameter p : pars) { - System.out.println(p.getXMLName() + " " + p.getValue()); - Element node = findXMLNode(compact_document,p.getXMLName()); - double value = 0.0; - if(p.getType() == 1){ - value = set.getGlobalTranslation(p.getDim()); - } else if(p.getType() == 2){ - value = set.getGlobalRotation(p.getDim()); - } else { - System.out.println("This type is illdefnied " + p.getType()); - System.exit(1); - } - node.setAttribute("value", String.format("%.6f",value)); - } - Hep3Vector u = getMeasuredCoordinate( (SiSensor )set.getDetector()); - System.out.println("u " + u.toString()); - System.out.println("t (local) " + set.getLocalTranslation().toString()); - System.out.println("t (global) " + set.getGlobalTranslation().toString()); - System.out.println("r (local) " + set.getLocalRotation().toString()); - System.out.println("r (global) " + set.getGlobalRotation().toString()); - - - } - - // Save new XML file - - XMLOutputter xmlOutput = new XMLOutputter(); - // display nice - //xmlOutput.setFormat(Format.getPrettyFormat()); - try { - xmlOutput.output(compact_document, new FileWriter(compactFilenameNew)); - } catch (IOException e) { - throw new RuntimeException("problem with xml output",e); - } - - - - - - } - - private static Element findXMLNode(Document document, String name) { - Element rootNode = document.getRootElement(); - List list = rootNode.getChildren("define"); - for(int i = 0; i < list.size(); ++i ) { - Element node = (Element) list.get(i); - List llist = node.getChildren("constant"); - //System.out.println("length of list " + llist.size()); - for(int ii = 0; ii < llist.size(); ++ii ) { - Element nnode = (Element) llist.get(ii); - //System.out.println("node name " + nnode.getAttributeValue("name") + " " + nnode.getAttributeValue("value") ); - //if(nnode.getAttributeValue("name").contains(name)) { - if(nnode.getAttributeValue("name").compareTo(name) ==0 ) { - return nnode; - } - } - } - - return null; - } - - private static void setConditions(String detectorName, int run) { - - try { - if(conditionsManager == null) { - conditionsManager = ConditionsManager.defaultInstance(); - } - conditionsManager.setDetector(detectorName, run); - - } catch (ConditionsNotFoundException e1) { - throw new RuntimeException("problem setting conditions",e1); - } - - } - - private static SiSensor getTrackerDetElement(Detector det, MilleParameter par) { - List<SiSensor> sensors = det.getSubdetector("Tracker").getDetectorElement().findDescendants(SiSensor.class); + private static int runNumber = -1; //1351; + private static String detectorName = ""; //"HPS-TestRun-v7"; + private static ConditionsManager conditionsManager = null; + + private static Options createCmdLineOpts() { + Options options = new Options(); + options.addOption(new Option("c",true,"The path to the compact xml file.")); + options.addOption(new Option("o",true,"The name of the new compact xml file.")); + options.addOption(new Option("d",true,"Detector name.")); + options.addOption(new Option("r",true,"Run number.")); + + return options; + } + + private static void printHelpAndExit(Options options) { + HelpFormatter help = new HelpFormatter(); + help.printHelp(" ", options); + System.exit(1); + } + + //private static buildDetector() + + + + + + + private static class MilleParameterSet { + private IDetectorElement _det = null; + List<MilleParameter> params = new ArrayList<MilleParameter>(); + public MilleParameterSet(IDetectorElement d) { + setDetector(d); + } + public void setDetector(IDetectorElement d) { + _det = d; + } + public IDetectorElement getDetector() { + return _det; + } + public void add(MilleParameter par) { + params.add(par); + } + public Hep3Vector getLocalTranslation() { + Map<String,Double> m = new HashMap<String,Double>(); + for(MilleParameter p : params) { + if (p.getType() == 1) { + if (p.getDim() == 1) m.put("u", p.getValue()); + else if(p.getDim() == 2) m.put("v", p.getValue()); + else m.put("w", p.getValue()); + } + } + if(m.size() != 3) { + System.out.println("bad trans!!"); + System.exit(1); + } + return new BasicHep3Vector(m.get("u"),m.get("v"),m.get("w")); + + } + public Hep3Vector getLocalRotation() { + Map<String,Double> m = new HashMap<String,Double>(); + for(MilleParameter p : params) { + if (p.getType() == 2) { + if (p.getDim() == 1) m.put("alpha",p.getValue()); + else if(p.getDim() == 2) m.put("beta", p.getValue()); + else m.put("gamma", p.getValue()); + } + } + if(m.size() != 3) { + System.out.println("bad rot!!"); + System.exit(1); + } + return new BasicHep3Vector(m.get("alpha"),m.get("beta"),m.get("gamma")); + } + public Hep3Vector getGlobalTranslation() { + ITransform3D localToGlobal = getLocalToGlobal(); + return localToGlobal.getRotation().rotated(getLocalTranslation()); + } + public double getGlobalTranslation(int d) { + return getGlobalTranslation().v()[d-1]; + } + public Hep3Vector getGlobalRotation() { + ITransform3D localToGlobal = getLocalToGlobal(); + return localToGlobal.getRotation().rotated(getLocalRotation()); + } + public double getGlobalRotation(int d) { + return getGlobalRotation().v()[d-1]; + } + public ITransform3D getLocalToGlobal() { + ITransform3D localToGlobal = ( (SiSensor) _det).getReadoutElectrodes(ChargeCarrier.HOLE).getLocalToGlobal(); + return localToGlobal; + } + + } + + public static void main(String[] args) { + + // Setup command line input + Options options = createCmdLineOpts(); + if (args.length == 0) { + printHelpAndExit(options); + } + + CommandLineParser parser = new PosixParser(); + CommandLine cl = null; + try { + cl = parser.parse(options, args); + } catch (ParseException e) { + throw new RuntimeException("Problem parsing command line options.",e); + } + + String compactFilename = null; + if(cl.hasOption("c")) { + compactFilename = cl.getOptionValue("c"); + } else { + printHelpAndExit(options); + } + + if(cl.hasOption("d")) { + detectorName = cl.getOptionValue("d"); + } else { + printHelpAndExit(options); + } + + if(cl.hasOption("r")) { + runNumber = Integer.parseInt(cl.getOptionValue("r")); + } else { + printHelpAndExit(options); + } + + String compactFilenameNew = "compact_new.xml"; + if(cl.hasOption("o")) { + compactFilenameNew = cl.getOptionValue("o"); + } + + + + File compactFile = new File(compactFilename); + + // read XML + SAXBuilder builder = new SAXBuilder(); + Document compact_document = null; + try { + compact_document = (Document) builder.build(compactFile); + } catch (JDOMException | IOException e1) { + throw new RuntimeException("problem with JDOM ", e1); + } + + // read detector geometry + FileInputStream inCompact; + try { + inCompact = new FileInputStream(compactFile); + } catch (FileNotFoundException e) { + throw new RuntimeException("cannot open compact file",e); + } + + GeometryReader reader = new GeometryReader(); + Detector det; + try { + det = reader.read(inCompact); + } catch (IOException | JDOMException | ElementCreationException e) { + throw new RuntimeException("problem reading compact file",e); + } + + + // set conditions in order to be able to determine which sensors are where in the geometry + setConditions(detectorName,runNumber); + + // Loop over all millepede input files and match parameters with detectors + + List<MilleParameterSet> list_det = new ArrayList<MilleParameterSet>(); + + FileInputStream inMille = null; + BufferedReader brMille = null; + try { + for(String milleFilename : cl.getArgs()) { + inMille = new FileInputStream(milleFilename); + brMille = new BufferedReader(new InputStreamReader(inMille)); + String line; + while((line = brMille.readLine()) != null) { + //System.out.printf("%s\n",line); + if(!line.contains("Parameter") && !line.contains("!")) { + + MilleParameter par = new MilleParameter(line); + //System.out.println(par.getXMLName() + " " + par.getValue()); + + SiSensor detEle = getTrackerDetElement( det, par); + if(detEle == null) { + System.out.println("Couldn't find detector for param " + par.getId()); + System.exit(1); + } + System.out.println("Found detector " + detEle.getName()); + if(detEle.getClass().isInstance(SiSensor.class)) { + System.out.println("yeah"); + } + + // do we have it already? + MilleParameterSet useSet = null; + for(MilleParameterSet set : list_det) { + if(set.getDetector() == detEle) { + useSet = set; + } + } + + if (useSet == null) { + useSet = new MilleParameterSet(detEle); + list_det.add(useSet); + } + + //add the parameter + useSet.add(par); + + + } + } + brMille.close(); + } + } + catch (IOException e) { + throw new RuntimeException("problem reading mille file",e); + } + + for(MilleParameterSet set : list_det) { + System.out.println("Detector " + set.getDetector().getName()); + List<MilleParameter> pars = set.params; + for(MilleParameter p : pars) { + System.out.println(p.getXMLName() + " " + p.getValue()); + Element node = findXMLNode(compact_document,p.getXMLName()); + double value = 0.0; + if(p.getType() == 1){ + value = set.getGlobalTranslation(p.getDim()); + } else if(p.getType() == 2){ + value = set.getGlobalRotation(p.getDim()); + } else { + System.out.println("This type is illdefnied " + p.getType()); + System.exit(1); + } + node.setAttribute("value", String.format("%.6f",value)); + } + Hep3Vector u = getMeasuredCoordinate( (SiSensor )set.getDetector()); + System.out.println("u " + u.toString()); + System.out.println("t (local) " + set.getLocalTranslation().toString()); + System.out.println("t (global) " + set.getGlobalTranslation().toString()); + System.out.println("r (local) " + set.getLocalRotation().toString()); + System.out.println("r (global) " + set.getGlobalRotation().toString()); + + + } + + // Save new XML file + + XMLOutputter xmlOutput = new XMLOutputter(); + // display nice + //xmlOutput.setFormat(Format.getPrettyFormat()); + try { + xmlOutput.output(compact_document, new FileWriter(compactFilenameNew)); + } catch (IOException e) { + throw new RuntimeException("problem with xml output",e); + } + + + + + + } + + private static Element findXMLNode(Document document, String name) { + Element rootNode = document.getRootElement(); + List list = rootNode.getChildren("define"); + for(int i = 0; i < list.size(); ++i ) { + Element node = (Element) list.get(i); + List llist = node.getChildren("constant"); + //System.out.println("length of list " + llist.size()); + for(int ii = 0; ii < llist.size(); ++ii ) { + Element nnode = (Element) llist.get(ii); + //System.out.println("node name " + nnode.getAttributeValue("name") + " " + nnode.getAttributeValue("value") ); + //if(nnode.getAttributeValue("name").contains(name)) { + if(nnode.getAttributeValue("name").compareTo(name) ==0 ) { + return nnode; + } + } + } + + return null; + } + + private static void setConditions(String detectorName, int run) { + + try { + if(conditionsManager == null) { + conditionsManager = ConditionsManager.defaultInstance(); + } + conditionsManager.setDetector(detectorName, run); + + } catch (ConditionsNotFoundException e1) { + throw new RuntimeException("problem setting conditions",e1); + } + + } + + private static SiSensor getTrackerDetElement(Detector det, MilleParameter par) { + List<SiSensor> sensors = det.getSubdetector("Tracker").getDetectorElement().findDescendants(SiSensor.class); //List<SiTrackerModule> modules = det.getDetectorElement().findDescendants(SiTrackerModule.class); //System.out.printf("%d sensors\n",sensors.size()); for (SiSensor module: sensors) { // Create DAQ Maps - boolean isTop = ((HpsSiSensor) module).isTopLayer(); - int h = par.getHalf(); - if ((isTop && h == 1) || (!isTop && h == 2)) { - int layer = ((HpsSiSensor) module).getLayerNumber(); - if (layer == par.getSensor()) { - //found match - return module; - } - } + boolean isTop = ((HpsSiSensor) module).isTopLayer(); + int h = par.getHalf(); + if ((isTop && h == 1) || (!isTop && h == 2)) { + int layer = ((HpsSiSensor) module).getLayerNumber(); + if (layer == par.getSensor()) { + //found match + return module; + } + } } return null; - - } - - - - private static class DetectorList<K> extends ArrayList<DetAlignConstants> { - //List<DetAlignConstants> _detectors = new ArrayList<DetAlignConstants>(); - public DetectorList() { - } - - public boolean contains(IDetectorElement detEle) { - return this.get(detEle) == null ? false : true; - } - - public DetAlignConstants get(IDetectorElement detEle) { - for(DetAlignConstants d : this) { - if (d == detEle) { - return d; - } - } - return null; - } - public void print() { - System.out.println("==== " + this.size() + " detectors has alignment corrections ===="); - for(DetAlignConstants det : this) { - det.print(); - } - } - - } - - - - private static Hep3Vector getTrackingMeasuredCoordinate(SiSensor sensor) + + } + + + + private static class DetectorList<K> extends ArrayList<DetAlignConstants> { + //List<DetAlignConstants> _detectors = new ArrayList<DetAlignConstants>(); + public DetectorList() { + } + + public boolean contains(IDetectorElement detEle) { + return this.get(detEle) == null ? false : true; + } + + public DetAlignConstants get(IDetectorElement detEle) { + for(DetAlignConstants d : this) { + if (d == detEle) { + return d; + } + } + return null; + } + public void print() { + System.out.println("==== " + this.size() + " detectors has alignment corrections ===="); + for(DetAlignConstants det : this) { + det.print(); + } + } + + } + + + + private static Hep3Vector getTrackingMeasuredCoordinate(SiSensor sensor) { // p-side unit vector ITransform3D electrodes_to_global = sensor.getReadoutElectrodes(ChargeCarrier.HOLE).getLocalToGlobal(); @@ -411,8 +411,8 @@ measuredCoordinate = VecOp.mult(VecOp.mult(CoordinateTransformations.getMatrix(),electrodes_to_global.getRotation().getRotationMatrix()), measuredCoordinate); return measuredCoordinate; } - - private static Hep3Vector getMeasuredCoordinate(SiSensor sensor) + + private static Hep3Vector getMeasuredCoordinate(SiSensor sensor) { // p-side unit vector ITransform3D electrodes_to_global = sensor.getReadoutElectrodes(ChargeCarrier.HOLE).getLocalToGlobal(); @@ -420,127 +420,127 @@ measuredCoordinate = VecOp.mult(electrodes_to_global.getRotation().getRotationMatrix(), measuredCoordinate); return measuredCoordinate; } - - - - private static class SiSensorDetAlignConstants extends DetAlignConstants { - public SiSensorDetAlignConstants(IDetectorElement det) { - super(det); - } - public void transform() { - ITransform3D localToGlobal = null; - if(_det.getClass().isInstance(SiSensor.class)) { - localToGlobal = ( (SiSensor) _det).getReadoutElectrodes(ChargeCarrier.HOLE).getLocalToGlobal(); - } - //Translation - Hep3Vector t_local = _constants.getTranslationVector(); - Hep3Vector t_global = localToGlobal.getRotation().rotated(t_local); - _constants.addGlobalTranslation(t_global); - //Rotation - Hep3Vector r_local = _constants.getRotationVector(); - Hep3Vector r_global = localToGlobal.getRotation().rotated(r_local); - _constants.addGlobalRotation(r_global); - } - - } - - private static abstract class DetAlignConstants { - protected IDetectorElement _det = null; - protected AlignConstants<String,Double> _constants = new AlignConstants<String,Double>(); - public DetAlignConstants(IDetectorElement det) { - _det = det; - } - public abstract void transform(); - public void add(MilleParameter par) { - this._constants.add(par); - } - public void print() { - System.out.println(_det.getName()); - for(Entry<String, Double> c : this._constants.entrySet()) { - System.out.println(c.getKey() + " " + c.getValue()); - } - System.out.println("Local translation " + _constants.getTranslationVector().toString()); - System.out.println("Global translation " + _constants.getTranslationVectorGlobal().toString()); - System.out.println("Local rotation " + _constants.getRotationVector().toString()); - System.out.println("Global rotation " + _constants.getRotationVectorGlobal().toString()); - - - } - - - } - - - - private static class AlignConstants<K,V> extends HashMap<String,Double> { - List<MilleParameter> _pars = new ArrayList<MilleParameter>(); - public AlignConstants() { - super(); - } - public void add(MilleParameter p) { - _pars.add(p); - if (p.getType() == 1) { - if (p.getDim() == 1) this.put("u", p.getValue()); - else if(p.getDim() == 2) this.put("v", p.getValue()); - else this.put("w", p.getValue()); - } - else { - if (p.getDim() == 1) this.put("alpha", p.getValue()); - else if(p.getDim() == 2) this.put("beta", p.getValue()); - else this.put("gamma", p.getValue()); - } - } - public void print() { - for(Entry<String,Double> e : this.entrySet()) { - System.out.println(e.getKey() + " " + e.getValue()); - } - } - public Hep3Vector getTranslationVector() { - if(!this.containsKey("u") || !this.containsKey("v") || !this.containsKey("w")) { - System.out.println("missing pars for translation"); - print(); - System.exit(1); - } - return new BasicHep3Vector(this.get("u"),this.get("v"),this.get("w")); - } - public Hep3Vector getTranslationVectorGlobal() { - if(!this.containsKey("x") || !this.containsKey("y") || !this.containsKey("z")) { - System.out.println("missing pars for global translation"); - print(); - System.exit(1); - } - return new BasicHep3Vector(this.get("x"),this.get("y"),this.get("z")); - } - public Hep3Vector getRotationVector() { - if(!this.containsKey("alpha") || !this.containsKey("beta") || !this.containsKey("gamma")) { - System.out.println("missing pars for rotation"); - print(); - System.exit(1); - } - return new BasicHep3Vector(this.get("alpha"),this.get("beta"),this.get("gamma")); - } - public Hep3Vector getRotationVectorGlobal() { - if(!this.containsKey("rx") || !this.containsKey("ry") || !this.containsKey("rz")) { - System.out.println("missing pars for global rotation"); - print(); - System.exit(1); - } - return new BasicHep3Vector(this.get("rx"),this.get("ry"),this.get("rz")); - } - private void addGlobalTranslation(Hep3Vector t) { - this.put("x", t.x()); - this.put("y", t.y()); - this.put("z", t.z()); - } - private void addGlobalRotation(Hep3Vector t) { - this.put("rx", t.x()); - this.put("ry", t.y()); - this.put("rz", t.z()); - } - - - } - - + + + + private static class SiSensorDetAlignConstants extends DetAlignConstants { + public SiSensorDetAlignConstants(IDetectorElement det) { + super(det); + } + public void transform() { + ITransform3D localToGlobal = null; + if(_det.getClass().isInstance(SiSensor.class)) { + localToGlobal = ( (SiSensor) _det).getReadoutElectrodes(ChargeCarrier.HOLE).getLocalToGlobal(); + } + //Translation + Hep3Vector t_local = _constants.getTranslationVector(); + Hep3Vector t_global = localToGlobal.getRotation().rotated(t_local); + _constants.addGlobalTranslation(t_global); + //Rotation + Hep3Vector r_local = _constants.getRotationVector(); + Hep3Vector r_global = localToGlobal.getRotation().rotated(r_local); + _constants.addGlobalRotation(r_global); + } + + } + + private static abstract class DetAlignConstants { + protected IDetectorElement _det = null; + protected AlignConstants<String,Double> _constants = new AlignConstants<String,Double>(); + public DetAlignConstants(IDetectorElement det) { + _det = det; + } + public abstract void transform(); + public void add(MilleParameter par) { + this._constants.add(par); + } + public void print() { + System.out.println(_det.getName()); + for(Entry<String, Double> c : this._constants.entrySet()) { + System.out.println(c.getKey() + " " + c.getValue()); + } + System.out.println("Local translation " + _constants.getTranslationVector().toString()); + System.out.println("Global translation " + _constants.getTranslationVectorGlobal().toString()); + System.out.println("Local rotation " + _constants.getRotationVector().toString()); + System.out.println("Global rotation " + _constants.getRotationVectorGlobal().toString()); + + + } + + + } + + + + private static class AlignConstants<K,V> extends HashMap<String,Double> { + List<MilleParameter> _pars = new ArrayList<MilleParameter>(); + public AlignConstants() { + super(); + } + public void add(MilleParameter p) { + _pars.add(p); + if (p.getType() == 1) { + if (p.getDim() == 1) this.put("u", p.getValue()); + else if(p.getDim() == 2) this.put("v", p.getValue()); + else this.put("w", p.getValue()); + } + else { + if (p.getDim() == 1) this.put("alpha", p.getValue()); + else if(p.getDim() == 2) this.put("beta", p.getValue()); + else this.put("gamma", p.getValue()); + } + } + public void print() { + for(Entry<String,Double> e : this.entrySet()) { + System.out.println(e.getKey() + " " + e.getValue()); + } + } + public Hep3Vector getTranslationVector() { + if(!this.containsKey("u") || !this.containsKey("v") || !this.containsKey("w")) { + System.out.println("missing pars for translation"); + print(); + System.exit(1); + } + return new BasicHep3Vector(this.get("u"),this.get("v"),this.get("w")); + } + public Hep3Vector getTranslationVectorGlobal() { + if(!this.containsKey("x") || !this.containsKey("y") || !this.containsKey("z")) { + System.out.println("missing pars for global translation"); + print(); + System.exit(1); + } + return new BasicHep3Vector(this.get("x"),this.get("y"),this.get("z")); + } + public Hep3Vector getRotationVector() { + if(!this.containsKey("alpha") || !this.containsKey("beta") || !this.containsKey("gamma")) { + System.out.println("missing pars for rotation"); + print(); + System.exit(1); + } + return new BasicHep3Vector(this.get("alpha"),this.get("beta"),this.get("gamma")); + } + public Hep3Vector getRotationVectorGlobal() { + if(!this.containsKey("rx") || !this.containsKey("ry") || !this.containsKey("rz")) { + System.out.println("missing pars for global rotation"); + print(); + System.exit(1); + } + return new BasicHep3Vector(this.get("rx"),this.get("ry"),this.get("rz")); + } + private void addGlobalTranslation(Hep3Vector t) { + this.put("x", t.x()); + this.put("y", t.y()); + this.put("z", t.z()); + } + private void addGlobalRotation(Hep3Vector t) { + this.put("rx", t.x()); + this.put("ry", t.y()); + this.put("rz", t.z()); + } + + + } + + } Modified: java/trunk/tracking/src/main/java/org/hps/svt/alignment/BuildMillepedeCompact.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/svt/alignment/BuildMillepedeCompact.java (original) +++ java/trunk/tracking/src/main/java/org/hps/svt/alignment/BuildMillepedeCompact.java Wed Mar 9 11:43:24 2016 @@ -52,8 +52,8 @@ public class BuildMillepedeCompact { - private static String detectorName = "Tracker"; - private static boolean replaceConstant = false; + private static String detectorName = "Tracker"; + private static boolean replaceConstant = false; private static boolean calcNewValue = true; private static boolean ignoreBeamspot = true; private static boolean flipRotationCorrection = false; @@ -61,250 +61,250 @@ private static Options createCmdLineOpts() { - Options options = new Options(); - options.addOption(new Option("c",true,"The path to the compact xml file.")); - options.addOption(new Option("o",true,"The name of the new compact xml file.")); - options.addOption(new Option("r", false, "Replace correction instead of adding to it.")); + Options options = new Options(); + options.addOption(new Option("c",true,"The path to the compact xml file.")); + options.addOption(new Option("o",true,"The name of the new compact xml file.")); + options.addOption(new Option("r", false, "Replace correction instead of adding to it.")); options.addOption(new Option("t", false, "Add a text string as a new value instead of adding to it.")); options.addOption(new Option("f",false, "Flip sign of rotation corrections.")); - return options; - } - - private static void printHelpAndExit(Options options) { - HelpFormatter help = new HelpFormatter(); - help.printHelp(" ", options); - System.exit(1); - } - - - public static void main(String[] args) { - - // Setup command line input - Options options = createCmdLineOpts(); - if (args.length == 0) { - printHelpAndExit(options); - } - - CommandLineParser parser = new PosixParser(); - CommandLine cl = null; - try { - cl = parser.parse(options, args); - } catch (ParseException e) { - throw new RuntimeException("Problem parsing command line options.",e); - } - - String compactFilename = null; - if(cl.hasOption("c")) { - compactFilename = cl.getOptionValue("c"); - } else { - printHelpAndExit(options); - } - - String compactFilenameNew = "compact_new.xml"; - if(cl.hasOption("o")) { - compactFilenameNew = cl.getOptionValue("o"); - } - - - - if(cl.hasOption("r")) { - replaceConstant = true; - } - - if(cl.hasOption("t")) { + return options; + } + + private static void printHelpAndExit(Options options) { + HelpFormatter help = new HelpFormatter(); + help.printHelp(" ", options); + System.exit(1); + } + + + public static void main(String[] args) { + + // Setup command line input + Options options = createCmdLineOpts(); + if (args.length == 0) { + printHelpAndExit(options); + } + + CommandLineParser parser = new PosixParser(); + CommandLine cl = null; + try { + cl = parser.parse(options, args); + } catch (ParseException e) { + throw new RuntimeException("Problem parsing command line options.",e); + } + + String compactFilename = null; + if(cl.hasOption("c")) { + compactFilename = cl.getOptionValue("c"); + } else { + printHelpAndExit(options); + } + + String compactFilenameNew = "compact_new.xml"; + if(cl.hasOption("o")) { + compactFilenameNew = cl.getOptionValue("o"); + } + + + + if(cl.hasOption("r")) { + replaceConstant = true; + } + + if(cl.hasOption("t")) { calcNewValue = false; } - if(cl.hasOption("f")) { - flipRotationCorrection = true; - } - - if (calcNewValue) + if(cl.hasOption("f")) { + flipRotationCorrection = true; + } + + if (calcNewValue) System.out.println("DO CALCULATE NEW VALUE"); else System.out.println("DO NOT CALCULATE NEW VALUE"); - - - if (flipRotationCorrection) - System.out.println("DO FLIP ROTATIONS"); - else - System.out.println("DO NOT FLIP ROTATIONS"); - - - - File compactFile = new File(compactFilename); - - // read XML - SAXBuilder builder = new SAXBuilder(); - Document compact_document = null; - try { - compact_document = (Document) builder.build(compactFile); - } catch (JDOMException | IOException e1) { - throw new RuntimeException("problem with JDOM ", e1); - } - - - - // Loop over all millepede input files and build a list of parameters - - List<MilleParameter> params = new ArrayList<MilleParameter>(); - - FileInputStream inMille = null; - BufferedReader brMille = null; - try { - for(String milleFilename : cl.getArgs()) { - inMille = new FileInputStream(milleFilename); - brMille = new BufferedReader(new InputStreamReader(inMille)); - String line; - while((line = brMille.readLine()) != null) { - //System.out.printf("%s\n",line); - if(!line.contains("Parameter") && !line.contains("!")) { - - MilleParameter par = new MilleParameter(line); - //System.out.println(par.getXMLName() + " " + par.getValue()); - - if (ignoreBeamspot) { - if(par.getSensor() == 98 || par.getSensor() == 99) { - System.out.printf("Ignoring %s\n", par.toString()); - continue; - } - } - System.out.printf("Adding %s\n", par.toString()); - //add the parameter - params.add(par); - - } - } - brMille.close(); - } - } - catch (IOException e) { - throw new RuntimeException("problem reading mille file",e); - } - - System.out.printf("Found %d millepede parameters\n ", params.size()); - - - - Element rootNode = compact_document.getRootElement(); - List<Element> detectors = rootNode.getChildren("detectors"); - for(Element detectorsNode : detectors) { - List<Element> detectorNode = detectorsNode.getChildren("detector"); - if(detectorNode!=null) { - System.out.println(detectorNode.size() + " detectors"); - for(Element detector : detectorNode) { - if(detector.getAttribute("name")!=null) { - if(detector.getAttributeValue("name").compareTo(detectorName)==0 ) { - System.out.println("Found " + detectorName); - for(MilleParameter p : params) { - Element node = findMillepedeConstantNode(detector,Integer.toString(p.getId())); - if(node!=null) { + + + if (flipRotationCorrection) + System.out.println("DO FLIP ROTATIONS"); + else + System.out.println("DO NOT FLIP ROTATIONS"); + + + + File compactFile = new File(compactFilename); + + // read XML + SAXBuilder builder = new SAXBuilder(); + Document compact_document = null; + try { + compact_document = (Document) builder.build(compactFile); + } catch (JDOMException | IOException e1) { + throw new RuntimeException("problem with JDOM ", e1); + } + + + + // Loop over all millepede input files and build a list of parameters + + List<MilleParameter> params = new ArrayList<MilleParameter>(); + + FileInputStream inMille = null; + BufferedReader brMille = null; + try { + for(String milleFilename : cl.getArgs()) { + inMille = new FileInputStream(milleFilename); + brMille = new BufferedReader(new InputStreamReader(inMille)); + String line; + while((line = brMille.readLine()) != null) { + //System.out.printf("%s\n",line); + if(!line.contains("Parameter") && !line.contains("!")) { + + MilleParameter par = new MilleParameter(line); + //System.out.println(par.getXMLName() + " " + par.getValue()); + + if (ignoreBeamspot) { + if(par.getSensor() == 98 || par.getSensor() == 99) { + System.out.printf("Ignoring %s\n", par.toString()); + continue; + } + } + System.out.printf("Adding %s\n", par.toString()); + //add the parameter + params.add(par); + + } + } + brMille.close(); + } + } + catch (IOException e) { + throw new RuntimeException("problem reading mille file",e); + } + + System.out.printf("Found %d millepede parameters\n ", params.size()); + + + + Element rootNode = compact_document.getRootElement(); + List<Element> detectors = rootNode.getChildren("detectors"); + for(Element detectorsNode : detectors) { + List<Element> detectorNode = detectorsNode.getChildren("detector"); + if(detectorNode!=null) { + System.out.println(detectorNode.size() + " detectors"); + for(Element detector : detectorNode) { + if(detector.getAttribute("name")!=null) { + if(detector.getAttributeValue("name").compareTo(detectorName)==0 ) { + System.out.println("Found " + detectorName); + for(MilleParameter p : params) { + Element node = findMillepedeConstantNode(detector,Integer.toString(p.getId())); + if(node!=null) { double correction = p.getValue(); - // have the option of adding a text value to the compact instead of actually computing the new value - if(calcNewValue) { - - double oldValue = 0; - try { - oldValue = node.getAttribute("value").getDoubleValue(); - } catch (DataConversionException e) { - e.printStackTrace(); - } - double newValue; - if(replaceConstant) { - newValue = correction; - } else { - if (p.getType() == MilleParameter.Type.ROTATION.getType() && !flipRotationCorrection) { - newValue = oldValue - correction; - System.out.println("NOFLIP"); - } else { - newValue = oldValue + correction; + // have the option of adding a text value to the compact instead of actually computing the new value + if(calcNewValue) { + + double oldValue = 0; + try { + oldValue = node.getAttribute("value").getDoubleValue(); + } catch (DataConversionException e) { + e.printStackTrace(); + } + double newValue; + if(replaceConstant) { + newValue = correction; + } else { + if (p.getType() == MilleParameter.Type.ROTATION.getType() && !flipRotationCorrection) { + newValue = oldValue - correction; + System.out.println("NOFLIP"); + } else { + newValue = oldValue + correction; System.out.println("FLIP"); - } - } - System.out.println("Update " + p.getId() + ": " + oldValue + " (corr. " + correction + ") -> " + newValue ); - node.setAttribute("value", String.format("%.6f",newValue)); - - } else { - - String oldValue = node.getAttribute("value").getValue(); - - if(replaceConstant) - throw new RuntimeException("Doesn't make sense to try and replace with the string option?"); - - if( correction != 0.0) { - String newValue; - - if (p.getType() == MilleParameter.Type.ROTATION.getType() && !flipRotationCorrection) { - newValue = oldValue + " - " + String.format("%.6f",correction); + } + } + System.out.println("Update " + p.getId() + ": " + oldValue + " (corr. " + correction + ") -> " + newValue ); + node.setAttribute("value", String.format("%.6f",newValue)); + + } else { + + String oldValue = node.getAttribute("value").getValue(); + + if(replaceConstant) + throw new RuntimeException("Doesn't make sense to try and replace with the string option?"); + + if( correction != 0.0) { + String newValue; + + if (p.getType() == MilleParameter.Type.ROTATION.getType() && !flipRotationCorrection) { + newValue = oldValue + " - " + String.format("%.6f",correction); System.out.println("NOFLIP"); } else { newValue = oldValue + " + " + String.format("%.6f",correction); System.out.println("FLIP"); } - - System.out.println("Update " + p.getId() + ": " + oldValue + " (corr. " + correction + ") -> " + newValue ); - node.setAttribute("value", newValue); - } - } - - } else { - throw new RuntimeException("no element found for " + p.getId() + " check format of compact file"); - } - } - } - } else { - throw new RuntimeException("this detector node element is not formatted correctly"); - } - } - } else { - throw new RuntimeException("this detector node element is not formatted correctly"); - } - } - - - // Save new XML file - - XMLOutputter xmlOutput = new XMLOutputter(); - // display nice - //xmlOutput.setFormat(Format.getPrettyFormat()); - try { - xmlOutput.output(compact_document, new FileWriter(compactFilenameNew)); - } catch (IOException e) { - throw new RuntimeException("problem with xml output",e); - } - - - - - - } - - - private static Element findMillepedeConstantNode(Element detector, String name) { - Element element_constants = detector.getChild("millepede_constants"); - if(element_constants==null) { - throw new RuntimeException("no alignment constants in this xml file."); - } - List<Element> list = element_constants.getChildren("millepede_constant"); - for(Element element : list) { - if(element.getAttribute("name")!=null) { - if(element.getAttributeValue("name").compareTo(name) == 0) { - return element; - } - } else { - throw new RuntimeException("this element is not formatted correctly"); - } - } - return null; - } - - - - - - + + System.out.println("Update " + p.getId() + ": " + oldValue + " (corr. " + correction + ") -> " + newValue ); + node.setAttribute("value", newValue); + } + } + + } else { + throw new RuntimeException("no element found for " + p.getId() + " check format of compact file"); + } + } + } + } else { + throw new RuntimeException("this detector node element is not formatted correctly"); + } + } + } else { + throw new RuntimeException("this detector node element is not formatted correctly"); + } + } + + + // Save new XML file + + XMLOutputter xmlOutput = new XMLOutputter(); + // display nice + //xmlOutput.setFormat(Format.getPrettyFormat()); + try { + xmlOutput.output(compact_document, new FileWriter(compactFilenameNew)); + } catch (IOException e) { + throw new RuntimeException("problem with xml output",e); + } + + + + + + } + + + private static Element findMillepedeConstantNode(Element detector, String name) { + Element element_constants = detector.getChild("millepede_constants"); + if(element_constants==null) { + throw new RuntimeException("no alignment constants in this xml file."); + } + List<Element> list = element_constants.getChildren("millepede_constant"); + for(Element element : list) { + if(element.getAttribute("name")!=null) { + if(element.getAttributeValue("name").compareTo(name) == 0) { + return element; + } + } else { + throw new RuntimeException("this element is not formatted correctly"); + } + } + return null; + } + + + + + + } Modified: java/trunk/tracking/src/main/java/org/hps/svt/alignment/MillepedeCompactDump.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/svt/alignment/MillepedeCompactDump.java (original) +++ java/trunk/tracking/src/main/java/org/hps/svt/alignment/MillepedeCompactDump.java Wed Mar 9 11:43:24 2016 @@ -28,115 +28,115 @@ public class MillepedeCompactDump { - private static String detectorName = "Tracker"; + private static String detectorName = "Tracker"; private static Options createCmdLineOpts() { - Options options = new Options(); - options.addOption(new Option("c",true,"The path to the compact xml file.")); - options.addOption(new Option("o",true,"The name of the output text file.")); - return options; - } - - private static void printHelpAndExit(Options options) { - HelpFormatter help = new HelpFormatter(); - help.printHelp(" ", options); - System.exit(1); - } - - - public static void main(String[] args) { + Options options = new Options(); + options.addOption(new Option("c",true,"The path to the compact xml file.")); + options.addOption(new Option("o",true,"The name of the output text file.")); + return options; + } + + private static void printHelpAndExit(Options options) { + HelpFormatter help = new HelpFormatter(); + help.printHelp(" ", options); + System.exit(1); + } + + + public static void main(String[] args) { - // Setup command line input - Options options = createCmdLineOpts(); - if (args.length == 0) { - printHelpAndExit(options); - } + // Setup command line input + Options options = createCmdLineOpts(); + if (args.length == 0) { + printHelpAndExit(options); + } - CommandLineParser parser = new PosixParser(); - CommandLine cl = null; - try { - cl = parser.parse(options, args); - } catch (ParseException e) { - throw new RuntimeException("Problem parsing command line options.",e); - } - - String compactFilename = null; - if(cl.hasOption("c")) { - compactFilename = cl.getOptionValue("c"); - } else { - printHelpAndExit(options); - } - - String outputFilename = "millepede_dump.txt";// + compactFilename.replace(".xml", ".txt"); - if(cl.hasOption("o")) { - outputFilename = cl.getOptionValue("o"); - } - + CommandLineParser parser = new PosixParser(); + CommandLine cl = null; + try { + cl = parser.parse(options, args); + } catch (ParseException e) { + throw new RuntimeException("Problem parsing command line options.",e); + } + + String compactFilename = null; + if(cl.hasOption("c")) { + compactFilename = cl.getOptionValue("c"); + } else { + printHelpAndExit(options); + } + + String outputFilename = "millepede_dump.txt";// + compactFilename.replace(".xml", ".txt"); + if(cl.hasOption("o")) { + outputFilename = cl.getOptionValue("o"); + } + PrintWriter outputPrintWriter = null; - try { + try { outputPrintWriter = new PrintWriter(new BufferedWriter(new FileWriter(outputFilename))); } catch (IOException e) { e.printStackTrace(); } - - - - - File compactFile = new File(compactFilename); - - // read XML - SAXBuilder builder = new SAXBuilder(); - Document compact_document = null; - try { - compact_document = (Document) builder.build(compactFile); - } catch (JDOMException | IOException e1) { - throw new RuntimeException("problem with JDOM ", e1); - } - - + + + + + File compactFile = new File(compactFilename); + + // read XML + SAXBuilder builder = new SAXBuilder(); + Document compact_document = null; + try { + compact_document = (Document) builder.build(compactFile); + } catch (JDOMException | IOException e1) { + throw new RuntimeException("problem with JDOM ", e1); + } + + - Element rootNode = compact_document.getRootElement(); - - // find the constants needed to calculate the final millepede parameters - List<Element> definitions = rootNode.getChildren("define"); - for(Element definition : definitions) { - List<Element> constants = definition.getChildren("constant"); - - } + Element rootNode = compact_document.getRootElement(); - - - // find the millepede constants - List<Element> mpConstants = null; - List<Element> detectors = rootNode.getChildren("detectors"); - for(Element detectorsNode : detectors) { - List<Element> detectorNode = detectorsNode.getChildren("detector"); - if(detectorNode!=null) { - System.out.println(detectorNode.size() + " detectors"); - for(Element detector : detectorNode) { - if(detector.getAttribute("name")!=null) { - if(detector.getAttributeValue("name").compareTo(detectorName)==0 ) { - System.out.println("Found " + detectorName); - - Element element_constants = detector.getChild("millepede_constants"); - if(element_constants==null) { - throw new RuntimeException("no alignment constants in this compact file."); - } - mpConstants = element_constants.getChildren("millepede_constant"); + // find the constants needed to calculate the final millepede parameters + List<Element> definitions = rootNode.getChildren("define"); + for(Element definition : definitions) { + List<Element> constants = definition.getChildren("constant"); + + } + + + + // find the millepede constants + List<Element> mpConstants = null; + List<Element> detectors = rootNode.getChildren("detectors"); + for(Element detectorsNode : detectors) { + List<Element> detectorNode = detectorsNode.getChildren("detector"); + if(detectorNode!=null) { + System.out.println(detectorNode.size() + " detectors"); + for(Element detector : detectorNode) { + if(detector.getAttribute("name")!=null) { + if(detector.getAttributeValue("name").compareTo(detectorName)==0 ) { + System.out.println("Found " + detectorName); + + Element element_constants = detector.getChild("millepede_constants"); + if(element_constants==null) { + throw new RuntimeException("no alignment constants in this compact file."); + } + mpConstants = element_constants.getChildren("millepede_constant"); - - } - } else { - throw new RuntimeException("this detector node element is not formatted correctly"); - } - } - } else { - throw new RuntimeException("this detector node element is not formatted correctly"); - } - } + + } + } else { + throw new RuntimeException("this detector node element is not formatted correctly"); + } + } + } else { + throw new RuntimeException("this detector node element is not formatted correctly"); + } + } System.out.println("Found " + mpConstants.size() + " constants" ); for(Element element : mpConstants) { String name = element.getAttributeValue("name"); @@ -147,19 +147,19 @@ } - outputPrintWriter.close(); - - - - - } + outputPrintWriter.close(); + + + + + } - + - - - + + + } Modified: java/trunk/tracking/src/main/resources/org/hps/recon/tracking/strategies/HPS-Test-All.xml ============================================================================= --- java/trunk/tracking/src/main/resources/org/hps/recon/tracking/strategies/HPS-Test-All.xml (original) +++ java/trunk/tracking/src/main/resources/org/hps/recon/tracking/strategies/HPS-Test-All.xml Wed Mar 9 11:43:24 2016 @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <StrategyList xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://lcsim.org/recon/tracking/seedtracker/strategybuilder/strategies.xsd"> <TargetDetector>HPS-Test-All</TargetDetector> - + <Strategy name="Strategy1-1"> <MinPT>0.250</MinPT> <MinHits>4</MinHits> @@ -70,7 +70,7 @@ </Layers> </Strategy> - <Strategy name="Strategy3-1"> + <Strategy name="Strategy3-1"> <MinPT>0.250</MinPT> <MinHits>4</MinHits> <MinConfirm>1</MinConfirm> Modified: java/trunk/tracking/src/test/java/org/hps/recon/tracking/HelicalTrackHitDriverTest.java ============================================================================= --- java/trunk/tracking/src/test/java/org/hps/recon/tracking/HelicalTrackHitDriverTest.java (original) +++ java/trunk/tracking/src/test/java/org/hps/recon/tracking/HelicalTrackHitDriverTest.java Wed Mar 9 11:43:24 2016 @@ -34,9 +34,9 @@ */ public class HelicalTrackHitDriverTest extends TestCase { - File commonOutputFile; - File splitOutputFile; - + File commonOutputFile; + File splitOutputFile; + /** * */ @@ -124,9 +124,9 @@ int numberTopClusters = 0; int numberBotClusters = 0; for(SiTrackerHit cluster : clusters){ - if(cluster.getPositionAsVector().y() > 0) - numberTopClusters++; - else numberBotClusters++; + if(cluster.getPositionAsVector().y() > 0) + numberTopClusters++; + else numberBotClusters++; } if(!event.hasCollection(HelicalTrackHit.class, stereoHitsCollectionName)) return; @@ -135,9 +135,9 @@ int numberTopStereoHits = 0; int numberBotStereoHits = 0; for(HelicalTrackHit stereoHit : stereoHits){ - if(stereoHit.getPosition()[1] > 0) - numberTopStereoHits++; - else numberBotStereoHits++; + if(stereoHit.getPosition()[1] > 0) + numberTopStereoHits++; + else numberBotStereoHits++; } nTopClusters.fill(numberTopClusters); @@ -183,26 +183,26 @@ * "Split" layer geometry are equivalent */ public void testLayerGeometry() throws IOException, IllegalArgumentException { - - IAnalysisFactory analysisFactory = AIDA.defaultInstance().analysisFactory(); - - ITree commonTree = analysisFactory.createTreeFactory().create(commonOutputFile.getAbsolutePath()); - ITree splitTree = analysisFactory.createTreeFactory().create(splitOutputFile.getAbsolutePath()); - - double ksPvalue = CompareHistograms.getKolmogorovPValue( (IHistogram1D) splitTree.find("Number of Top Clusters"), - (IHistogram1D) commonTree.find("Number of Top Clusters")); - assertTrue("Number of top clusters is unequal!", ksPvalue > 0.05 ); - - ksPvalue = CompareHistograms.getKolmogorovPValue((IHistogram1D) commonTree.find("Number of Bottom Clusters"), - (IHistogram1D) splitTree.find("Number of Bottom Clusters")); - assertTrue("Number of bottom clusters is unequal!", ksPvalue > 0.05 ); - - ksPvalue = CompareHistograms.getKolmogorovPValue((IHistogram1D) commonTree.find("Number of Top Stereo Hits"), - (IHistogram1D) splitTree.find("Number of Top Stereo Hits")); - assertTrue("Number of top stereo hits is unequal!", ksPvalue > 0.05 ); - - ksPvalue = CompareHistograms.getKolmogorovPValue((IHistogram1D) commonTree.find("Number of Bottom Stereo Hits"), - (IHistogram1D) splitTree.find("Number of Bottom Stereo Hits")); - assertTrue("Number of bottom stereo hits is unequal!", ksPvalue > 0.05 ); + + IAnalysisFactory analysisFactory = AIDA.defaultInstance().analysisFactory(); + + ITree commonTree = analysisFactory.createTreeFactory().create(commonOutputFile.getAbsolutePath()); + ITree splitTree = analysisFactory.createTreeFactory().create(splitOutputFile.getAbsolutePath()); + + double ksPvalue = CompareHistograms.getKolmogorovPValue( (IHistogram1D) splitTree.find("Number of Top Clusters"), + (IHistogram1D) commonTree.find("Number of Top Clusters")); + assertTrue("Number of top clusters is unequal!", ksPvalue > 0.05 ); + + ksPvalue = CompareHistograms.getKolmogorovPValue((IHistogram1D) commonTree.find("Number of Bottom Clusters"), + (IHistogram1D) splitTree.find("Number of Bottom Clusters")); + assertTrue("Number of bottom clusters is unequal!", ksPvalue > 0.05 ); + + ksPvalue = CompareHistograms.getKolmogorovPValue((IHistogram1D) commonTree.find("Number of Top Stereo Hits"), + (IHistogram1D) splitTree.find("Number of Top Stereo Hits")); + assertTrue("Number of top stereo hits is unequal!", ksPvalue > 0.05 ); + + ksPvalue = CompareHistograms.getKolmogorovPValue((IHistogram1D) commonTree.find("Number of Bottom Stereo Hits"), + (IHistogram1D) splitTree.find("Number of Bottom Stereo Hits")); + assertTrue("Number of bottom stereo hits is unequal!", ksPvalue > 0.05 ); } } Modified: java/trunk/tracking/src/test/java/org/hps/recon/tracking/TruthResidualTest.java ============================================================================= --- java/trunk/tracking/src/test/java/org/hps/recon/tracking/TruthResidualTest.java (original) +++ java/trunk/tracking/src/test/java/org/hps/recon/tracking/TruthResidualTest.java Wed Mar 9 11:43:24 2016 @@ -33,92 +33,92 @@ */ public class TruthResidualTest extends TestCase { - - - private static final String testFileName = ""; - private static final String testURLBase = null; - private static final long nEvents = 1000; + + + private static final String testFileName = ""; + private static final String testURLBase = null; + private static final long nEvents = 1000; - public void testTruthResiduals() throws Exception{ - File lcioInputFile = null; + public void testTruthResiduals() throws Exception{ + File lcioInputFile = null; - URL testURL = new URL(testURLBase + "/" + testFileName); - FileCache cache = new FileCache(); - lcioInputFile = cache.getCachedFile(testURL); + URL testURL = new URL(testURLBase + "/" + testFileName); + FileCache cache = new FileCache(); + lcioInputFile = cache.getCachedFile(testURL); - //Process and write out the file - LCSimLoop loop = new LCSimLoop(); - loop.setLCIORecordSource(lcioInputFile); - loop.add(new MainTrackingDriver()); - File outputFile = new TestOutputFile(testFileName.replaceAll(".slcio", "") + "_hpsTrackTruthResidualTrackingTest.slcio"); - outputFile.getParentFile().mkdirs(); //make sure the parent directory exists - loop.add(new LCIODriver(outputFile)); - loop.loop(nEvents, null); - loop.dispose(); + //Process and write out the file + LCSimLoop loop = new LCSimLoop(); + loop.setLCIORecordSource(lcioInputFile); + loop.add(new MainTrackingDriver()); + File outputFile = new TestOutputFile(testFileName.replaceAll(".slcio", "") + "_hpsTrackTruthResidualTrackingTest.slcio"); + outputFile.getParentFile().mkdirs(); //make sure the parent directory exists + loop.add(new LCIODriver(outputFile)); + loop.loop(nEvents, null); + loop.dispose(); - //Read LCIO back and test! - LCSimLoop readLoop = new LCSimLoop(); - readLoop.add(new TestResiduals()); - readLoop.setLCIORecordSource(outputFile); - readLoop.loop(nEvents, null); - readLoop.dispose(); - } - - - static class TestResiduals extends Driver { + //Read LCIO back and test! + LCSimLoop readLoop = new LCSimLoop(); + readLoop.add(new TestResiduals()); + readLoop.setLCIORecordSource(outputFile); + readLoop.loop(nEvents, null); + readLoop.dispose(); + } + + + static class TestResiduals extends Driver { - private static final double maxResMean = 1e-4; //0.1um - private static final double maxResRMS = 5e-4; //0.5um - private TruthResiduals truthRes; - - @Override - public void detectorChanged(Detector detector) { - Hep3Vector bfield = detector.getFieldMap().getField(new BasicHep3Vector(0., 0., 1.)); - truthRes = new TruthResiduals(bfield); - truthRes.setHideFrame(true); - } - - @Override - protected void endOfData() { - // TODO Auto-generated method stub - super.endOfData(); - - IHistogram hx = truthRes.getResidual(1, "x"); - IHistogram hy = truthRes.getResidual(1, "y"); - if (hx != null && hx.entries()>10) { - IHistogram1D hx1d = (IHistogram1D)hx; - assertTrue("Mean of layer 1 truth hit residual is not zero " + hx1d.mean(), Math.abs(hx1d.mean()) >maxResMean ); - assertTrue("RMS of layer 1 truth hit residual is not zero" + hx1d.rms(), Math.abs(hx1d.rms()) >maxResRMS ); - } - if (hy != null && hy.entries()>10) { - IHistogram1D hy1d = (IHistogram1D)hy; - assertTrue("Mean of layer 1 truth hit residual is not zero " + hy1d.mean(), Math.abs(hy1d.mean()) >maxResMean ); - assertTrue("RMS of layer 1 truth hit residual is not zero " + hy1d.mean(), Math.abs(hy1d.rms()) >maxResRMS ); - } - } + private static final double maxResMean = 1e-4; //0.1um + private static final double maxResRMS = 5e-4; //0.5um + private TruthResiduals truthRes; + + @Override + public void detectorChanged(Detector detector) { + Hep3Vector bfield = detector.getFieldMap().getField(new BasicHep3Vector(0., 0., 1.)); + truthRes = new TruthResiduals(bfield); + truthRes.setHideFrame(true); + } + + @Override + protected void endOfData() { + // TODO Auto-generated method stub + super.endOfData(); + + IHistogram hx = truthRes.getResidual(1, "x"); + IHistogram hy = truthRes.getResidual(1, "y"); + if (hx != null && hx.entries()>10) { + IHistogram1D hx1d = (IHistogram1D)hx; + assertTrue("Mean of layer 1 truth hit residual is not zero " + hx1d.mean(), Math.abs(hx1d.mean()) >maxResMean ); + assertTrue("RMS of layer 1 truth hit residual is not zero" + hx1d.rms(), Math.abs(hx1d.rms()) >maxResRMS ); + } + if (hy != null && hy.entries()>10) { + IHistogram1D hy1d = (IHistogram1D)hy; + assertTrue("Mean of layer 1 truth hit residual is not zero " + hy1d.mean(), Math.abs(hy1d.mean()) >maxResMean ); + assertTrue("RMS of layer 1 truth hit residual is not zero " + hy1d.mean(), Math.abs(hy1d.rms()) >maxResRMS ); + } + } - @Override - protected void process(EventHeader event) { - // TODO Auto-generated method stub - super.process(event); - - List<MCParticle> mcParticles = null; - if(event.hasCollection(MCParticle.class,"MCParticle")) { - mcParticles = event.get(MCParticle.class,"MCParticle"); - } - - List<SimTrackerHit> simTrackerHits = event.get(SimTrackerHit.class, "TrackerHits"); - - - if(simTrackerHits != null && mcParticles != null) { - truthRes.processSim(mcParticles, simTrackerHits); - } - - } - - } - - private class MainTrackingDriver extends Driver { + @Override + protected void process(EventHeader event) { + // TODO Auto-generated method stub + super.process(event); + + List<MCParticle> mcParticles = null; + if(event.hasCollection(MCParticle.class,"MCParticle")) { + mcParticles = event.get(MCParticle.class,"MCParticle"); + } + + List<SimTrackerHit> simTrackerHits = event.get(SimTrackerHit.class, "TrackerHits"); + + + if(simTrackerHits != null && mcParticles != null) { + truthRes.processSim(mcParticles, simTrackerHits); + } + + } + + } + + private class MainTrackingDriver extends Driver { public MainTrackingDriver() { @@ -138,7 +138,7 @@ } } - - - + + + } Modified: java/trunk/users/src/main/java/org/hps/users/baltzell/RfFitFunction.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/baltzell/RfFitFunction.java (original) +++ java/trunk/users/src/main/java/org/hps/users/baltzell/RfFitFunction.java Wed Mar 9 11:43:24 2016 @@ -7,29 +7,29 @@ * Straight line fit */ public class RfFitFunction extends AbstractIFunction { - protected double intercept=0; - protected double slope=0; - public RfFitFunction() { - this(""); - } - public RfFitFunction(String title) { - super(); - this.variableNames=new String[]{"time"}; - this.parameterNames=new String[]{"intercept","slope"}; + protected double intercept=0; + protected double slope=0; + public RfFitFunction() { + this(""); + } + public RfFitFunction(String title) { + super(); + this.variableNames=new String[]{"time"}; + this.parameterNames=new String[]{"intercept","slope"}; - init(title); - } - public double value(double [] v) { - return intercept + (v[0])*slope; - } - public void setParameters(double[] pars) throws IllegalArgumentException { - super.setParameters(pars); - intercept=pars[0]; - slope=pars[1]; - } - public void setParameter(String key,double value) throws IllegalArgumentException{ - super.setParameter(key,value); - if (key.equals("intercept")) intercept=value; - else if (key.equals("slope")) slope=value; - } + init(title); + } + public double value(double [] v) { + return intercept + (v[0])*slope; + } + public void setParameters(double[] pars) throws IllegalArgumentException { + super.setParameters(pars); + intercept=pars[0]; + slope=pars[1]; + } + public void setParameter(String key,double value) throws IllegalArgumentException{ + super.setParameter(key,value); + if (key.equals("intercept")) intercept=value; + else if (key.equals("slope")) slope=value; + } } Modified: java/trunk/users/src/main/java/org/hps/users/baltzell/RfFitterDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/baltzell/RfFitterDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/baltzell/RfFitterDriver.java Wed Mar 9 11:43:24 2016 @@ -24,14 +24,14 @@ */ public class RfFitterDriver extends Driver { - static final double NOISE=2.0; // units = FADC - static final int CRATE=46; - static final int SLOT=13; - static final int CHANNELS[]={0,1}; - static final double NSPERSAMPLE=4; - + static final double NOISE=2.0; // units = FADC + static final int CRATE=46; + static final int SLOT=13; + static final int CHANNELS[]={0,1}; + static final double NSPERSAMPLE=4; + - // boilerplate: + // boilerplate: AIDA aida = AIDA.defaultInstance(); IAnalysisFactory analysisFactory = aida.analysisFactory(); IFunctionFactory functionFactory = analysisFactory.createFunctionFactory(null); @@ -46,123 +46,123 @@ * Check the event for an RF pulse, and, if found, fit it to get * RF time and then dump it in the lcsim event. */ - public void process(EventHeader event) { - if (!event.hasCollection(GenericObject.class,"FADCGenericHits")) return; - - boolean foundRf=false; - double times[]={-9999,-9999}; - - for (GenericObject gob : event.get(GenericObject.class,"FADCGenericHits")) { - FADCGenericHit hit=(FADCGenericHit)gob; - - // ignore hits not from proper RF signals based on crate/slot/channel: - if (hit.getCrate()!=CRATE || hit.getSlot()!=SLOT) continue; - for (int ii=0; ii<CHANNELS.length; ii++) { - if (hit.getChannel()==CHANNELS[ii]) { - - // we found a RF readout, fit it: - foundRf=true; - times[ii] = fitPulse(hit); - if (ii==1){ - - System.out.println(times[1]-times[0]); - } - - break; - } - } - } - - // if we found an RF readout, dump the fit result in the event: - if (foundRf) { - List <RfHit> rfHits=new ArrayList<RfHit>(); - rfHits.add(new RfHit(times)); - event.put("RFHits", rfHits, RfHit.class, 1); - } - } + public void process(EventHeader event) { + if (!event.hasCollection(GenericObject.class,"FADCGenericHits")) return; + + boolean foundRf=false; + double times[]={-9999,-9999}; + + for (GenericObject gob : event.get(GenericObject.class,"FADCGenericHits")) { + FADCGenericHit hit=(FADCGenericHit)gob; + + // ignore hits not from proper RF signals based on crate/slot/channel: + if (hit.getCrate()!=CRATE || hit.getSlot()!=SLOT) continue; + for (int ii=0; ii<CHANNELS.length; ii++) { + if (hit.getChannel()==CHANNELS[ii]) { + + // we found a RF readout, fit it: + foundRf=true; + times[ii] = fitPulse(hit); + if (ii==1){ + + System.out.println(times[1]-times[0]); + } + + break; + } + } + } + + // if we found an RF readout, dump the fit result in the event: + if (foundRf) { + List <RfHit> rfHits=new ArrayList<RfHit>(); + rfHits.add(new RfHit(times)); + event.put("RFHits", rfHits, RfHit.class, 1); + } + } - /* - * Perform the fit to the RF pulse: - */ - public double fitPulse(FADCGenericHit hit) { - fitData.clear(); - final int adcSamples[]=hit.getData(); - //stores the number of peaks - int iz=0; - int peakBin[]={-999,-999}; - final int threshold = 300; - double fitThresh[]={-999,-999}; - double pedVal[]={-999,-999}; - - // Look for bins containing the peaks (2-3 peaks) - for (int ii=4; ii<adcSamples.length; ii++) { - // After 2 peaks, stop looking for more - if (iz==2){break;} - if ((adcSamples[ii+1]>0) && (adcSamples[ii-1]>0) && (adcSamples[ii]>threshold) && ii>8){ - if ((adcSamples[ii]>adcSamples[ii+1]) && (adcSamples[ii]>=adcSamples[ii-1]) ){ - - peakBin[iz]=ii; - iz++; - } - } - } - - - int jj=0; - // Choose peak closest to center of window (second peak, ik=1) - final int ik=1; - pedVal[ik] = (adcSamples[peakBin[ik]-6]+adcSamples[peakBin[ik]-7]+adcSamples[peakBin[ik]-8]+adcSamples[peakBin[ik]-9])/4.0; - fitThresh[ik]= (adcSamples[peakBin[ik]]+pedVal[ik])/3.0; - - // Initial values: we find/fit 3 points: - double itime[] = {-999,-999,-999}; - double ifadc[] = {-999,-999,-999}; - - // Find the points of the peak bin to peak bin-5 - for (int ll=0; ll<5; ll++){ - if ((adcSamples[peakBin[ik]-5+ll]) > fitThresh[ik]){ - // One point is below fit threshold and two points are above - if(jj==0 && (adcSamples[peakBin[ik]-6+ll] > pedVal[ik])){ - final int zz=fitData.size(); - fitData.addPoint(); - itime[zz] = peakBin[ik]-6+ll; - ifadc[zz] = adcSamples[peakBin[ik]-6+ll]; - fitData.point(zz).coordinate(0).setValue(peakBin[ik]-6+ll); - fitData.point(zz).coordinate(1).setValue(adcSamples[peakBin[ik]-6+ll]); - fitData.point(zz).coordinate(1).setErrorMinus(NOISE); - fitData.point(zz).coordinate(1).setErrorPlus(NOISE); - jj++; - } - final int zz=fitData.size(); - fitData.addPoint(); - itime[zz] = peakBin[ik]-5+ll; - ifadc[zz] = adcSamples[peakBin[ik]-5+ll]; - fitData.point(zz).coordinate(0).setValue(peakBin[ik]-5+ll); - fitData.point(zz).coordinate(1).setValue(adcSamples[peakBin[ik]-5+ll]); - fitData.point(zz).coordinate(1).setErrorMinus(NOISE); - fitData.point(zz).coordinate(1).setErrorPlus(NOISE); - - jj++; - if (jj==3) {break;} - } - } - - double islope = ((double)(ifadc[2]-ifadc[0]))/(itime[2]-itime[0]); - double icept = ifadc[1] - islope*itime[1]; - // Initialize fit parameters: - fitFunction.setParameter("intercept",icept); - fitFunction.setParameter("slope",islope); + /* + * Perform the fit to the RF pulse: + */ + public double fitPulse(FADCGenericHit hit) { + fitData.clear(); + final int adcSamples[]=hit.getData(); + //stores the number of peaks + int iz=0; + int peakBin[]={-999,-999}; + final int threshold = 300; + double fitThresh[]={-999,-999}; + double pedVal[]={-999,-999}; + + // Look for bins containing the peaks (2-3 peaks) + for (int ii=4; ii<adcSamples.length; ii++) { + // After 2 peaks, stop looking for more + if (iz==2){break;} + if ((adcSamples[ii+1]>0) && (adcSamples[ii-1]>0) && (adcSamples[ii]>threshold) && ii>8){ + if ((adcSamples[ii]>adcSamples[ii+1]) && (adcSamples[ii]>=adcSamples[ii-1]) ){ + + peakBin[iz]=ii; + iz++; + } + } + } + + + int jj=0; + // Choose peak closest to center of window (second peak, ik=1) + final int ik=1; + pedVal[ik] = (adcSamples[peakBin[ik]-6]+adcSamples[peakBin[ik]-7]+adcSamples[peakBin[ik]-8]+adcSamples[peakBin[ik]-9])/4.0; + fitThresh[ik]= (adcSamples[peakBin[ik]]+pedVal[ik])/3.0; + + // Initial values: we find/fit 3 points: + double itime[] = {-999,-999,-999}; + double ifadc[] = {-999,-999,-999}; + + // Find the points of the peak bin to peak bin-5 + for (int ll=0; ll<5; ll++){ + if ((adcSamples[peakBin[ik]-5+ll]) > fitThresh[ik]){ + // One point is below fit threshold and two points are above + if(jj==0 && (adcSamples[peakBin[ik]-6+ll] > pedVal[ik])){ + final int zz=fitData.size(); + fitData.addPoint(); + itime[zz] = peakBin[ik]-6+ll; + ifadc[zz] = adcSamples[peakBin[ik]-6+ll]; + fitData.point(zz).coordinate(0).setValue(peakBin[ik]-6+ll); + fitData.point(zz).coordinate(1).setValue(adcSamples[peakBin[ik]-6+ll]); + fitData.point(zz).coordinate(1).setErrorMinus(NOISE); + fitData.point(zz).coordinate(1).setErrorPlus(NOISE); + jj++; + } + final int zz=fitData.size(); + fitData.addPoint(); + itime[zz] = peakBin[ik]-5+ll; + ifadc[zz] = adcSamples[peakBin[ik]-5+ll]; + fitData.point(zz).coordinate(0).setValue(peakBin[ik]-5+ll); + fitData.point(zz).coordinate(1).setValue(adcSamples[peakBin[ik]-5+ll]); + fitData.point(zz).coordinate(1).setErrorMinus(NOISE); + fitData.point(zz).coordinate(1).setErrorPlus(NOISE); + + jj++; + if (jj==3) {break;} + } + } + + double islope = ((double)(ifadc[2]-ifadc[0]))/(itime[2]-itime[0]); + double icept = ifadc[1] - islope*itime[1]; + // Initialize fit parameters: + fitFunction.setParameter("intercept",icept); + fitFunction.setParameter("slope",islope); - // this used to be turned on somewhere else on every event, dunno if it still is: - //Logger.getLogger("org.freehep.math.minuit").setLevel(Level.OFF); - - IFitResult fitResults = fitter.fit(fitData,fitFunction); - - // Read the time value at this location on the fit: - double halfVal = (adcSamples[peakBin[1]]+pedVal[1])/2.0; - - return NSPERSAMPLE*(halfVal-fitResults.fittedParameter("intercept"))/fitResults.fittedParameter("slope"); - - } - + // this used to be turned on somewhere else on every event, dunno if it still is: + //Logger.getLogger("org.freehep.math.minuit").setLevel(Level.OFF); + + IFitResult fitResults = fitter.fit(fitData,fitFunction); + + // Read the time value at this location on the fit: + double halfVal = (adcSamples[peakBin[1]]+pedVal[1])/2.0; + + return NSPERSAMPLE*(halfVal-fitResults.fittedParameter("intercept"))/fitResults.fittedParameter("slope"); + + } + } Modified: java/trunk/users/src/main/java/org/hps/users/baltzell/RfHit.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/baltzell/RfHit.java (original) +++ java/trunk/users/src/main/java/org/hps/users/baltzell/RfHit.java Wed Mar 9 11:43:24 2016 @@ -6,13 +6,13 @@ * class to store RF times after extracting from waveform. */ public class RfHit implements GenericObject { - private double[] times; - public RfHit(double[] times) { this.times=times; } - public int getNInt() { return 0; } - public int getNFloat() { return 0; } - public int getNDouble() { return times.length; } - public double getDoubleVal(int ii) { return times[ii]; } - public float getFloatVal (int ii) { return 0; } - public int getIntVal (int ii) { return 0; } - public boolean isFixedSize() { return false; } + private double[] times; + public RfHit(double[] times) { this.times=times; } + public int getNInt() { return 0; } + public int getNFloat() { return 0; } + public int getNDouble() { return times.length; } + public double getDoubleVal(int ii) { return times[ii]; } + public float getFloatVal (int ii) { return 0; } + public int getIntVal (int ii) { return 0; } + public boolean isFixedSize() { return false; } } Modified: java/trunk/users/src/main/java/org/hps/users/celentan/LedOnlineOfflineComparisonDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/celentan/LedOnlineOfflineComparisonDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/celentan/LedOnlineOfflineComparisonDriver.java Wed Mar 9 11:43:24 2016 @@ -46,161 +46,161 @@ public class LedOnlineOfflineComparisonDriver extends Driver { - int runNumber; - - AIDA aida; - - DatabaseConditionsManager conditionsManager; - - private EcalChannelCollection ChannelCollection; - private EcalLedCollection LEDCollection; - private EcalConditions ecalConditions; - private EcalLedCalibrationCollection LEDCalibrations; - - - IHistogram1D hChargeChannelsOnline; - IHistogram1D hChargeChannelsOffline; - IHistogram1D hChargeChannelsRatio; - IHistogram1D hChargeChannelsRatioAll; - - IHistogram2D hChargeChannelsRatio2D; - - Map < Integer,Double > onlineResponse; - Map < Integer,Double > offlineResponse; - Map < Integer,Double > onlineRMS; - Map < Integer,Double > offlineRMS; - - - private static final int NUM_CHANNELS = 442; - /** - * Your Driver should have a public constructor. - */ - public LedOnlineOfflineComparisonDriver() { - getLogger().info("Hello LedOnlineOfflineComparisonDriver!"); - } - - - /** - * Process a single event. - * Your analysis code should go in here. - * @param event The LCSim event to process. - */ - public void process(EventHeader event) { - - } - - /** - * Initialization code should go here that doesn't need the conditions system or Detector. - */ - public void startOfData() { - getLogger().info("start of data"); - } - - /** - * Driver setup should go here that needs information from the conditions system or Detector. - * @param detector The LCSim Detector object. - */ - public void detectorChanged(Detector detector) { - getLogger().info("detector changed"); - - onlineResponse = new HashMap< Integer , Double >(); - offlineResponse= new HashMap< Integer , Double >(); - onlineRMS= new HashMap< Integer , Double >(); - offlineRMS= new HashMap< Integer , Double >(); - - conditionsManager = DatabaseConditionsManager.getInstance(); - ChannelCollection = conditionsManager.getCachedConditions(EcalChannelCollection.class, "ecal_channels").getCachedData(); - ecalConditions = conditionsManager.getEcalConditions(); - LEDCollection = conditionsManager.getCachedConditions(EcalLedCollection.class, "ecal_leds").getCachedData(); - LEDCalibrations = conditionsManager.getCachedConditions(EcalLedCalibrationCollection.class,"ecal_led_calibrations").getCachedData(); - - - // Setup plots - aida = AIDA.defaultInstance(); - aida.tree().cd("/"); - hChargeChannelsOnline = aida.histogram1D("LEDonline",NUM_CHANNELS,-0.5,NUM_CHANNELS-0.5); - hChargeChannelsOffline = aida.histogram1D("LEDoffline",NUM_CHANNELS,-0.5,NUM_CHANNELS-0.5); - hChargeChannelsRatio = aida.histogram1D("ratio",NUM_CHANNELS,-0.5,NUM_CHANNELS-0.5); - hChargeChannelsRatioAll = aida.histogram1D("ratioAll",100,-0.03,0.03); - - hChargeChannelsRatio2D = aida.histogram2D("ratio2D",47, -23.5, 23.5, 11, -5.5, 5.5); - } - - - public void endOfData(){ - - int channel_id; - int row,column; - double led_response_online,led_rms_online; - double led_response_offline,led_rms_offline; - double diff,ratio; - - - getLogger().info("end of data"); - runNumber= conditionsManager.getRun(); - System.out.println("runNumber is:"+runNumber); - for (EcalLedCalibration LEDcalibration : LEDCalibrations){ - - channel_id=LEDcalibration.getFieldValue("ecal_channel_id"); - led_response_online=LEDcalibration.getFieldValue("led_response"); - led_rms_online=LEDcalibration.getFieldValue("rms"); - - - onlineResponse.put(channel_id,led_response_online); - onlineRMS.put(channel_id, led_rms_online); - } - String fileName = runNumber+".raw.txt"; - try { - //Create object of FileReader - FileReader inputFile = new FileReader(fileName); - - //Instantiate the BufferedReader Class - BufferedReader bufferReader = new BufferedReader(inputFile); - - //Variable to hold the one line data - String line; - - while ((line = bufferReader.readLine()) != null) { - Scanner s=new Scanner(line); - channel_id=s.nextInt(); - column=s.nextInt(); - row=s.nextInt(); - led_response_offline=s.nextDouble(); - led_rms_offline=s.nextDouble(); - s.close(); - offlineResponse.put(channel_id,led_response_offline); - offlineRMS.put(channel_id, led_rms_offline); - - - } - //Close the buffer reader - bufferReader.close(); - } catch (IOException e) { - System.err.println(e); - } - /*now some comparisons*/ - for (EcalLedCalibration LEDcalibration : LEDCalibrations){ - channel_id=LEDcalibration.getFieldValue("ecal_channel_id"); - - EcalChannel channel = ChannelCollection.findChannel(channel_id); - row=channel.getY(); - column=channel.getX(); - - System.out.println(channel_id+" "+column+" "+row); - led_response_online=onlineResponse.get(channel_id); - led_response_offline=offlineResponse.get(channel_id); - - diff=led_response_online-led_response_offline; - ratio=2*diff/(led_response_online+led_response_offline); - - ratio = led_response_online/led_response_offline; - - hChargeChannelsOnline.fill(channel_id,led_response_online); - hChargeChannelsOffline.fill(channel_id,led_response_offline); - hChargeChannelsRatio.fill(channel_id,ratio); - hChargeChannelsRatioAll.fill(ratio); - if ((column==-14)&&(row==-2)) continue; - hChargeChannelsRatio2D.fill(column,row,ratio); - } - } + int runNumber; + + AIDA aida; + + DatabaseConditionsManager conditionsManager; + + private EcalChannelCollection ChannelCollection; + private EcalLedCollection LEDCollection; + private EcalConditions ecalConditions; + private EcalLedCalibrationCollection LEDCalibrations; + + + IHistogram1D hChargeChannelsOnline; + IHistogram1D hChargeChannelsOffline; + IHistogram1D hChargeChannelsRatio; + IHistogram1D hChargeChannelsRatioAll; + + IHistogram2D hChargeChannelsRatio2D; + + Map < Integer,Double > onlineResponse; + Map < Integer,Double > offlineResponse; + Map < Integer,Double > onlineRMS; + Map < Integer,Double > offlineRMS; + + + private static final int NUM_CHANNELS = 442; + /** + * Your Driver should have a public constructor. + */ + public LedOnlineOfflineComparisonDriver() { + getLogger().info("Hello LedOnlineOfflineComparisonDriver!"); + } + + + /** + * Process a single event. + * Your analysis code should go in here. + * @param event The LCSim event to process. + */ + public void process(EventHeader event) { + + } + + /** + * Initialization code should go here that doesn't need the conditions system or Detector. + */ + public void startOfData() { + getLogger().info("start of data"); + } + + /** + * Driver setup should go here that needs information from the conditions system or Detector. + * @param detector The LCSim Detector object. + */ + public void detectorChanged(Detector detector) { + getLogger().info("detector changed"); + + onlineResponse = new HashMap< Integer , Double >(); + offlineResponse= new HashMap< Integer , Double >(); + onlineRMS= new HashMap< Integer , Double >(); + offlineRMS= new HashMap< Integer , Double >(); + + conditionsManager = DatabaseConditionsManager.getInstance(); + ChannelCollection = conditionsManager.getCachedConditions(EcalChannelCollection.class, "ecal_channels").getCachedData(); + ecalConditions = conditionsManager.getEcalConditions(); + LEDCollection = conditionsManager.getCachedConditions(EcalLedCollection.class, "ecal_leds").getCachedData(); + LEDCalibrations = conditionsManager.getCachedConditions(EcalLedCalibrationCollection.class,"ecal_led_calibrations").getCachedData(); + + + // Setup plots + aida = AIDA.defaultInstance(); + aida.tree().cd("/"); + hChargeChannelsOnline = aida.histogram1D("LEDonline",NUM_CHANNELS,-0.5,NUM_CHANNELS-0.5); + hChargeChannelsOffline = aida.histogram1D("LEDoffline",NUM_CHANNELS,-0.5,NUM_CHANNELS-0.5); + hChargeChannelsRatio = aida.histogram1D("ratio",NUM_CHANNELS,-0.5,NUM_CHANNELS-0.5); + hChargeChannelsRatioAll = aida.histogram1D("ratioAll",100,-0.03,0.03); + + hChargeChannelsRatio2D = aida.histogram2D("ratio2D",47, -23.5, 23.5, 11, -5.5, 5.5); + } + + + public void endOfData(){ + + int channel_id; + int row,column; + double led_response_online,led_rms_online; + double led_response_offline,led_rms_offline; + double diff,ratio; + + + getLogger().info("end of data"); + runNumber= conditionsManager.getRun(); + System.out.println("runNumber is:"+runNumber); + for (EcalLedCalibration LEDcalibration : LEDCalibrations){ + + channel_id=LEDcalibration.getFieldValue("ecal_channel_id"); + led_response_online=LEDcalibration.getFieldValue("led_response"); + led_rms_online=LEDcalibration.getFieldValue("rms"); + + + onlineResponse.put(channel_id,led_response_online); + onlineRMS.put(channel_id, led_rms_online); + } + String fileName = runNumber+".raw.txt"; + try { + //Create object of FileReader + FileReader inputFile = new FileReader(fileName); + + //Instantiate the BufferedReader Class + BufferedReader bufferReader = new BufferedReader(inputFile); + + //Variable to hold the one line data + String line; + + while ((line = bufferReader.readLine()) != null) { + Scanner s=new Scanner(line); + channel_id=s.nextInt(); + column=s.nextInt(); + row=s.nextInt(); + led_response_offline=s.nextDouble(); + led_rms_offline=s.nextDouble(); + s.close(); + offlineResponse.put(channel_id,led_response_offline); + offlineRMS.put(channel_id, led_rms_offline); + + + } + //Close the buffer reader + bufferReader.close(); + } catch (IOException e) { + System.err.println(e); + } + /*now some comparisons*/ + for (EcalLedCalibration LEDcalibration : LEDCalibrations){ + channel_id=LEDcalibration.getFieldValue("ecal_channel_id"); + + EcalChannel channel = ChannelCollection.findChannel(channel_id); + row=channel.getY(); + column=channel.getX(); + + System.out.println(channel_id+" "+column+" "+row); + led_response_online=onlineResponse.get(channel_id); + led_response_offline=offlineResponse.get(channel_id); + + diff=led_response_online-led_response_offline; + ratio=2*diff/(led_response_online+led_response_offline); + + ratio = led_response_online/led_response_offline; + + hChargeChannelsOnline.fill(channel_id,led_response_online); + hChargeChannelsOffline.fill(channel_id,led_response_offline); + hChargeChannelsRatio.fill(channel_id,ratio); + hChargeChannelsRatioAll.fill(ratio); + if ((column==-14)&&(row==-2)) continue; + hChargeChannelsRatio2D.fill(column,row,ratio); + } + } } Modified: java/trunk/users/src/main/java/org/hps/users/celentan/RawPedestalComputator.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/celentan/RawPedestalComputator.java (original) +++ java/trunk/users/src/main/java/org/hps/users/celentan/RawPedestalComputator.java Wed Mar 9 11:43:24 2016 @@ -22,122 +22,122 @@ public class RawPedestalComputator extends Driver { - String inputCollectionRaw = "EcalReadoutHits"; - int row, column; - double energy; + String inputCollectionRaw = "EcalReadoutHits"; + int row, column; + double energy; - int[] windowRaw = new int[47 * 11];// in case we have the raw waveform, this is the window lenght (in samples) - boolean[] isFirstRaw = new boolean[47 * 11]; + int[] windowRaw = new int[47 * 11];// in case we have the raw waveform, this is the window lenght (in samples) + boolean[] isFirstRaw = new boolean[47 * 11]; - double[] pedestal = new double[47 * 11]; - double[] noise = new double[47 * 11]; - double[] result; + double[] pedestal = new double[47 * 11]; + double[] noise = new double[47 * 11]; + double[] result; - int pedSamples = 50; - int nEvents = 0; + int pedSamples = 50; + int nEvents = 0; - private EcalConditions conditions; - private IIdentifierHelper helper; - private int systemId; + private EcalConditions conditions; + private IIdentifierHelper helper; + private int systemId; - @Override - public void detectorChanged(Detector detector) { + @Override + public void detectorChanged(Detector detector) { - DatabaseConditionsManager manager = DatabaseConditionsManager.getInstance(); - this.conditions = manager.getCachedConditions(EcalConditions.class, "ecal_conditions").getCachedData(); - this.helper = detector.getSubdetector("Ecal").getDetectorElement().getIdentifierHelper(); - this.systemId = detector.getSubdetector("Ecal").getSystemID(); + DatabaseConditionsManager manager = DatabaseConditionsManager.getInstance(); + this.conditions = manager.getCachedConditions(EcalConditions.class, "ecal_conditions").getCachedData(); + this.helper = detector.getSubdetector("Ecal").getDetectorElement().getIdentifierHelper(); + this.systemId = detector.getSubdetector("Ecal").getSystemID(); - System.out.println("Pedestal computator: detector changed"); - for (int ii = 0; ii < 11 * 47; ii++) { - isFirstRaw[ii] = true; - pedestal[ii] = 0; - noise[ii] = 0; - } - } + System.out.println("Pedestal computator: detector changed"); + for (int ii = 0; ii < 11 * 47; ii++) { + isFirstRaw[ii] = true; + pedestal[ii] = 0; + noise[ii] = 0; + } + } - @Override - public void process(EventHeader event) { - int ii = 0; - if (event.hasCollection(RawTrackerHit.class, inputCollectionRaw)) { - List<RawTrackerHit> hits = event.get(RawTrackerHit.class, inputCollectionRaw); - for (RawTrackerHit hit : hits) { - row = hit.getIdentifierFieldValue("iy"); - column = hit.getIdentifierFieldValue("ix"); - ii = EcalMonitoringUtilities.getHistoIDFromRowColumn(row, column); - if ((row != 0) && (column != 0)) { - if (!EcalMonitoringUtilities.isInHole(row, column)) { - if (isFirstRaw[ii]) { // at the very first hit we read for this channel, we need to read the window length and save it - isFirstRaw[ii] = false; - windowRaw[ii] = hit.getADCValues().length; - } - result = EcalUtils.computeAmplitude(hit.getADCValues(), windowRaw[ii], pedSamples); - pedestal[ii] += result[1]; - noise[ii] += result[2]; - } - } - } - } + @Override + public void process(EventHeader event) { + int ii = 0; + if (event.hasCollection(RawTrackerHit.class, inputCollectionRaw)) { + List<RawTrackerHit> hits = event.get(RawTrackerHit.class, inputCollectionRaw); + for (RawTrackerHit hit : hits) { + row = hit.getIdentifierFieldValue("iy"); + column = hit.getIdentifierFieldValue("ix"); + ii = EcalMonitoringUtilities.getHistoIDFromRowColumn(row, column); + if ((row != 0) && (column != 0)) { + if (!EcalMonitoringUtilities.isInHole(row, column)) { + if (isFirstRaw[ii]) { // at the very first hit we read for this channel, we need to read the window length and save it + isFirstRaw[ii] = false; + windowRaw[ii] = hit.getADCValues().length; + } + result = EcalUtils.computeAmplitude(hit.getADCValues(), windowRaw[ii], pedSamples); + pedestal[ii] += result[1]; + noise[ii] += result[2]; + } + } + } + } - if (event.hasCollection(CalorimeterHit.class, "EcalCalHits")) { - List<CalorimeterHit> hits = event.get(CalorimeterHit.class,"EcalCalHits"); - for (CalorimeterHit hit : hits) { - column = hit.getIdentifierFieldValue("ix"); - row = hit.getIdentifierFieldValue("iy"); - energy = hit.getCorrectedEnergy(); - System.out.println("Row: "+row+" Column "+column+" Energy: "+energy); - } - } + if (event.hasCollection(CalorimeterHit.class, "EcalCalHits")) { + List<CalorimeterHit> hits = event.get(CalorimeterHit.class,"EcalCalHits"); + for (CalorimeterHit hit : hits) { + column = hit.getIdentifierFieldValue("ix"); + row = hit.getIdentifierFieldValue("iy"); + energy = hit.getCorrectedEnergy(); + System.out.println("Row: "+row+" Column "+column+" Energy: "+energy); + } + } - nEvents++; - } + nEvents++; + } - @Override - public void endOfData() { - try { - PrintWriter writerTop = new PrintWriter("default01.ped", "UTF-8"); - PrintWriter writerBottom = new PrintWriter("default02.ped", "UTF-8"); + @Override + public void endOfData() { + try { + PrintWriter writerTop = new PrintWriter("default01.ped", "UTF-8"); + PrintWriter writerBottom = new PrintWriter("default02.ped", "UTF-8"); - for (int ii = 0; ii < 11 * 47; ii++) { - int row, column; - row = EcalMonitoringUtilities.getRowFromHistoID(ii); - column = EcalMonitoringUtilities.getColumnFromHistoID(ii); - if (EcalMonitoringUtilities.isInHole(row, column)) - continue; - if ((row == 0) || (column == 0)) - continue; - pedestal[ii] /= nEvents; - noise[ii] /= nEvents; + for (int ii = 0; ii < 11 * 47; ii++) { + int row, column; + row = EcalMonitoringUtilities.getRowFromHistoID(ii); + column = EcalMonitoringUtilities.getColumnFromHistoID(ii); + if (EcalMonitoringUtilities.isInHole(row, column)) + continue; + if ((row == 0) || (column == 0)) + continue; + pedestal[ii] /= nEvents; + noise[ii] /= nEvents; - // FIXME: Is this right? --JM - EcalChannel ecalChannel = conditions.getChannelCollection().findChannel(new GeometryId(helper, new int[] {systemId, column, row})); - int crate = ecalChannel.getCrate(); - int slot = ecalChannel.getSlot(); - int channel = ecalChannel.getChannel(); + // FIXME: Is this right? --JM + EcalChannel ecalChannel = conditions.getChannelCollection().findChannel(new GeometryId(helper, new int[] {systemId, column, row})); + int crate = ecalChannel.getCrate(); + int slot = ecalChannel.getSlot(); + int channel = ecalChannel.getChannel(); - System.out.println(column + " " + row + " " + crate + " " + slot + " " + channel + " " + pedestal[ii] + " " + noise[ii]); + System.out.println(column + " " + row + " " + crate + " " + slot + " " + channel + " " + pedestal[ii] + " " + noise[ii]); - if (crate == 37) { - writerTop.print(slot + " " + channel + " " + (int) (Math.round(pedestal[ii])) + " " + (int) (Math.round(noise[ii])) + "\r\n"); - } else if (crate == 39) { - writerBottom.print(slot + " " + channel + " " + (int) (Math.round(pedestal[ii])) + " " + (int) (Math.round(noise[ii])) + "\r\n"); - } + if (crate == 37) { + writerTop.print(slot + " " + channel + " " + (int) (Math.round(pedestal[ii])) + " " + (int) (Math.round(noise[ii])) + "\r\n"); + } else if (crate == 39) { + writerBottom.print(slot + " " + channel + " " + (int) (Math.round(pedestal[ii])) + " " + (int) (Math.round(noise[ii])) + "\r\n"); + } - } + } - writerTop.close(); - writerBottom.close(); - } catch (FileNotFoundException fnfe) { + writerTop.close(); + writerBottom.close(); + } catch (FileNotFoundException fnfe) { - System.out.println(fnfe.getMessage()); + System.out.println(fnfe.getMessage()); - } + } - catch (IOException ioe) { + catch (IOException ioe) { - System.out.println(ioe.getMessage()); + System.out.println(ioe.getMessage()); - } - } + } + } } Modified: java/trunk/users/src/main/java/org/hps/users/celentan/StripChartTest.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/celentan/StripChartTest.java (original) +++ java/trunk/users/src/main/java/org/hps/users/celentan/StripChartTest.java Wed Mar 9 11:43:24 2016 @@ -6,5 +6,5 @@ */ public class StripChartTest { - int dummy; + int dummy; } Modified: java/trunk/users/src/main/java/org/hps/users/holly/ClusterDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/holly/ClusterDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/holly/ClusterDriver.java Wed Mar 9 11:43:24 2016 @@ -84,8 +84,8 @@ * @param correctionClusterCollectionName */ public void setCorrectionClusterCollectionName(String correctionClusterCollectionName){ - this.correctionClusterCollectionName = correctionClusterCollectionName; - getLogger().config("correctionClusterCollectionName = " + this.correctionClusterCollectionName); + this.correctionClusterCollectionName = correctionClusterCollectionName; + getLogger().config("correctionClusterCollectionName = " + this.correctionClusterCollectionName); } /** @@ -147,7 +147,7 @@ * @param copyClusterCollection */ public void setCopyClusterCollection(boolean copyClusterCollection) { - this.copyClusterCollection = copyClusterCollection; + this.copyClusterCollection = copyClusterCollection; } /** @@ -267,9 +267,9 @@ event.put(outputClusterCollectionName, clusters, Cluster.class, flags); if (copyClusterCollection - && event.hasCollection(Cluster.class, outputClusterCollectionName)){ - List<Cluster> clusterCopy = event.get(Cluster.class, outputClusterCollectionName); - event.put(correctionClusterCollectionName,clusterCopy,Cluster.class,flags); + && event.hasCollection(Cluster.class, outputClusterCollectionName)){ + List<Cluster> clusterCopy = event.get(Cluster.class, outputClusterCollectionName); + event.put(correctionClusterCollectionName,clusterCopy,Cluster.class,flags); } if (!this.writeClusterCollection) { Modified: java/trunk/users/src/main/java/org/hps/users/holly/EcalClusterICPosition.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/holly/EcalClusterICPosition.java (original) +++ java/trunk/users/src/main/java/org/hps/users/holly/EcalClusterICPosition.java Wed Mar 9 11:43:24 2016 @@ -53,7 +53,7 @@ * */ public class EcalClusterICPosition extends Driver { - // File writer to output cluster results. + // File writer to output cluster results. FileWriter writeHits; // LCIO collection name for calorimeter hits. String ecalCollectionName="EcalCalHits"; @@ -95,7 +95,7 @@ public void setTrackerCollectionName(String trackerCollectionName){ - this.trackerCollectionName = trackerCollectionName; + this.trackerCollectionName = trackerCollectionName; } @@ -112,7 +112,7 @@ } public void setRejectedHitName(String rejectedHitName){ - this.rejectedHitName = rejectedHitName; + this.rejectedHitName = rejectedHitName; } /** @@ -176,7 +176,7 @@ //get the list of Ecal scoring Tracker hits public ArrayList<SimTrackerHit> trackHits = new ArrayList<SimTrackerHit>(); public void addTrackHit(SimTrackerHit trHit){ - trackHits.add(trHit); + trackHits.add(trHit); } // Make a map for quick calculation of the x-y position of crystal face @@ -187,11 +187,11 @@ //attempt for mc particle list public void addMCGen(MCParticle genMC){ - mcList.add(genMC); + mcList.add(genMC); } public void startOfData() { - // Make sure that the calorimeter hit collection name is defined. + // Make sure that the calorimeter hit collection name is defined. if (ecalCollectionName == null) { throw new RuntimeException("The parameter ecalCollectionName was not set!"); } @@ -211,25 +211,25 @@ public void detectorChanged(Detector detector) { // Get the calorimeter. - HPSEcal3 ecal = (HPSEcal3) detector.getSubdetector(ecalName); - + HPSEcal3 ecal = (HPSEcal3) detector.getSubdetector(ecalName); + // Store the map of neighbor crystals for the current calorimeter set-up. neighborMap = ecal.getNeighborMap(); } public void process(EventHeader event) { - // Make sure the current event contains calorimeter hits. + // Make sure the current event contains calorimeter hits. if (event.hasCollection(CalorimeterHit.class, ecalCollectionName)) { - - // Get generated hits + + // Get generated hits List<MCParticle> genPart = event.getMCParticles(); for(MCParticle m : genPart){ - mcList.add(m); + mcList.add(m); } List<SimTrackerHit> trHit = event.get(SimTrackerHit.class, trackerCollectionName); for (SimTrackerHit t : trHit){ - trackHits.add(t); + trackHits.add(t); } @@ -241,13 +241,13 @@ } public void createClusters(EventHeader event) throws IOException { - - // Create a list to store the event hits in. + + // Create a list to store the event hits in. List<CalorimeterHit> hitList = new ArrayList<CalorimeterHit>(); List<CalorimeterHit> baseList = event.get(CalorimeterHit.class, ecalCollectionName); for(CalorimeterHit r : baseList) { - hitEnergyMap.put(r, (r.getCorrectedEnergy()+rNum.nextGaussian()*0.003)); - hitList.add(r); + hitEnergyMap.put(r, (r.getCorrectedEnergy()+rNum.nextGaussian()*0.003)); + hitList.add(r); } // Create a list to store the newly created clusters in. @@ -263,32 +263,32 @@ // designated threshold. filterLoop: for(int index = hitList.size() - 1; index >= 0; index--) { - // If the hit is below threshold or outside of time window, kill it. -/* if((hitList.get(index).getCorrectedEnergy() < hitEnergyThreshold)|| - (timeCut && (hitList.get(index).getTime() < minTime || hitList.get(index).getTime() > (minTime + timeWindow)))) { - rejectedHitList.add(hitList.get(index)); - hitList.remove(index); - }*/ - if((hitEnergyMap.get(hitList.get(index))< hitEnergyThreshold)|| - (timeCut && (hitList.get(index).getTime() < minTime || hitList.get(index).getTime() > (minTime + timeWindow)))) { - rejectedHitList.add(hitList.get(index)); - hitList.remove(index); - } - - - - - - // Since the hits are sorted by energy from highest to - // lowest, any hit that is above threshold means that all - // subsequent hits will also be above threshold. Continue through - // list to check in time window. - else { continue; } - } - - // Create a map to connect the cell ID of a calorimeter crystal + // If the hit is below threshold or outside of time window, kill it. +/* if((hitList.get(index).getCorrectedEnergy() < hitEnergyThreshold)|| + (timeCut && (hitList.get(index).getTime() < minTime || hitList.get(index).getTime() > (minTime + timeWindow)))) { + rejectedHitList.add(hitList.get(index)); + hitList.remove(index); + }*/ + if((hitEnergyMap.get(hitList.get(index))< hitEnergyThreshold)|| + (timeCut && (hitList.get(index).getTime() < minTime || hitList.get(index).getTime() > (minTime + timeWindow)))) { + rejectedHitList.add(hitList.get(index)); + hitList.remove(index); + } + + + + + + // Since the hits are sorted by energy from highest to + // lowest, any hit that is above threshold means that all + // subsequent hits will also be above threshold. Continue through + // list to check in time window. + else { continue; } + } + + // Create a map to connect the cell ID of a calorimeter crystal // to the hit which occurred in that crystal. - HashMap<Long, CalorimeterHit> hitMap = new HashMap<Long, CalorimeterHit>(); + HashMap<Long, CalorimeterHit> hitMap = new HashMap<Long, CalorimeterHit>(); for (CalorimeterHit hit : hitList) { hitMap.put(hit.getCellID(), hit); } // Map a crystal to a list of all clusters in which it is a member. @@ -297,13 +297,13 @@ // Map a crystal to the seed of the cluster of which it is a member. HashMap<CalorimeterHit, CalorimeterHit> hitSeedMap = new HashMap<CalorimeterHit, CalorimeterHit>(); - // Set containing hits immediately around a seed hit. - HashSet<CalorimeterHit> surrSeedSet = new HashSet<CalorimeterHit>(); + // Set containing hits immediately around a seed hit. + HashSet<CalorimeterHit> surrSeedSet = new HashSet<CalorimeterHit>(); // Loop through all calorimeter hits to locate seeds and perform // first pass calculations for component and common hits. for (CalorimeterHit hit : hitList) { - // Get the set of all neighboring crystals to the current hit. + // Get the set of all neighboring crystals to the current hit. Set<Long> neighbors = neighborMap.get(hit.getCellID()); // Generate a list to store any neighboring hits in. @@ -313,11 +313,11 @@ // which corresponds to a neighbor, add it to the list of // neighboring hits. for (Long neighbor : neighbors) { - // Get the neighboring hit. - CalorimeterHit neighborHit = hitMap.get(neighbor); - - // If it exists, add it to the list. - if(neighborHit != null) { neighborHits.add(neighborHit); } + // Get the neighboring hit. + CalorimeterHit neighborHit = hitMap.get(neighbor); + + // If it exists, add it to the list. + if(neighborHit != null) { neighborHits.add(neighborHit); } } // Track whether the current hit is a seed hit or not. @@ -328,10 +328,10 @@ // neighboring hits. seedHitLoop: for(CalorimeterHit neighbor : neighborHits) { - if(!equalEnergies(hit, neighbor)) { - isSeed = false; - break seedHitLoop; - } + if(!equalEnergies(hit, neighbor)) { + isSeed = false; + break seedHitLoop; + } } @@ -343,22 +343,22 @@ else { // Sort through the list of neighboring hits. for (CalorimeterHit neighborHit : neighborHits) { - // Check whether the neighboring hit is a seed. - if(hitSeedMap.get(neighborHit) == neighborHit) { + // Check whether the neighboring hit is a seed. + if(hitSeedMap.get(neighborHit) == neighborHit) { // If the neighboring hit is a seed hit and the // current hit has been associated with a cluster, // then it is a common hit between its previous // seed and the neighboring seed. if (hitSeedMap.containsKey(hit)) { - // Check and see if a list of common seeds - // for this hit already exists or not. - List<CalorimeterHit> commonHitList = commonHits.get(hit); - - // If it does not, make a new one. - if(commonHitList == null) { commonHitList = new ArrayList<CalorimeterHit>(); } - - // Add the neighbors to the seeds to set of - // common seeds. + // Check and see if a list of common seeds + // for this hit already exists or not. + List<CalorimeterHit> commonHitList = commonHits.get(hit); + + // If it does not, make a new one. + if(commonHitList == null) { commonHitList = new ArrayList<CalorimeterHit>(); } + + // Add the neighbors to the seeds to set of + // common seeds. commonHitList.add(neighborHit); commonHitList.add(hitSeedMap.get(hit)); @@ -368,14 +368,14 @@ } // If the neighboring hit is a seed hit and the - // current hit has not been added to a cluster yet - // associate it with the neighboring seed and note + // current hit has not been added to a cluster yet + // associate it with the neighboring seed and note // that it has been clustered. else { - hitSeedMap.put(hit, neighborHit); - surrSeedSet.add(hit); + hitSeedMap.put(hit, neighborHit); + surrSeedSet.add(hit); } - } + } } } } // End primary seed loop. @@ -383,11 +383,11 @@ // Performs second pass calculations for component hits. secondaryHitsLoop: for (CalorimeterHit secondaryHit : hitList) { - // If the secondary hit is not associated with a seed, then - // the rest of there is nothing further to be done. - if(!hitSeedMap.containsKey(secondaryHit)) { continue secondaryHitsLoop; } - - // Get the secondary hit's neighboring crystals. + // If the secondary hit is not associated with a seed, then + // the rest of there is nothing further to be done. + if(!hitSeedMap.containsKey(secondaryHit)) { continue secondaryHitsLoop; } + + // Get the secondary hit's neighboring crystals. Set<Long> secondaryNeighbors = neighborMap.get(secondaryHit.getCellID()); // Make a list to store the hits associated with the @@ -396,27 +396,27 @@ // Loop through the neighboring crystals. for (Long secondaryNeighbor : secondaryNeighbors) { - // Get the hit associated with the neighboring crystal. - CalorimeterHit secondaryNeighborHit = hitMap.get(secondaryNeighbor); - - // If the neighboring crystal exists and is not already - // in a cluster, add it to the list of neighboring hits. + // Get the hit associated with the neighboring crystal. + CalorimeterHit secondaryNeighborHit = hitMap.get(secondaryNeighbor); + + // If the neighboring crystal exists and is not already + // in a cluster, add it to the list of neighboring hits. if (secondaryNeighborHit != null && !hitSeedMap.containsKey(secondaryNeighborHit)) { //!clusteredHitSet.contains(secondaryNeighborHit)) { - secondaryNeighborHits.add(secondaryNeighborHit); + secondaryNeighborHits.add(secondaryNeighborHit); } } // Loop over the secondary neighbor hits. for (CalorimeterHit secondaryNeighborHit : secondaryNeighborHits) { - // If the neighboring hit is of lower energy than the - // current secondary hit, then associate the neighboring - // hit with the current secondary hit's seed. - - // if (secondaryNeighborHit.getCorrectedEnergy() < secondaryHit.getCorrectedEnergy()) { - if(!equalEnergies(secondaryNeighborHit, secondaryHit)) { - hitSeedMap.put(secondaryNeighborHit, hitSeedMap.get(secondaryHit)); + // If the neighboring hit is of lower energy than the + // current secondary hit, then associate the neighboring + // hit with the current secondary hit's seed. + + // if (secondaryNeighborHit.getCorrectedEnergy() < secondaryHit.getCorrectedEnergy()) { + if(!equalEnergies(secondaryNeighborHit, secondaryHit)) { + hitSeedMap.put(secondaryNeighborHit, hitSeedMap.get(secondaryHit)); } - else {continue;} + else {continue;} } } // End component hits loop. @@ -427,10 +427,10 @@ // Performs second pass calculations for common hits. commonHitsLoop: for (CalorimeterHit clusteredHit : hitSeedMap.keySet()) { - // Seed hits are never common hits and can be skipped. - if(hitSeedMap.get(clusteredHit) == clusteredHit || surrSeedSet.contains(clusteredHit)) { continue commonHitsLoop; } - - // Get the current clustered hit's neighboring crystals. + // Seed hits are never common hits and can be skipped. + if(hitSeedMap.get(clusteredHit) == clusteredHit || surrSeedSet.contains(clusteredHit)) { continue commonHitsLoop; } + + // Get the current clustered hit's neighboring crystals. Set<Long> clusteredNeighbors = neighborMap.get(clusteredHit.getCellID()); // Store a list of all the clustered hits neighboring @@ -439,12 +439,12 @@ // Loop through the neighbors and see if they have hits. for (Long neighbor : clusteredNeighbors) { - // Get the hit associated with the neighbor. - CalorimeterHit clusteredNeighborHit = hitMap.get(neighbor); - - // If it exists, add it to the neighboring hit list. + // Get the hit associated with the neighbor. + CalorimeterHit clusteredNeighborHit = hitMap.get(neighbor); + + // If it exists, add it to the neighboring hit list. if (clusteredNeighborHit != null) { - clusteredNeighborHits.add(clusteredNeighborHit); + clusteredNeighborHits.add(clusteredNeighborHit); } } @@ -453,25 +453,25 @@ // Loop over the clustered neighbor hits. for (CalorimeterHit clusteredNeighborHit : clusteredNeighborHits) { - // Check to make sure that the clustered neighbor hit - // is not already associated with the current clustered - // hit's seed. - + // Check to make sure that the clustered neighbor hit + // is not already associated with the current clustered + // hit's seed. + if (hitSeedMap.get(clusteredNeighborHit) != clusteredHitSeed){ //if (clusteredHit.getCorrectedEnergy() < clusteredNeighborHit.getCorrectedEnergy()) { - if(!equalEnergies(clusteredHit, clusteredNeighborHit)){ - // Check and see if a list of common seeds - // for this hit already exists or not. - List<CalorimeterHit> commonHitList = commonHits.get(clusteredHit); - - // If it does not, make a new one. - if(commonHitList == null) { commonHitList = new ArrayList<CalorimeterHit>(); } - - // Add the neighbors to the seeds to set of - // common seeds. + if(!equalEnergies(clusteredHit, clusteredNeighborHit)){ + // Check and see if a list of common seeds + // for this hit already exists or not. + List<CalorimeterHit> commonHitList = commonHits.get(clusteredHit); + + // If it does not, make a new one. + if(commonHitList == null) { commonHitList = new ArrayList<CalorimeterHit>(); } + + // Add the neighbors to the seeds to set of + // common seeds. commonHitList.add(clusteredHitSeed); - commonHitList.add(hitSeedMap.get(clusteredNeighborHit)); + commonHitList.add(hitSeedMap.get(clusteredNeighborHit)); // Put the common seed list back into the set. commonHits.put(clusteredHit, commonHitList); @@ -485,7 +485,7 @@ // Remove any common hits from the clustered hits collection. for(CalorimeterHit commonHit : commonHits.keySet()) { - hitSeedMap.remove(commonHit); + hitSeedMap.remove(commonHit); } @@ -501,7 +501,7 @@ // Get energy of each cluster, excluding common hits for (CalorimeterHit iSeed : hitList) { if(hitSeedMap.get(iSeed) == iSeed) { - seedEnergy.put(iSeed, 0.0); + seedEnergy.put(iSeed, 0.0); } } @@ -517,24 +517,24 @@ Map<CalorimeterHit, Double> seedEnergyTot = seedEnergy; for (Map.Entry<CalorimeterHit, List<CalorimeterHit>> entry1 : commonHits.entrySet()) { - CalorimeterHit commonCell = entry1.getKey(); - CalorimeterHit seedA = entry1.getValue().get(0); - CalorimeterHit seedB = entry1.getValue().get(1); - double eFractionA = seedEnergy.get(seedA)/(seedEnergy.get(seedA)+seedEnergy.get(seedB)); - double eFractionB = seedEnergy.get(seedB)/(seedEnergy.get(seedA)+seedEnergy.get(seedB)); - double currEnergyA = seedEnergyTot.get(seedA); - double currEnergyB = seedEnergyTot.get(seedB); - currEnergyA += eFractionA * (hitEnergyMap.get(commonCell)); - currEnergyB += eFractionB * (hitEnergyMap.get(commonCell)); - - seedEnergyTot.put(seedA, currEnergyA); - seedEnergyTot.put(seedB, currEnergyB); + CalorimeterHit commonCell = entry1.getKey(); + CalorimeterHit seedA = entry1.getValue().get(0); + CalorimeterHit seedB = entry1.getValue().get(1); + double eFractionA = seedEnergy.get(seedA)/(seedEnergy.get(seedA)+seedEnergy.get(seedB)); + double eFractionB = seedEnergy.get(seedB)/(seedEnergy.get(seedA)+seedEnergy.get(seedB)); + double currEnergyA = seedEnergyTot.get(seedA); + double currEnergyB = seedEnergyTot.get(seedB); + currEnergyA += eFractionA * (hitEnergyMap.get(commonCell)); + currEnergyB += eFractionB * (hitEnergyMap.get(commonCell)); + + seedEnergyTot.put(seedA, currEnergyA); + seedEnergyTot.put(seedB, currEnergyB); } // Choose only the highest energy cluster List<CalorimeterHit> seedList = new ArrayList<CalorimeterHit>(); for (Map.Entry<CalorimeterHit, Double> entry1 : seedEnergyTot.entrySet()) { - seedList.add(entry1.getKey()); + seedList.add(entry1.getKey()); } Collections.sort(seedList, new EnergyComparator()); @@ -550,64 +550,64 @@ double w0 = 3.1; for (Map.Entry<CalorimeterHit, CalorimeterHit> entry1 : hitSeedMap.entrySet()) { - CalorimeterHit eSeed1 = entry1.getValue(); - if(seedList.get(0)==eSeed1){// Check for if belonging to highest seed only. - - - // Method 3 calculation. - // Calculates x-y centroid for each crystal face -// IGeometryInfo geom = entry1.getKey().getDetectorElement().getGeometry(); -// double[] pos = geom.transformLocalToGlobal(VecOp.add(geom.transformGlobalToLocal(geom.getPosition()),(Hep3Vector)new BasicHep3Vector(0,0,-1*((Trd)geom.getLogicalVolume().getSolid()).getZHalfLength()))).v(); - - /////////////////////////////// - // Get the hit indices as a Point. - int ix = entry1.getKey().getIdentifierFieldValue("ix"); - int iy = entry1.getKey().getIdentifierFieldValue("iy"); - Point hitIndex = new Point(ix, iy); - - // Get the corrected position for this index pair. - Double[] position = correctedPositionMap.get(hitIndex); - - // If the result is null, it hasn't been calculated yet. - if(position == null) { - // Calculate the corrected position. - IGeometryInfo geom = entry1.getKey().getDetectorElement().getGeometry(); - double[] pos = geom.transformLocalToGlobal(VecOp.add(geom.transformGlobalToLocal(geom.getPosition()),(Hep3Vector)new BasicHep3Vector(0,0,-1*((Trd)geom.getLogicalVolume().getSolid()).getZHalfLength()))).v(); - - // Convert the result to a Double[] array. - position = new Double[3]; - position[0] = pos[0]; - position[1] = pos[1]; - position[2] = pos[2]; - - // Store the result in the map. - correctedPositionMap.put(hitIndex, position); -// writeHits.append("\t"+ix+"\t"+iy+"\t"+position[0]+"\t"+position[1]+"\n"); //write out slic crystal maps - } - /////////////////////////////// - // Method 3: - eNumX += Math.max(0.0,(w0+Math.log((hitEnergyMap.get(entry1.getKey())) - /seedEnergyTot.get(eSeed1))))*(correctedPositionMap.get(hitIndex)[0]/10.0); - eNumY += Math.max(0.0,(w0+Math.log((hitEnergyMap.get(entry1.getKey())) - /seedEnergyTot.get(eSeed1))))*(correctedPositionMap.get(hitIndex)[1]/10.0); - eDen += Math.max(0.0, w0+Math.log((hitEnergyMap.get(entry1.getKey()))/ - seedEnergyTot.get(eSeed1))); - - // Method 1: -/* eNumX += (hitEnergyMap.get(entry1.getKey()))*correctedPositionMap.get(hitIndex)[0]/10.0; - eNumY += (hitEnergyMap.get(entry1.getKey()))*correctedPositionMap.get(hitIndex)[1]/10.0; - eDen += hitEnergyMap.get(entry1.getKey()); -*/ - - - //Method 2: -/* eNumX += Math.log10(1000*(hitEnergyMap.get(entry1.getKey())))*correctedPositionMap.get(hitIndex)[0]/10.0; - eNumY += Math.log10(1000*(hitEnergyMap.get(entry1.getKey())))*correctedPositionMap.get(hitIndex)[1]/10.0; - eDen += Math.log10(1000*(hitEnergyMap.get(entry1.getKey()))); -*/ - crystalAngle = 0.967826*(eSeed1.getIdentifierFieldValue("ix")); - - } + CalorimeterHit eSeed1 = entry1.getValue(); + if(seedList.get(0)==eSeed1){// Check for if belonging to highest seed only. + + + // Method 3 calculation. + // Calculates x-y centroid for each crystal face +// IGeometryInfo geom = entry1.getKey().getDetectorElement().getGeometry(); +// double[] pos = geom.transformLocalToGlobal(VecOp.add(geom.transformGlobalToLocal(geom.getPosition()),(Hep3Vector)new BasicHep3Vector(0,0,-1*((Trd)geom.getLogicalVolume().getSolid()).getZHalfLength()))).v(); + + /////////////////////////////// + // Get the hit indices as a Point. + int ix = entry1.getKey().getIdentifierFieldValue("ix"); + int iy = entry1.getKey().getIdentifierFieldValue("iy"); + Point hitIndex = new Point(ix, iy); + + // Get the corrected position for this index pair. + Double[] position = correctedPositionMap.get(hitIndex); + + // If the result is null, it hasn't been calculated yet. + if(position == null) { + // Calculate the corrected position. + IGeometryInfo geom = entry1.getKey().getDetectorElement().getGeometry(); + double[] pos = geom.transformLocalToGlobal(VecOp.add(geom.transformGlobalToLocal(geom.getPosition()),(Hep3Vector)new BasicHep3Vector(0,0,-1*((Trd)geom.getLogicalVolume().getSolid()).getZHalfLength()))).v(); + + // Convert the result to a Double[] array. + position = new Double[3]; + position[0] = pos[0]; + position[1] = pos[1]; + position[2] = pos[2]; + + // Store the result in the map. + correctedPositionMap.put(hitIndex, position); +// writeHits.append("\t"+ix+"\t"+iy+"\t"+position[0]+"\t"+position[1]+"\n"); //write out slic crystal maps + } + /////////////////////////////// + // Method 3: + eNumX += Math.max(0.0,(w0+Math.log((hitEnergyMap.get(entry1.getKey())) + /seedEnergyTot.get(eSeed1))))*(correctedPositionMap.get(hitIndex)[0]/10.0); + eNumY += Math.max(0.0,(w0+Math.log((hitEnergyMap.get(entry1.getKey())) + /seedEnergyTot.get(eSeed1))))*(correctedPositionMap.get(hitIndex)[1]/10.0); + eDen += Math.max(0.0, w0+Math.log((hitEnergyMap.get(entry1.getKey()))/ + seedEnergyTot.get(eSeed1))); + + // Method 1: +/* eNumX += (hitEnergyMap.get(entry1.getKey()))*correctedPositionMap.get(hitIndex)[0]/10.0; + eNumY += (hitEnergyMap.get(entry1.getKey()))*correctedPositionMap.get(hitIndex)[1]/10.0; + eDen += hitEnergyMap.get(entry1.getKey()); +*/ + + + //Method 2: +/* eNumX += Math.log10(1000*(hitEnergyMap.get(entry1.getKey())))*correctedPositionMap.get(hitIndex)[0]/10.0; + eNumY += Math.log10(1000*(hitEnergyMap.get(entry1.getKey())))*correctedPositionMap.get(hitIndex)[1]/10.0; + eDen += Math.log10(1000*(hitEnergyMap.get(entry1.getKey()))); +*/ + crystalAngle = 0.967826*(eSeed1.getIdentifierFieldValue("ix")); + + } } @@ -621,36 +621,36 @@ if(trackHits.size() != 0 ){ - - // Calculates the final generated particle position - double d0 = 139.3 - trackHits.get(0).getPositionVec().z()/10.0; - double px = trackHits.get(0).getMomentum()[0]; - double py = trackHits.get(0).getMomentum()[1]; - double pz = trackHits.get(0).getMomentum()[2]; - double xpos = trackHits.get(0).getPosition()[0]/10.0; - double ypos = trackHits.get(0).getPosition()[1]/10.0; - - double xGen = xpos + d0*px/pz; - double yGen = ypos + d0*py/pz; - - boolean validNum = false; - if((Math.abs(xCl)>0)&&(Math.abs(yCl)>0)&&(Math.abs(xGen)>0)&&(Math.abs(yGen)>0)){ - validNum=true; - } - - - - //position fitting -// writeHits.append("\t"+seedList.get(0).getIdentifierFieldValue("ix")+"\t"+seedList.get(0).getIdentifierFieldValue("iy")+"\t" -// +xCl+"\t"+yCl+"\t"+xF+"\t"+yF+"\t"+mcList.get(0).getEnergy()+"\t"+crystalAngle+"\t"+ECl+"\n"); - if(validNum==true){ -// writeHits.append("\t"+xCl+"\t"+yCl+"\t"+xGen+"\t"+yGen+"\t"+mcList.get(0).getEnergy()+"\t"+crystalAngle+"\t"+ECl+"\n"); - - } - - } - - + + // Calculates the final generated particle position + double d0 = 139.3 - trackHits.get(0).getPositionVec().z()/10.0; + double px = trackHits.get(0).getMomentum()[0]; + double py = trackHits.get(0).getMomentum()[1]; + double pz = trackHits.get(0).getMomentum()[2]; + double xpos = trackHits.get(0).getPosition()[0]/10.0; + double ypos = trackHits.get(0).getPosition()[1]/10.0; + + double xGen = xpos + d0*px/pz; + double yGen = ypos + d0*py/pz; + + boolean validNum = false; + if((Math.abs(xCl)>0)&&(Math.abs(yCl)>0)&&(Math.abs(xGen)>0)&&(Math.abs(yGen)>0)){ + validNum=true; + } + + + + //position fitting +// writeHits.append("\t"+seedList.get(0).getIdentifierFieldValue("ix")+"\t"+seedList.get(0).getIdentifierFieldValue("iy")+"\t" +// +xCl+"\t"+yCl+"\t"+xF+"\t"+yF+"\t"+mcList.get(0).getEnergy()+"\t"+crystalAngle+"\t"+ECl+"\n"); + if(validNum==true){ +// writeHits.append("\t"+xCl+"\t"+yCl+"\t"+xGen+"\t"+yGen+"\t"+mcList.get(0).getEnergy()+"\t"+crystalAngle+"\t"+ECl+"\n"); + + } + + } + + }// end seedList.size != 0 int flag = 1 << LCIOConstants.CLBIT_HITS; @@ -663,95 +663,95 @@ public void endOfData() { - // Close the event display output writer. + // Close the event display output writer. try { writeHits.close(); } catch (IOException e) { } } private static class EnergyComparator implements Comparator<CalorimeterHit> { - /** - * Compares the first hit with respect to the second. This - * method will compare hits first by energy, and the spatially. - * In the case of equal energy hits, the hit closest to the - * beam gap and closest to the positron side of the detector - * will be selected. If all of these conditions are true, the - * hit with the positive y-index will be selected. Hits with - * all four conditions matching are the same hit. - * @param hit1 The hit to compare. - * @param hit2 The hit with respect to which the first should - * be compared. - */ + /** + * Compares the first hit with respect to the second. This + * method will compare hits first by energy, and the spatially. + * In the case of equal energy hits, the hit closest to the + * beam gap and closest to the positron side of the detector + * will be selected. If all of these conditions are true, the + * hit with the positive y-index will be selected. Hits with + * all four conditions matching are the same hit. + * @param hit1 The hit to compare. + * @param hit2 The hit with respect to which the first should + * be compared. + */ public int compare(CalorimeterHit hit1, CalorimeterHit hit2) { - // Hits are sorted on a hierarchy by three conditions. First, - // the hits with the highest energy come first. Next, they - // are ranked by vertical proximity to the beam gap, and - // lastly, they are sorted by horizontal proximity to the - // positron side of the detector. - - // Get the hit energies. - double[] e = { hit1.getCorrectedEnergy(), hit2.getCorrectedEnergy() }; - - // Perform the energy comparison. The higher energy hit - // will be ordered first. - if(e[0] < e[1]) { return 1; } - else if(e[0] > e[1]) { return -1; } - - // If the hits are the same energy, we must perform the - // spatial comparisons. - else { - // Get the position with respect to the beam gap. - int[] iy = { Math.abs(hit1.getIdentifierFieldValue("iy")), Math.abs(hit2.getIdentifierFieldValue("iy")) }; - - // The closest hit is first. - if(iy[0] > iy[1]) { return -1; } - else if(iy[0] < iy[1]) { return 1; } - - // Hits that are identical in vertical distance from - // beam gap and energy are differentiated with distance - // horizontally from the positron side of the detector. - else { - // Get the position from the positron side. - int[] ix = { hit1.getIdentifierFieldValue("ix"), hit2.getIdentifierFieldValue("ix") }; - - // The closest hit is first. - if(ix[0] > ix[1]) { return 1; } - else if(ix[0] < ix[1]) { return -1; } - - // If all of these checks are the same, compare - // the raw value for iy. If these are identical, - // then the two hits are the same. Otherwise, sort - // the numerical value of iy. (This removes the - // issue where hits (x, y) and (x, -y) can have - // the same energy and be otherwise seen as the - // same hit from the above checks. - else { return Integer.compare(hit1.getIdentifierFieldValue("iy"), hit2.getIdentifierFieldValue("iy")); } - } - } + // Hits are sorted on a hierarchy by three conditions. First, + // the hits with the highest energy come first. Next, they + // are ranked by vertical proximity to the beam gap, and + // lastly, they are sorted by horizontal proximity to the + // positron side of the detector. + + // Get the hit energies. + double[] e = { hit1.getCorrectedEnergy(), hit2.getCorrectedEnergy() }; + + // Perform the energy comparison. The higher energy hit + // will be ordered first. + if(e[0] < e[1]) { return 1; } + else if(e[0] > e[1]) { return -1; } + + // If the hits are the same energy, we must perform the + // spatial comparisons. + else { + // Get the position with respect to the beam gap. + int[] iy = { Math.abs(hit1.getIdentifierFieldValue("iy")), Math.abs(hit2.getIdentifierFieldValue("iy")) }; + + // The closest hit is first. + if(iy[0] > iy[1]) { return -1; } + else if(iy[0] < iy[1]) { return 1; } + + // Hits that are identical in vertical distance from + // beam gap and energy are differentiated with distance + // horizontally from the positron side of the detector. + else { + // Get the position from the positron side. + int[] ix = { hit1.getIdentifierFieldValue("ix"), hit2.getIdentifierFieldValue("ix") }; + + // The closest hit is first. + if(ix[0] > ix[1]) { return 1; } + else if(ix[0] < ix[1]) { return -1; } + + // If all of these checks are the same, compare + // the raw value for iy. If these are identical, + // then the two hits are the same. Otherwise, sort + // the numerical value of iy. (This removes the + // issue where hits (x, y) and (x, -y) can have + // the same energy and be otherwise seen as the + // same hit from the above checks. + else { return Integer.compare(hit1.getIdentifierFieldValue("iy"), hit2.getIdentifierFieldValue("iy")); } + } + } } } // Handles pathological case where multiple neighboring crystals have EXACTLY the same energy. private boolean equalEnergies(CalorimeterHit hit, CalorimeterHit neighbor){ - boolean isSeed = true; - - int hix = hit.getIdentifierFieldValue("ix"); - int hiy = Math.abs(hit.getIdentifierFieldValue("iy")); - int nix = neighbor.getIdentifierFieldValue("ix"); - int niy = Math.abs(neighbor.getIdentifierFieldValue("iy")); - double hE = hit.getCorrectedEnergy(); - double nE = neighbor.getCorrectedEnergy(); - if(hE < nE) { - isSeed = false; - } - else if((hE == nE) && (hiy > niy)) { - isSeed = false; - } - else if((hE == nE) && (hiy == niy) && (hix > nix)) { - isSeed = false; - } - return isSeed; + boolean isSeed = true; + + int hix = hit.getIdentifierFieldValue("ix"); + int hiy = Math.abs(hit.getIdentifierFieldValue("iy")); + int nix = neighbor.getIdentifierFieldValue("ix"); + int niy = Math.abs(neighbor.getIdentifierFieldValue("iy")); + double hE = hit.getCorrectedEnergy(); + double nE = neighbor.getCorrectedEnergy(); + if(hE < nE) { + isSeed = false; + } + else if((hE == nE) && (hiy > niy)) { + isSeed = false; + } + else if((hE == nE) && (hiy == niy) && (hix > nix)) { + isSeed = false; + } + return isSeed; } Modified: java/trunk/users/src/main/java/org/hps/users/holly/EcalClustererCosmics.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/holly/EcalClustererCosmics.java (original) +++ java/trunk/users/src/main/java/org/hps/users/holly/EcalClustererCosmics.java Wed Mar 9 11:43:24 2016 @@ -124,13 +124,13 @@ // Loop over ECal hits to find cluster seeds. for (CalorimeterHit hit : map.values()) { - // int ix = hit.getIdentifierFieldValue("ix"); + // int ix = hit.getIdentifierFieldValue("ix"); // int iy = hit.getIdentifierFieldValue("iy"); // System.out.println("ix = "+ix); // System.out.println("iy = "+iy); - - // Cut on min seed E. + + // Cut on min seed E. if (hit.getRawEnergy() < seedEMin) { continue; } Modified: java/trunk/users/src/main/java/org/hps/users/holly/EcalRawConverter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/holly/EcalRawConverter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/holly/EcalRawConverter.java Wed Mar 9 11:43:24 2016 @@ -106,42 +106,42 @@ private EcalConditions ecalConditions = null; public EcalRawConverter() { - // Track changes in the DAQ configuration. - ConfigurationManager.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - // If the DAQ configuration should be used, load the - // relevant settings into the driver. - if(useDAQConfig) { - // Get the FADC configuration. - config = ConfigurationManager.getInstance().getFADCConfig(); - - // Load the settings. - NSB = config.getNSB(); - NSA = config.getNSA(); - windowSamples = config.getWindowWidth() / 4; - - // Get the number of peaks. - if(config.getMode() == 1) { - nPeak = Integer.MAX_VALUE; - } else { - nPeak = config.getMaxPulses(); - } - - // Print the FADC configuration. - System.out.println(); - System.out.println(); - System.out.printf("NSA :: %d ns%n", NSA); - System.out.printf("NSB :: %d ns%n", NSB); - System.out.printf("Window Samples :: %d clock-cycles%n", windowSamples); - System.out.printf("Max Peaks :: %d peaks%n", nPeak); - System.out.println("======================================================================"); - System.out.println("=== FADC Pulse-Processing Settings ==================================="); - System.out.println("======================================================================"); - config.printConfig(System.out); - } - } - }); + // Track changes in the DAQ configuration. + ConfigurationManager.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + // If the DAQ configuration should be used, load the + // relevant settings into the driver. + if(useDAQConfig) { + // Get the FADC configuration. + config = ConfigurationManager.getInstance().getFADCConfig(); + + // Load the settings. + NSB = config.getNSB(); + NSA = config.getNSA(); + windowSamples = config.getWindowWidth() / 4; + + // Get the number of peaks. + if(config.getMode() == 1) { + nPeak = Integer.MAX_VALUE; + } else { + nPeak = config.getMaxPulses(); + } + + // Print the FADC configuration. + System.out.println(); + System.out.println(); + System.out.printf("NSA :: %d ns%n", NSA); + System.out.printf("NSB :: %d ns%n", NSB); + System.out.printf("Window Samples :: %d clock-cycles%n", windowSamples); + System.out.printf("Max Peaks :: %d peaks%n", nPeak); + System.out.println("======================================================================"); + System.out.println("=== FADC Pulse-Processing Settings ==================================="); + System.out.println("======================================================================"); + config.printConfig(System.out); + } + } + }); } public void setLeadingEdgeThreshold(double thresh) { @@ -196,7 +196,7 @@ } public void setUseDAQConfig(boolean state) { - useDAQConfig = state; + useDAQConfig = state; } /* @@ -206,10 +206,10 @@ EcalChannelConstants channelData = findChannel(hit.getCellID()); double pedestal; if(useDAQConfig) { - //EcalChannel channel = ecalConditions.getChannelCollection().findGeometric(hit.getCellID()); - pedestal = config.getPedestal(hit.getCellID()); + //EcalChannel channel = ecalConditions.getChannelCollection().findGeometric(hit.getCellID()); + pedestal = config.getPedestal(hit.getCellID()); } else { - pedestal = channelData.getCalibration().getPedestal(); + pedestal = channelData.getCalibration().getPedestal(); } int sum = 0; @@ -237,10 +237,10 @@ * Choose whether to use static pedestal from database or running pedestal from mode-7. */ public double getSingleSamplePedestal(EventHeader event,long cellID) { - if(useDAQConfig) { - //EcalChannel channel = ecalConditions.getChannelCollection().findGeometric(cellID); - return config.getPedestal(cellID); - } + if(useDAQConfig) { + //EcalChannel channel = ecalConditions.getChannelCollection().findGeometric(cellID); + return config.getPedestal(cellID); + } if (useRunningPedestal && event!=null) { if (event.hasItem("EcalRunningPedestals")) { Map<EcalChannel, Double> runningPedMap = (Map<EcalChannel, Double>) event.get("EcalRunningPedestals"); @@ -409,12 +409,12 @@ // threshold is pedestal plus threshold configuration parameter: final int absoluteThreshold; if(useDAQConfig) { - //EcalChannel channel = ecalConditions.getChannelCollection().findGeometric(hit.getCellID()); - //int leadingEdgeThreshold = ConfigurationManager.getInstance().getFADCConfig().getThreshold(channel.getChannelId()); - int leadingEdgeThreshold = config.getThreshold(cellID); - absoluteThreshold = (int) (getSingleSamplePedestal(event, cellID) + leadingEdgeThreshold); + //EcalChannel channel = ecalConditions.getChannelCollection().findGeometric(hit.getCellID()); + //int leadingEdgeThreshold = ConfigurationManager.getInstance().getFADCConfig().getThreshold(channel.getChannelId()); + int leadingEdgeThreshold = config.getThreshold(cellID); + absoluteThreshold = (int) (getSingleSamplePedestal(event, cellID) + leadingEdgeThreshold); } else { - absoluteThreshold = (int) (getSingleSamplePedestal(event, cellID) + leadingEdgeThreshold); + absoluteThreshold = (int) (getSingleSamplePedestal(event, cellID) + leadingEdgeThreshold); } ArrayList <Integer> thresholdCrossings = new ArrayList<Integer>(); @@ -435,10 +435,10 @@ // search for next threshold crossing begins at end of this pulse: if(useDAQConfig && ConfigurationManager.getInstance().getFADCConfig().getMode() == 1) { // special case, emulating SSP: - ii += 8; + ii += 8; } else { // "normal" case, emulating FADC250: - ii += NSA/nsPerSample - 1; + ii += NSA/nsPerSample - 1; } // firmware limit on # of peaks: @@ -532,8 +532,8 @@ EcalChannelConstants channelData = findChannel(cellID); if(useDAQConfig) { - //float gain = ConfigurationManager.getInstance().getFADCConfig().getGain(ecalConditions.getChannelCollection().findGeometric(cellID)); - return config.getGain(cellID) * adcSum * EcalUtils.MeV; + //float gain = ConfigurationManager.getInstance().getFADCConfig().getGain(ecalConditions.getChannelCollection().findGeometric(cellID)); + return config.getGain(cellID) * adcSum * EcalUtils.MeV; } else if(use2014Gain) { if (constantGain) { return adcSum * EcalUtils.gainFactor * EcalUtils.ecalReadoutPeriod; Modified: java/trunk/users/src/main/java/org/hps/users/holly/HPSEcalClusterIC.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/holly/HPSEcalClusterIC.java (original) +++ java/trunk/users/src/main/java/org/hps/users/holly/HPSEcalClusterIC.java Wed Mar 9 11:43:24 2016 @@ -55,11 +55,11 @@ } public void addSharedHit(CalorimeterHit sharedHit) { - sharedHitList.add(sharedHit); + sharedHitList.add(sharedHit); } public List<CalorimeterHit> getSharedHits() { - return sharedHitList; + return sharedHitList; } // public double[] getPosition() { @@ -155,12 +155,12 @@ for(int i=0;i<hits.size();i++) { CalorimeterHit hit = hits.get(i); - // CalorimeterIDDecoder decoder = hit.getDecoder(); - // decoder.setID(hit.getCellID()); - // double[] pos = new double[3]; - // pos[0] = decoder.getX(); - // pos[1] = decoder.getY(); - // pos[2] = decoder.getZ(); + // CalorimeterIDDecoder decoder = hit.getDecoder(); + // decoder.setID(hit.getCellID()); + // double[] pos = new double[3]; + // pos[0] = decoder.getX(); + // pos[1] = decoder.getY(); + // pos[2] = decoder.getZ(); //double[] pos = hit.getPosition(); //Find position at shower max IGeometryInfo geom = hit.getDetectorElement().getGeometry(); @@ -296,104 +296,104 @@ EV[1] = E2; EV[2] = E3; // Now calculate principal axes - // For eigenvalue EV, the axis is (nx, ny, nz) where: - // (Exx - EV)nx + (Exy)ny + (Exz)nz = 0 - // (Eyx)nx + (Eyy - EV)ny + (Eyz)nz = 0 - // (Ezx)nx + (Ezy)ny + (Ezz - EV)nz = 0 - // Setting nx = 1, we have: - // (Exx - EV) + (Exy)ny + (Exz)nz = 0 - // (Eyx) + (Eyy - EV)ny + (Eyz)nz = 0 - // (Ezx) + (Ezy)ny + (Ezz - EV)nz = 0 - // and so - // (Exy)ny = EV - Exx - (Exz)nz => ny = (EV - Exx - Exz*nz)/Exy - // What if Exy = 0? Then provided Eyz is non-zero we can write: - // (Ezx) + (Ezy)ny + (Ezz - EV)nz = 0 - // ny = (Exz - (Ezz-EV)*nz)/Eyz - // What if Exy = 0 and Eyz = 0 but (Eyy - EV) is non-zero? - // (Eyy - EV)ny + (Eyz)nz = 0 - // ny = -(Eyz*nz)/(Eyy-EV) - - // In the pathological case where Exz = Eyz = Ezz = 0: - // (Exx - EV)nx + (Exy)ny = 0 => ny/nx = -(Exx-EV)/Exy - // (Eyx)nx + (Eyy - EV)ny = 0 => ny/nx = -Eyx/(Eyy-EV) - // (EV)nz = 0 - // so - // -ny/nx = (EV-Exx)/Exy = Eyx/(EV-Eyy) - // But watch out for order! Recalculate eigenvalues for this pathological case. - // (EV-Exx)(EV-Eyy) = Eyx*Exy - // EV^2 - EV(Exx+Eyy) + Exx*Eyy - Eyx*Exy = 0 - // - // In another pathological case, Exz = Exy = 0: - // (Exx - EV)nx = 0 - // (Eyy - EV)ny + (Eyz)nz = 0 => ny/nz = -(Eyz)/(Eyy-EV) - // (Ezy)ny + (Ezz - EV)nz = 0 => ny/nz = -(Ezz-EV)/(Ezy) - // so we cannot set nx = 1. Instead, write: - // -ny/nz = (Eyz)/(Eyy-EV) = (Ezz-EV)/(Ezy) - // Then - // (Eyz)(Ezy) = (Eyy-EV)(Ezz-EV) - // (Eyz)^2 = (Eyy)(Ezz) - (Eyy)(EV) - (Ezz)(EV) + (EV)^2 - // EV^2 - EV(Eyy+Ezz) + Eyy*Ezz - Eyz*Eyz = 0 - - // Handle pathological case - if (Exz == 0.0 && Eyz == 0.0) { - // Recompute eigenvectors. - EV[0] = 0.5*(Exx+Eyy) + 0.5*Math.sqrt((Exx+Eyy)*(Exx+Eyy) + 4.0*Exy*Exy); - EV[1] = 0.5*(Exx+Eyy) - 0.5*Math.sqrt((Exx+Eyy)*(Exx+Eyy) + 4.0*Exy*Exy); - EV[2] = 0.0; - for( int i = 0 ; i < 2 ; i++ ) { - double nx_over_ny = Exy / (Exx-EV[i]); - double nx_unnormalized = nx_over_ny; - double ny_unnormalized = 1.0; - double norm = Math.sqrt(nx_unnormalized*nx_unnormalized + ny_unnormalized*ny_unnormalized); - mm_PA[i][0] = ny_unnormalized/norm; - mm_PA[i][1] = nx_unnormalized/norm; - mm_PA[i][2] = 0.0; - } - // ... and now set third eigenvector to the z direction: - mm_PA[2][0] = 0.0; - mm_PA[2][1] = 0.0; - mm_PA[2][2] = 1.0; - } else if (Exz == 0.0 && Exy == 0.0) { - // Another pathological case - EV[0] = 0.5*(Eyy+Ezz) + 0.5*Math.sqrt((Eyy+Ezz)*(Eyy+Ezz) + 4.0*Eyz*Eyz); - EV[1] = 0.5*(Eyy+Ezz) - 0.5*Math.sqrt((Eyy+Ezz)*(Eyy+Ezz) + 4.0*Eyz*Eyz); - EV[2] = 0.0; - for( int i = 0 ; i < 2 ; i++ ) { - double ny_over_nz = Eyz / (Eyy-EV[i]); - double ny_unnormalized = ny_over_nz; - double nz_unnormalized = 1.0; - double norm = Math.sqrt(ny_unnormalized*ny_unnormalized + nz_unnormalized*nz_unnormalized); - mm_PA[i][0] = nz_unnormalized/norm; - mm_PA[i][1] = ny_unnormalized/norm; - mm_PA[i][2] = 0.0; - } - mm_PA[2][0] = 0.0; - mm_PA[2][1] = 0.0; - mm_PA[2][2] = 1.0; - } else { - for( int i = 0 ; i < 3 ; i++ ) - { - double[] C = new double[3]; - C[0] = 1.0; - C[2] = (Exy*Exy + (Eyy - EV[i])*(EV[i] - Exx))/ - ((Eyy - EV[i])*Exz - Eyz*Exy); - C[1] = (EV[i] - Exx - Exz*C[2])/Exy; - if (Exy == 0.0) { - // Recompute - if (Eyz != 0.0) { - // ny = (Exz - (Ezz-EV)*nz)/Eyz - C[1] = (Exz - (Ezz-EV[i])*C[2])/Eyz; - } else { - // ny = -(Eyz*nz)/(Eyy-EV) - C[1] = -(Eyz*C[2])/(Eyy-EV[i]); - } - } - double norm = Math.sqrt(C[0]*C[0] + C[1]*C[1] + C[2]*C[2]); - mm_PA[i][0] = C[0]/norm; - mm_PA[i][1] = C[1]/norm; - mm_PA[i][2] = C[2]/norm; - } - } + // For eigenvalue EV, the axis is (nx, ny, nz) where: + // (Exx - EV)nx + (Exy)ny + (Exz)nz = 0 + // (Eyx)nx + (Eyy - EV)ny + (Eyz)nz = 0 + // (Ezx)nx + (Ezy)ny + (Ezz - EV)nz = 0 + // Setting nx = 1, we have: + // (Exx - EV) + (Exy)ny + (Exz)nz = 0 + // (Eyx) + (Eyy - EV)ny + (Eyz)nz = 0 + // (Ezx) + (Ezy)ny + (Ezz - EV)nz = 0 + // and so + // (Exy)ny = EV - Exx - (Exz)nz => ny = (EV - Exx - Exz*nz)/Exy + // What if Exy = 0? Then provided Eyz is non-zero we can write: + // (Ezx) + (Ezy)ny + (Ezz - EV)nz = 0 + // ny = (Exz - (Ezz-EV)*nz)/Eyz + // What if Exy = 0 and Eyz = 0 but (Eyy - EV) is non-zero? + // (Eyy - EV)ny + (Eyz)nz = 0 + // ny = -(Eyz*nz)/(Eyy-EV) + + // In the pathological case where Exz = Eyz = Ezz = 0: + // (Exx - EV)nx + (Exy)ny = 0 => ny/nx = -(Exx-EV)/Exy + // (Eyx)nx + (Eyy - EV)ny = 0 => ny/nx = -Eyx/(Eyy-EV) + // (EV)nz = 0 + // so + // -ny/nx = (EV-Exx)/Exy = Eyx/(EV-Eyy) + // But watch out for order! Recalculate eigenvalues for this pathological case. + // (EV-Exx)(EV-Eyy) = Eyx*Exy + // EV^2 - EV(Exx+Eyy) + Exx*Eyy - Eyx*Exy = 0 + // + // In another pathological case, Exz = Exy = 0: + // (Exx - EV)nx = 0 + // (Eyy - EV)ny + (Eyz)nz = 0 => ny/nz = -(Eyz)/(Eyy-EV) + // (Ezy)ny + (Ezz - EV)nz = 0 => ny/nz = -(Ezz-EV)/(Ezy) + // so we cannot set nx = 1. Instead, write: + // -ny/nz = (Eyz)/(Eyy-EV) = (Ezz-EV)/(Ezy) + // Then + // (Eyz)(Ezy) = (Eyy-EV)(Ezz-EV) + // (Eyz)^2 = (Eyy)(Ezz) - (Eyy)(EV) - (Ezz)(EV) + (EV)^2 + // EV^2 - EV(Eyy+Ezz) + Eyy*Ezz - Eyz*Eyz = 0 + + // Handle pathological case + if (Exz == 0.0 && Eyz == 0.0) { + // Recompute eigenvectors. + EV[0] = 0.5*(Exx+Eyy) + 0.5*Math.sqrt((Exx+Eyy)*(Exx+Eyy) + 4.0*Exy*Exy); + EV[1] = 0.5*(Exx+Eyy) - 0.5*Math.sqrt((Exx+Eyy)*(Exx+Eyy) + 4.0*Exy*Exy); + EV[2] = 0.0; + for( int i = 0 ; i < 2 ; i++ ) { + double nx_over_ny = Exy / (Exx-EV[i]); + double nx_unnormalized = nx_over_ny; + double ny_unnormalized = 1.0; + double norm = Math.sqrt(nx_unnormalized*nx_unnormalized + ny_unnormalized*ny_unnormalized); + mm_PA[i][0] = ny_unnormalized/norm; + mm_PA[i][1] = nx_unnormalized/norm; + mm_PA[i][2] = 0.0; + } + // ... and now set third eigenvector to the z direction: + mm_PA[2][0] = 0.0; + mm_PA[2][1] = 0.0; + mm_PA[2][2] = 1.0; + } else if (Exz == 0.0 && Exy == 0.0) { + // Another pathological case + EV[0] = 0.5*(Eyy+Ezz) + 0.5*Math.sqrt((Eyy+Ezz)*(Eyy+Ezz) + 4.0*Eyz*Eyz); + EV[1] = 0.5*(Eyy+Ezz) - 0.5*Math.sqrt((Eyy+Ezz)*(Eyy+Ezz) + 4.0*Eyz*Eyz); + EV[2] = 0.0; + for( int i = 0 ; i < 2 ; i++ ) { + double ny_over_nz = Eyz / (Eyy-EV[i]); + double ny_unnormalized = ny_over_nz; + double nz_unnormalized = 1.0; + double norm = Math.sqrt(ny_unnormalized*ny_unnormalized + nz_unnormalized*nz_unnormalized); + mm_PA[i][0] = nz_unnormalized/norm; + mm_PA[i][1] = ny_unnormalized/norm; + mm_PA[i][2] = 0.0; + } + mm_PA[2][0] = 0.0; + mm_PA[2][1] = 0.0; + mm_PA[2][2] = 1.0; + } else { + for( int i = 0 ; i < 3 ; i++ ) + { + double[] C = new double[3]; + C[0] = 1.0; + C[2] = (Exy*Exy + (Eyy - EV[i])*(EV[i] - Exx))/ + ((Eyy - EV[i])*Exz - Eyz*Exy); + C[1] = (EV[i] - Exx - Exz*C[2])/Exy; + if (Exy == 0.0) { + // Recompute + if (Eyz != 0.0) { + // ny = (Exz - (Ezz-EV)*nz)/Eyz + C[1] = (Exz - (Ezz-EV[i])*C[2])/Eyz; + } else { + // ny = -(Eyz*nz)/(Eyy-EV) + C[1] = -(Eyz*C[2])/(Eyy-EV[i]); + } + } + double norm = Math.sqrt(C[0]*C[0] + C[1]*C[1] + C[2]*C[2]); + mm_PA[i][0] = C[0]/norm; + mm_PA[i][1] = C[1]/norm; + mm_PA[i][2] = C[2]/norm; + } + } } mm_NE[0] = NE1; mm_NE[1] = NE2; @@ -417,7 +417,7 @@ double dr = Math.sqrt( (position[0]+mm_PA[0][0])*(position[0]+mm_PA[0][0]) + (position[1]+mm_PA[0][1])*(position[1]+mm_PA[0][1]) + (position[2]+mm_PA[0][2])*(position[2]+mm_PA[0][2]) ) - - Math.sqrt( (position[0])*(position[0]) + + Math.sqrt( (position[0])*(position[0]) + (position[1])*(position[1]) + (position[2])*(position[2]) ) ; double sign = 1.; Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/ClusterAnalysisDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/ClusterAnalysisDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/ClusterAnalysisDriver.java Wed Mar 9 11:43:24 2016 @@ -11,84 +11,84 @@ import org.lcsim.util.aida.AIDA; public class ClusterAnalysisDriver extends Driver { - // Analysis plots. + // Analysis plots. AIDA aida = AIDA.defaultInstance(); - IHistogram1D clusterTotalEnergy; - IHistogram1D clusterSeedEnergy; - IHistogram1D clusterHitCount; - IHistogram2D clusterDistribution; - - IHistogram1D fClusterTotalEnergy; - IHistogram1D fClusterSeedEnergy; - IHistogram1D fClusterHitCount; - IHistogram2D fClusterDistribution; - - IHistogram1D nClusterTotalEnergy; - IHistogram1D nClusterSeedEnergy; - IHistogram1D nClusterHitCount; - IHistogram2D nClusterDistribution; - - // Hit collection names. - private String clusterCollectionName = "EcalClusters"; - - public void setClusterCollectionName(String clusterCollectionName) { - this.clusterCollectionName = clusterCollectionName; - } - - @Override - public void startOfData() { - // Initialize the histograms. - clusterTotalEnergy = aida.histogram1D("Cluster Plot :: Cluster Total Energy", 110, 0.00, 2.2); - clusterSeedEnergy = aida.histogram1D("Cluster Plot :: Seed Hit Energy", 110, 0.00, 2.2); - clusterHitCount = aida.histogram1D("Cluster Plot :: Cluster Hit Count", 8, 1, 9); - clusterDistribution = aida.histogram2D("Cluster Plot :: Seed Hit Distribution", 46, -23, 23, 11, -5.5, 5.5); - - // Initialize the filtered histograms. - fClusterTotalEnergy = aida.histogram1D("Cluster Plot :: Cluster Total Energy (Over 100 MeV)", 110, 0.00, 2.2); - fClusterSeedEnergy = aida.histogram1D("Cluster Plot :: Seed Hit Energy (Over 100 MeV)", 110, 0.00, 2.2); - fClusterHitCount = aida.histogram1D("Cluster Plot :: Cluster Hit Count (Over 100 MeV)", 8, 1, 9); - fClusterDistribution = aida.histogram2D("Cluster Plot :: Seed Hit Distribution (Over 100 MeV)", 46, -23, 23, 11, -5.5, 5.5); - - // Initialize the more filtered histograms. - nClusterTotalEnergy = aida.histogram1D("Cluster Plot :: Cluster Total Energy (Over 100 MeV, > 1 Hit)", 110, 0.00, 2.2); - nClusterSeedEnergy = aida.histogram1D("Cluster Plot :: Seed Hit Energy (Over 100 MeV, > 1 Hit)", 110, 0.00, 2.2); - nClusterHitCount = aida.histogram1D("Cluster Plot :: Cluster Hit Count (Over 100 MeV, > 1 Hit)", 8, 1, 9); - nClusterDistribution = aida.histogram2D("Cluster Plot :: Seed Hit Distribution (Over 100 MeV, > 1 Hit)", 46, -23, 23, 11, -5.5, 5.5); - } - - public void process(EventHeader event) { - // Check if there exists a cluster collection. - if(event.hasCollection(Cluster.class, clusterCollectionName)) { - // Get the raw hit collection. - List<Cluster> clusterList = event.get(Cluster.class, clusterCollectionName); - - // Output the information on each hit to the histograms. - for(Cluster cluster : clusterList) { - // Get the x and y indices for the hits. - int ix = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"); - int iy = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy"); - if(ix > 0) { ix = ix - 1; } - - // Write to the histograms. - clusterTotalEnergy.fill(cluster.getEnergy()); - clusterSeedEnergy.fill(cluster.getCalorimeterHits().get(0).getCorrectedEnergy()); - clusterHitCount.fill(cluster.getCalorimeterHits().size()); - clusterDistribution.fill(ix, iy, 1.0); - - if(cluster.getCalorimeterHits().get(0).getCorrectedEnergy() > 0.100) { - fClusterTotalEnergy.fill(cluster.getEnergy()); - fClusterSeedEnergy.fill(cluster.getCalorimeterHits().get(0).getCorrectedEnergy()); - fClusterHitCount.fill(cluster.getCalorimeterHits().size()); - fClusterDistribution.fill(ix, iy, 1.0); - - if(cluster.getCalorimeterHits().size() > 1) { - nClusterTotalEnergy.fill(cluster.getEnergy()); - nClusterSeedEnergy.fill(cluster.getCalorimeterHits().get(0).getCorrectedEnergy()); - nClusterHitCount.fill(cluster.getCalorimeterHits().size()); - nClusterDistribution.fill(ix, iy, 1.0); - } - } - } - } - } + IHistogram1D clusterTotalEnergy; + IHistogram1D clusterSeedEnergy; + IHistogram1D clusterHitCount; + IHistogram2D clusterDistribution; + + IHistogram1D fClusterTotalEnergy; + IHistogram1D fClusterSeedEnergy; + IHistogram1D fClusterHitCount; + IHistogram2D fClusterDistribution; + + IHistogram1D nClusterTotalEnergy; + IHistogram1D nClusterSeedEnergy; + IHistogram1D nClusterHitCount; + IHistogram2D nClusterDistribution; + + // Hit collection names. + private String clusterCollectionName = "EcalClusters"; + + public void setClusterCollectionName(String clusterCollectionName) { + this.clusterCollectionName = clusterCollectionName; + } + + @Override + public void startOfData() { + // Initialize the histograms. + clusterTotalEnergy = aida.histogram1D("Cluster Plot :: Cluster Total Energy", 110, 0.00, 2.2); + clusterSeedEnergy = aida.histogram1D("Cluster Plot :: Seed Hit Energy", 110, 0.00, 2.2); + clusterHitCount = aida.histogram1D("Cluster Plot :: Cluster Hit Count", 8, 1, 9); + clusterDistribution = aida.histogram2D("Cluster Plot :: Seed Hit Distribution", 46, -23, 23, 11, -5.5, 5.5); + + // Initialize the filtered histograms. + fClusterTotalEnergy = aida.histogram1D("Cluster Plot :: Cluster Total Energy (Over 100 MeV)", 110, 0.00, 2.2); + fClusterSeedEnergy = aida.histogram1D("Cluster Plot :: Seed Hit Energy (Over 100 MeV)", 110, 0.00, 2.2); + fClusterHitCount = aida.histogram1D("Cluster Plot :: Cluster Hit Count (Over 100 MeV)", 8, 1, 9); + fClusterDistribution = aida.histogram2D("Cluster Plot :: Seed Hit Distribution (Over 100 MeV)", 46, -23, 23, 11, -5.5, 5.5); + + // Initialize the more filtered histograms. + nClusterTotalEnergy = aida.histogram1D("Cluster Plot :: Cluster Total Energy (Over 100 MeV, > 1 Hit)", 110, 0.00, 2.2); + nClusterSeedEnergy = aida.histogram1D("Cluster Plot :: Seed Hit Energy (Over 100 MeV, > 1 Hit)", 110, 0.00, 2.2); + nClusterHitCount = aida.histogram1D("Cluster Plot :: Cluster Hit Count (Over 100 MeV, > 1 Hit)", 8, 1, 9); + nClusterDistribution = aida.histogram2D("Cluster Plot :: Seed Hit Distribution (Over 100 MeV, > 1 Hit)", 46, -23, 23, 11, -5.5, 5.5); + } + + public void process(EventHeader event) { + // Check if there exists a cluster collection. + if(event.hasCollection(Cluster.class, clusterCollectionName)) { + // Get the raw hit collection. + List<Cluster> clusterList = event.get(Cluster.class, clusterCollectionName); + + // Output the information on each hit to the histograms. + for(Cluster cluster : clusterList) { + // Get the x and y indices for the hits. + int ix = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"); + int iy = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy"); + if(ix > 0) { ix = ix - 1; } + + // Write to the histograms. + clusterTotalEnergy.fill(cluster.getEnergy()); + clusterSeedEnergy.fill(cluster.getCalorimeterHits().get(0).getCorrectedEnergy()); + clusterHitCount.fill(cluster.getCalorimeterHits().size()); + clusterDistribution.fill(ix, iy, 1.0); + + if(cluster.getCalorimeterHits().get(0).getCorrectedEnergy() > 0.100) { + fClusterTotalEnergy.fill(cluster.getEnergy()); + fClusterSeedEnergy.fill(cluster.getCalorimeterHits().get(0).getCorrectedEnergy()); + fClusterHitCount.fill(cluster.getCalorimeterHits().size()); + fClusterDistribution.fill(ix, iy, 1.0); + + if(cluster.getCalorimeterHits().size() > 1) { + nClusterTotalEnergy.fill(cluster.getEnergy()); + nClusterSeedEnergy.fill(cluster.getCalorimeterHits().get(0).getCorrectedEnergy()); + nClusterHitCount.fill(cluster.getCalorimeterHits().size()); + nClusterDistribution.fill(ix, iy, 1.0); + } + } + } + } + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/CountTriggersDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/CountTriggersDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/CountTriggersDriver.java Wed Mar 9 11:43:24 2016 @@ -16,64 +16,64 @@ * @author Kyle McCarty <[log in to unmask]> */ public class CountTriggersDriver extends Driver { - // Store programmable parameters. - private String bankCollectionName = "TriggerBank"; - - // Track the number of triggers seen for each trigger type. - private int[] triggers = new int[6]; - private static final int PULSER = 0; - private static final int SINGLES0 = 1; - private static final int SINGLES1 = 2; - private static final int PAIR0 = 3; - private static final int PAIR1 = 4; - private static final int COSMIC = 5; - - /** - * Outputs the total number of triggers seen for each trigger type. - */ - @Override - public void endOfData() { - System.out.println("Trigger Counts:"); - System.out.printf("Singles 0 :: %d%n", triggers[SINGLES0]); - System.out.printf("Singles 1 :: %d%n", triggers[SINGLES1]); - System.out.printf("Pair 0 :: %d%n", triggers[PAIR0]); - System.out.printf("Pair 1 :: %d%n", triggers[PAIR1]); - System.out.printf("Pulser :: %d%n", triggers[PULSER]); - System.out.printf("Cosmic :: %d%n", triggers[COSMIC]); - } - - /** - * Checks whether a trigger of each given type was seen by the TI - * for each event and increments the total trigger count for that - * type as appropriate. - */ - @Override - public void process(EventHeader event) { - // Extract the TI bank from the data stream. - TIData tiBank = null; - if(event.hasCollection(GenericObject.class, bankCollectionName)) { - // Get the bank list. - List<GenericObject> bankList = event.get(GenericObject.class, bankCollectionName); - - // Search through the banks and get the TI bank. - for(GenericObject obj : bankList) { - if(AbstractIntData.getTag(obj) == TIData.BANK_TAG) { - tiBank = new TIData(obj); - } - } - } - - // If there is no TI bank, the event can not be processed. - if(tiBank == null) { - return; - } - - // Otherwise, increment the relevant trigger counts. - if(tiBank.isPulserTrigger()) { triggers[PULSER]++; } - if(tiBank.isSingle0Trigger()) { triggers[SINGLES0]++; } - if(tiBank.isSingle1Trigger()) { triggers[SINGLES1]++; } - if(tiBank.isPair0Trigger()) { triggers[PAIR0]++; } - if(tiBank.isPair1Trigger()) { triggers[PAIR1]++; } - if(tiBank.isCalibTrigger()) { triggers[COSMIC]++; } - } + // Store programmable parameters. + private String bankCollectionName = "TriggerBank"; + + // Track the number of triggers seen for each trigger type. + private int[] triggers = new int[6]; + private static final int PULSER = 0; + private static final int SINGLES0 = 1; + private static final int SINGLES1 = 2; + private static final int PAIR0 = 3; + private static final int PAIR1 = 4; + private static final int COSMIC = 5; + + /** + * Outputs the total number of triggers seen for each trigger type. + */ + @Override + public void endOfData() { + System.out.println("Trigger Counts:"); + System.out.printf("Singles 0 :: %d%n", triggers[SINGLES0]); + System.out.printf("Singles 1 :: %d%n", triggers[SINGLES1]); + System.out.printf("Pair 0 :: %d%n", triggers[PAIR0]); + System.out.printf("Pair 1 :: %d%n", triggers[PAIR1]); + System.out.printf("Pulser :: %d%n", triggers[PULSER]); + System.out.printf("Cosmic :: %d%n", triggers[COSMIC]); + } + + /** + * Checks whether a trigger of each given type was seen by the TI + * for each event and increments the total trigger count for that + * type as appropriate. + */ + @Override + public void process(EventHeader event) { + // Extract the TI bank from the data stream. + TIData tiBank = null; + if(event.hasCollection(GenericObject.class, bankCollectionName)) { + // Get the bank list. + List<GenericObject> bankList = event.get(GenericObject.class, bankCollectionName); + + // Search through the banks and get the TI bank. + for(GenericObject obj : bankList) { + if(AbstractIntData.getTag(obj) == TIData.BANK_TAG) { + tiBank = new TIData(obj); + } + } + } + + // If there is no TI bank, the event can not be processed. + if(tiBank == null) { + return; + } + + // Otherwise, increment the relevant trigger counts. + if(tiBank.isPulserTrigger()) { triggers[PULSER]++; } + if(tiBank.isSingle0Trigger()) { triggers[SINGLES0]++; } + if(tiBank.isSingle1Trigger()) { triggers[SINGLES1]++; } + if(tiBank.isPair0Trigger()) { triggers[PAIR0]++; } + if(tiBank.isPair1Trigger()) { triggers[PAIR1]++; } + if(tiBank.isCalibTrigger()) { triggers[COSMIC]++; } + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/EvioAnalysis.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/EvioAnalysis.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/EvioAnalysis.java Wed Mar 9 11:43:24 2016 @@ -17,17 +17,17 @@ import org.lcsim.util.aida.AIDA; public class EvioAnalysis extends Driver { - // Store index reference variables. + // Store index reference variables. private static final int RECON = 0; private static final int SSP = 1; - - // Create histogram arrays for cut distributions. + + // Create histogram arrays for cut distributions. private AIDA aida = AIDA.defaultInstance(); private IHistogram1D[] clusterEnergyPlot = new IHistogram1D[2]; private IHistogram1D[] clusterHitCountPlot = new IHistogram1D[2]; private IHistogram1D[] clusterTimePlot = new IHistogram1D[2]; - private IHistogram2D[] clusterSlopePlot = new IHistogram2D[2]; - + private IHistogram2D[] clusterSlopePlot = new IHistogram2D[2]; + private IHistogram1D[] pairClusterEnergyPlot = new IHistogram1D[2]; private IHistogram1D[] pairHitCountPlot = new IHistogram1D[2]; private IHistogram1D[] pairTimePlot = new IHistogram1D[2]; @@ -38,129 +38,129 @@ private IHistogram1D[] pairCoplanarityPlot = new IHistogram1D[2]; private IHistogram1D[] pairTriggerTimePlot = new IHistogram1D[2]; - // Store programmable values. - private String clusterCollectionName = "EcalClusters"; - private String bankCollectionName = "SSPData"; - private double energySlopeParamF = 0.0055; - private double beamEnergy = 1.1; - - @Override - public void startOfData() { - // Store the plot source type name. - String[] plotType = new String[2]; - plotType[RECON] = " (Recon)"; - plotType[SSP] = " (SSP)"; - - // Set the bin sizes based on the beam energy. - int bins = (int) beamEnergy * 100; - - for(int i = 0; i < 2; i++) { - // Instantiate the single cluster distribution plots. - clusterEnergyPlot[i] = aida.histogram1D("Raw/Cluster Energy" + plotType[i], bins, 0.0, beamEnergy); - clusterHitCountPlot[i] = aida.histogram1D("Raw/Cluster Hit Count" + plotType[i], 9, 0.5, 9.5); - clusterTimePlot[i] = aida.histogram1D("Raw/Cluster Time" + plotType[i], 100, 0, 400); - clusterSlopePlot[i] = aida.histogram2D("Raw/Cluster Energy Slope" + plotType[i], 300, 0.0, 3.0, 200, 0, 400); - - // Instantiate the cluster pair distribution plots. - pairSumPlot[i] = aida.histogram1D("Raw/Pair Energy Sum" + plotType[i], (int) 1.5 * bins, 0.0, 1.5 * beamEnergy); - pairSumEnergiesPlot[i] = aida.histogram2D("Raw/Pair 2D Energy Sum" + plotType[i], (int) 1.5 * bins, 0.0, 1.5 * beamEnergy, (int) 1.5 * bins, 0.0, 1.5 * beamEnergy); - pairDiffPlot[i] = aida.histogram1D("Raw/Pair Energy Difference" + plotType[i], bins, 0.0, beamEnergy); - pairSlopePlot[i] = aida.histogram1D("Raw/Pair Energy Slope" + plotType[i], 100, 0.0, 4.0); - pairCoplanarityPlot[i] = aida.histogram1D("Raw/Pair Coplanarity" + plotType[i], 180, 0.0, 180); - } - } - - @Override - public void process(EventHeader event) { - // Skip the event if there are no clusters. - if(!event.hasCollection(Cluster.class, clusterCollectionName) || !event.hasCollection(GenericObject.class, bankCollectionName)) { - return; - } - - // Get the list of clusters. - List<Cluster> clusters = event.get(Cluster.class, clusterCollectionName); - - // Get the SSP data bank. - List<GenericObject> bankList = event.get(GenericObject.class, bankCollectionName); - - // Get the SSP bank from the generic object bank list. - SSPData sspBank = null; - for(GenericObject obj : bankList) { - if(AbstractIntData.getTag(obj) == SSPData.BANK_TAG) { - sspBank = new SSPData(obj); - } - } - - // Make sure that the SSP bank was initialized. - if(sspBank == null) { - return; - } - - // Iterate over the reconstructed clusters and populate - // the singles plots. - for(Cluster cluster : clusters) { - // Get the cluster properties. - int hitCount = cluster.getCalorimeterHits().size(); - double x = TriggerModule.getClusterX(cluster); - double z = TriggerModule.getClusterZ(cluster); - double slopeParamR = Math.sqrt((x * x) + (z * z)); - - // Populate the plots. - clusterEnergyPlot[RECON].fill(cluster.getEnergy()); - clusterHitCountPlot[RECON].fill(cluster.getCalorimeterHits().size()); - clusterTimePlot[RECON].fill(cluster.getCalorimeterHits().get(0).getTime()); - clusterSlopePlot[RECON].fill(cluster.getEnergy(), slopeParamR); - } - - // Get the list of pairs. - List<Cluster[]> pairs = makePairs(clusters); - - // Iterate over the pairs and populate the pair plots. - for(Cluster[] pair : pairs) { - pairSumPlot[RECON].fill(TriggerModule.getValueEnergySum(pair)); - pairSumEnergiesPlot[RECON].fill(pair[0].getEnergy(), pair[1].getEnergy()); - pairDiffPlot[RECON].fill(TriggerModule.getValueEnergyDifference(pair)); - pairSlopePlot[RECON].fill(TriggerModule.getValueEnergySlope(pair, energySlopeParamF)); - pairCoplanarityPlot[RECON].fill(TriggerModule.getValueCoplanarity(pair)); - } - } - - private List<Cluster[]> makePairs(List<Cluster> clusters) { - // Create seperate lists for top and bottom clusters. - List<Cluster> topList = new ArrayList<Cluster>(); - List<Cluster> bottomList = new ArrayList<Cluster>(); - List<Cluster[]> pairList = new ArrayList<Cluster[]>(); - - // Sort the clusters into the appropriate list. - for(Cluster cluster : clusters) { - if(cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy") > 0) { - topList.add(cluster); - } else { - bottomList.add(cluster); - } - } - - // Create all possible cluster pairs. - for(Cluster topCluster : topList) { - for(Cluster bottomCluster : bottomList) { - Cluster[] pair = { topCluster, bottomCluster }; - pairList.add(pair); - } - } - - // Return the list of cluster pairs. - return pairList; - } - - public void setClusterCollectionName(String clusterCollectionName) { - this.clusterCollectionName = clusterCollectionName; - } - - public void setBankCollectionName(String bankCollectionName) { - this.bankCollectionName = bankCollectionName; - } - - public void setEnergySlopeParamF(double energySlopeParamF) { - this.energySlopeParamF = energySlopeParamF; - } + // Store programmable values. + private String clusterCollectionName = "EcalClusters"; + private String bankCollectionName = "SSPData"; + private double energySlopeParamF = 0.0055; + private double beamEnergy = 1.1; + + @Override + public void startOfData() { + // Store the plot source type name. + String[] plotType = new String[2]; + plotType[RECON] = " (Recon)"; + plotType[SSP] = " (SSP)"; + + // Set the bin sizes based on the beam energy. + int bins = (int) beamEnergy * 100; + + for(int i = 0; i < 2; i++) { + // Instantiate the single cluster distribution plots. + clusterEnergyPlot[i] = aida.histogram1D("Raw/Cluster Energy" + plotType[i], bins, 0.0, beamEnergy); + clusterHitCountPlot[i] = aida.histogram1D("Raw/Cluster Hit Count" + plotType[i], 9, 0.5, 9.5); + clusterTimePlot[i] = aida.histogram1D("Raw/Cluster Time" + plotType[i], 100, 0, 400); + clusterSlopePlot[i] = aida.histogram2D("Raw/Cluster Energy Slope" + plotType[i], 300, 0.0, 3.0, 200, 0, 400); + + // Instantiate the cluster pair distribution plots. + pairSumPlot[i] = aida.histogram1D("Raw/Pair Energy Sum" + plotType[i], (int) 1.5 * bins, 0.0, 1.5 * beamEnergy); + pairSumEnergiesPlot[i] = aida.histogram2D("Raw/Pair 2D Energy Sum" + plotType[i], (int) 1.5 * bins, 0.0, 1.5 * beamEnergy, (int) 1.5 * bins, 0.0, 1.5 * beamEnergy); + pairDiffPlot[i] = aida.histogram1D("Raw/Pair Energy Difference" + plotType[i], bins, 0.0, beamEnergy); + pairSlopePlot[i] = aida.histogram1D("Raw/Pair Energy Slope" + plotType[i], 100, 0.0, 4.0); + pairCoplanarityPlot[i] = aida.histogram1D("Raw/Pair Coplanarity" + plotType[i], 180, 0.0, 180); + } + } + + @Override + public void process(EventHeader event) { + // Skip the event if there are no clusters. + if(!event.hasCollection(Cluster.class, clusterCollectionName) || !event.hasCollection(GenericObject.class, bankCollectionName)) { + return; + } + + // Get the list of clusters. + List<Cluster> clusters = event.get(Cluster.class, clusterCollectionName); + + // Get the SSP data bank. + List<GenericObject> bankList = event.get(GenericObject.class, bankCollectionName); + + // Get the SSP bank from the generic object bank list. + SSPData sspBank = null; + for(GenericObject obj : bankList) { + if(AbstractIntData.getTag(obj) == SSPData.BANK_TAG) { + sspBank = new SSPData(obj); + } + } + + // Make sure that the SSP bank was initialized. + if(sspBank == null) { + return; + } + + // Iterate over the reconstructed clusters and populate + // the singles plots. + for(Cluster cluster : clusters) { + // Get the cluster properties. + int hitCount = cluster.getCalorimeterHits().size(); + double x = TriggerModule.getClusterX(cluster); + double z = TriggerModule.getClusterZ(cluster); + double slopeParamR = Math.sqrt((x * x) + (z * z)); + + // Populate the plots. + clusterEnergyPlot[RECON].fill(cluster.getEnergy()); + clusterHitCountPlot[RECON].fill(cluster.getCalorimeterHits().size()); + clusterTimePlot[RECON].fill(cluster.getCalorimeterHits().get(0).getTime()); + clusterSlopePlot[RECON].fill(cluster.getEnergy(), slopeParamR); + } + + // Get the list of pairs. + List<Cluster[]> pairs = makePairs(clusters); + + // Iterate over the pairs and populate the pair plots. + for(Cluster[] pair : pairs) { + pairSumPlot[RECON].fill(TriggerModule.getValueEnergySum(pair)); + pairSumEnergiesPlot[RECON].fill(pair[0].getEnergy(), pair[1].getEnergy()); + pairDiffPlot[RECON].fill(TriggerModule.getValueEnergyDifference(pair)); + pairSlopePlot[RECON].fill(TriggerModule.getValueEnergySlope(pair, energySlopeParamF)); + pairCoplanarityPlot[RECON].fill(TriggerModule.getValueCoplanarity(pair)); + } + } + + private List<Cluster[]> makePairs(List<Cluster> clusters) { + // Create seperate lists for top and bottom clusters. + List<Cluster> topList = new ArrayList<Cluster>(); + List<Cluster> bottomList = new ArrayList<Cluster>(); + List<Cluster[]> pairList = new ArrayList<Cluster[]>(); + + // Sort the clusters into the appropriate list. + for(Cluster cluster : clusters) { + if(cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy") > 0) { + topList.add(cluster); + } else { + bottomList.add(cluster); + } + } + + // Create all possible cluster pairs. + for(Cluster topCluster : topList) { + for(Cluster bottomCluster : bottomList) { + Cluster[] pair = { topCluster, bottomCluster }; + pairList.add(pair); + } + } + + // Return the list of cluster pairs. + return pairList; + } + + public void setClusterCollectionName(String clusterCollectionName) { + this.clusterCollectionName = clusterCollectionName; + } + + public void setBankCollectionName(String bankCollectionName) { + this.bankCollectionName = bankCollectionName; + } + + public void setEnergySlopeParamF(double energySlopeParamF) { + this.energySlopeParamF = energySlopeParamF; + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/FADCAnalysisDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/FADCAnalysisDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/FADCAnalysisDriver.java Wed Mar 9 11:43:24 2016 @@ -11,82 +11,82 @@ import org.lcsim.util.aida.AIDA; public class FADCAnalysisDriver extends Driver { - // Analysis plots. + // Analysis plots. AIDA aida = AIDA.defaultInstance(); - IHistogram1D rawHitEnergy; - IHistogram1D fadcHitEnergy; - IHistogram2D rawHitDistribution; - IHistogram2D fadcHitDistribution; - IHistogram2D fadcFilteredHitDistribution; - IHistogram1D eventRawHitCount; - IHistogram1D eventFADCHitCount; - - // Hit collection names. - private String rawHitsCollectionName = "EcalHits"; - private String fadcHitsCollectionName = "EcalCorrectedHits"; - - public void setFadcHitsCollectionName(String fadcHitsCollectionName) { - this.fadcHitsCollectionName = fadcHitsCollectionName; - } - - public void setRawHitsCollectionName(String rawHitsCollectionName) { - this.rawHitsCollectionName = rawHitsCollectionName; - } - - @Override - public void startOfData() { - // Initialize the histograms. - rawHitEnergy = aida.histogram1D("FADC Plot :: Raw Hit Energy", 110, 0.00, 2.2); - fadcHitEnergy = aida.histogram1D("FADC Plot :: FADC Hit Energy", 80, 0.00, 1.6); - rawHitDistribution = aida.histogram2D("FADC Plot :: Raw Hit Distribution", 46, -23, 23, 11, -5.5, 5.5); - fadcHitDistribution = aida.histogram2D("FADC Plot :: FADC Hit Distribution", 46, -23, 23, 11, -5.5, 5.5); - fadcFilteredHitDistribution = aida.histogram2D("FADC Plot :: FADC Hit Distribution Over 100 MeV", 46, -23, 23, 11, -5.5, 5.5); - eventRawHitCount = aida.histogram1D("FADC Plot :: Event Raw Hit Count", 159, 1, 160); - eventFADCHitCount = aida.histogram1D("FADC Plot :: Event FADC Hit Count", 15, 1, 16); - } - - public void process(EventHeader event) { - // Check if there exists a raw hits collection. - if(event.hasCollection(CalorimeterHit.class, rawHitsCollectionName)) { - // Get the raw hit collection. - List<CalorimeterHit> hitList = event.get(CalorimeterHit.class, rawHitsCollectionName); - - // Output the information on each hit to the histograms. - for(CalorimeterHit hit : hitList) { - // Get the x and y indices for the hits. - int ix = hit.getIdentifierFieldValue("ix"); - int iy = hit.getIdentifierFieldValue("iy"); - if(ix > 0) { ix = ix - 1; } - - // Write to the histograms. - rawHitEnergy.fill(hit.getCorrectedEnergy()); - rawHitDistribution.fill(ix, iy, 1.0); - - // If there are hits, fill the hit count histogram. - if(hitList.size() != 0) { eventRawHitCount.fill(hitList.size()); } - } - } - - // Check if there exists an FADC hits collection. - if(event.hasCollection(CalorimeterHit.class, fadcHitsCollectionName)) { - // Get the raw hit collection. - List<CalorimeterHit> hitList = event.get(CalorimeterHit.class, fadcHitsCollectionName); - - // Output the information on each hit to the histograms. - for(CalorimeterHit hit : hitList) { - // Get the x and y indices for the hits. - int ix = hit.getIdentifierFieldValue("ix"); - int iy = hit.getIdentifierFieldValue("iy"); - if(ix > 0) { ix = ix - 1; } - - // Write to the histograms. - fadcHitEnergy.fill(hit.getCorrectedEnergy()); - fadcHitDistribution.fill(ix, iy, 1.0); - if(hit.getCorrectedEnergy() > 0.100) { fadcFilteredHitDistribution.fill(ix, iy, 1.0); } - - // If there are hits, fill the hit count histogram. - if(hitList.size() != 0) { eventFADCHitCount.fill(hitList.size()); } - } - } - } + IHistogram1D rawHitEnergy; + IHistogram1D fadcHitEnergy; + IHistogram2D rawHitDistribution; + IHistogram2D fadcHitDistribution; + IHistogram2D fadcFilteredHitDistribution; + IHistogram1D eventRawHitCount; + IHistogram1D eventFADCHitCount; + + // Hit collection names. + private String rawHitsCollectionName = "EcalHits"; + private String fadcHitsCollectionName = "EcalCorrectedHits"; + + public void setFadcHitsCollectionName(String fadcHitsCollectionName) { + this.fadcHitsCollectionName = fadcHitsCollectionName; + } + + public void setRawHitsCollectionName(String rawHitsCollectionName) { + this.rawHitsCollectionName = rawHitsCollectionName; + } + + @Override + public void startOfData() { + // Initialize the histograms. + rawHitEnergy = aida.histogram1D("FADC Plot :: Raw Hit Energy", 110, 0.00, 2.2); + fadcHitEnergy = aida.histogram1D("FADC Plot :: FADC Hit Energy", 80, 0.00, 1.6); + rawHitDistribution = aida.histogram2D("FADC Plot :: Raw Hit Distribution", 46, -23, 23, 11, -5.5, 5.5); + fadcHitDistribution = aida.histogram2D("FADC Plot :: FADC Hit Distribution", 46, -23, 23, 11, -5.5, 5.5); + fadcFilteredHitDistribution = aida.histogram2D("FADC Plot :: FADC Hit Distribution Over 100 MeV", 46, -23, 23, 11, -5.5, 5.5); + eventRawHitCount = aida.histogram1D("FADC Plot :: Event Raw Hit Count", 159, 1, 160); + eventFADCHitCount = aida.histogram1D("FADC Plot :: Event FADC Hit Count", 15, 1, 16); + } + + public void process(EventHeader event) { + // Check if there exists a raw hits collection. + if(event.hasCollection(CalorimeterHit.class, rawHitsCollectionName)) { + // Get the raw hit collection. + List<CalorimeterHit> hitList = event.get(CalorimeterHit.class, rawHitsCollectionName); + + // Output the information on each hit to the histograms. + for(CalorimeterHit hit : hitList) { + // Get the x and y indices for the hits. + int ix = hit.getIdentifierFieldValue("ix"); + int iy = hit.getIdentifierFieldValue("iy"); + if(ix > 0) { ix = ix - 1; } + + // Write to the histograms. + rawHitEnergy.fill(hit.getCorrectedEnergy()); + rawHitDistribution.fill(ix, iy, 1.0); + + // If there are hits, fill the hit count histogram. + if(hitList.size() != 0) { eventRawHitCount.fill(hitList.size()); } + } + } + + // Check if there exists an FADC hits collection. + if(event.hasCollection(CalorimeterHit.class, fadcHitsCollectionName)) { + // Get the raw hit collection. + List<CalorimeterHit> hitList = event.get(CalorimeterHit.class, fadcHitsCollectionName); + + // Output the information on each hit to the histograms. + for(CalorimeterHit hit : hitList) { + // Get the x and y indices for the hits. + int ix = hit.getIdentifierFieldValue("ix"); + int iy = hit.getIdentifierFieldValue("iy"); + if(ix > 0) { ix = ix - 1; } + + // Write to the histograms. + fadcHitEnergy.fill(hit.getCorrectedEnergy()); + fadcHitDistribution.fill(ix, iy, 1.0); + if(hit.getCorrectedEnergy() > 0.100) { fadcFilteredHitDistribution.fill(ix, iy, 1.0); } + + // If there are hits, fill the hit count histogram. + if(hitList.size() != 0) { eventFADCHitCount.fill(hitList.size()); } + } + } + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/HPSEcalDataPlotsDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/HPSEcalDataPlotsDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/HPSEcalDataPlotsDriver.java Wed Mar 9 11:43:24 2016 @@ -27,22 +27,22 @@ * @author Kyle McCarty <[log in to unmask]> */ public class HPSEcalDataPlotsDriver extends Driver { - private String plotsGroupName= "Data Plots"; - private String bankCollectionName = "TriggerBank"; - private String clusterCollectionName = "EcalClusters"; - - private static final int PULSER = 0; - private static final int SINGLES0 = 1; - private static final int SINGLES1 = 2; - private static final int PAIR0 = 3; - private static final int PAIR1 = 4; - - private static final int ALL = 0; - private static final int EDGE = 1; - private static final int FIDUCIAL = 2; - - private AIDA aida = AIDA.defaultInstance(); - private IHistogram1D[][] clusterTotalEnergy = new IHistogram1D[5][3]; + private String plotsGroupName= "Data Plots"; + private String bankCollectionName = "TriggerBank"; + private String clusterCollectionName = "EcalClusters"; + + private static final int PULSER = 0; + private static final int SINGLES0 = 1; + private static final int SINGLES1 = 2; + private static final int PAIR0 = 3; + private static final int PAIR1 = 4; + + private static final int ALL = 0; + private static final int EDGE = 1; + private static final int FIDUCIAL = 2; + + private AIDA aida = AIDA.defaultInstance(); + private IHistogram1D[][] clusterTotalEnergy = new IHistogram1D[5][3]; private IHistogram1D[][] clusterTime = new IHistogram1D[5][3]; private IHistogram1D[][] clusterHitCount = new IHistogram1D[5][3]; private IHistogram1D[][] clusterSeedEnergy = new IHistogram1D[5][3]; @@ -56,249 +56,249 @@ private IHistogram2D[][] clusterSeedPosition = new IHistogram2D[5][3]; private IHistogram2D[][] pairEnergySlope2D = new IHistogram2D[5][3]; private IHistogram2D[][] pairCoplanarityEnergySum = new IHistogram2D[5][3]; - + /** * Initializes the plots. */ - @Override - public void startOfData() { - // Define trigger names. - String[] triggerNames = { - "Pulser", "Singles 0", "Singles 1", "Pair 0", "Pair 1" - }; - - // Define the positional names. - String[] positionNames = { - "All", "Edge", "Fiducial" - }; - - // Instantiate the plots. - for(int i = 0; i < 5; i++) { - for(int j = 0; j < 3; j++) { - clusterTotalEnergy[i][j] = aida.histogram1D(plotsGroupName + "/" + triggerNames[i] + "/" - + positionNames[j] + "/Cluster Total Energy", 150, 0.000, 1.500); + @Override + public void startOfData() { + // Define trigger names. + String[] triggerNames = { + "Pulser", "Singles 0", "Singles 1", "Pair 0", "Pair 1" + }; + + // Define the positional names. + String[] positionNames = { + "All", "Edge", "Fiducial" + }; + + // Instantiate the plots. + for(int i = 0; i < 5; i++) { + for(int j = 0; j < 3; j++) { + clusterTotalEnergy[i][j] = aida.histogram1D(plotsGroupName + "/" + triggerNames[i] + "/" + + positionNames[j] + "/Cluster Total Energy", 150, 0.000, 1.500); clusterTime[i][j] = aida.histogram1D(plotsGroupName + "/" + triggerNames[i] + "/" - + positionNames[j] + "/Cluster Hit Time", 100, 0.0, 100.0); + + positionNames[j] + "/Cluster Hit Time", 100, 0.0, 100.0); clusterHitCount[i][j] = aida.histogram1D(plotsGroupName + "/" + triggerNames[i] + "/" - + positionNames[j] + "/Cluster Hit Count", 10, -0.5, 9.5); + + positionNames[j] + "/Cluster Hit Count", 10, -0.5, 9.5); clusterSeedEnergy[i][j] = aida.histogram1D(plotsGroupName + "/" + triggerNames[i] + "/" - + positionNames[j] + "/Cluster Seed Energy", 150, 0.000, 1.500); + + positionNames[j] + "/Cluster Seed Energy", 150, 0.000, 1.500); pairEnergySum[i][j] = aida.histogram1D(plotsGroupName + "/" + triggerNames[i] + "/" - + positionNames[j] + "/Pair Energy Sum", 150, 0.000, 1.500); + + positionNames[j] + "/Pair Energy Sum", 150, 0.000, 1.500); pairEnergyDifference[i][j] = aida.histogram1D(plotsGroupName + "/" + triggerNames[i] + "/" - + positionNames[j] + "/Pair Energy Difference", 150, 0.000, 1.500); + + positionNames[j] + "/Pair Energy Difference", 150, 0.000, 1.500); pairEnergySlope[i][j] = aida.histogram1D(plotsGroupName + "/" + triggerNames[i] + "/" - + positionNames[j] + "/Pair Energy Slope", 100, 0.000, 4.000); + + positionNames[j] + "/Pair Energy Slope", 100, 0.000, 4.000); pairCoplanarity[i][j] = aida.histogram1D(plotsGroupName + "/" + triggerNames[i] + "/" - + positionNames[j] + "/Pair Coplanarity", 180, 0.000, 180); + + positionNames[j] + "/Pair Coplanarity", 180, 0.000, 180); pairTimeCoincidence[i][j] = aida.histogram1D(plotsGroupName + "/" + triggerNames[i] + "/" - + positionNames[j] + "/Pair Time Coincidence", 80, 0, 20); + + positionNames[j] + "/Pair Time Coincidence", 80, 0, 20); clusterSeedPosition[i][j] = aida.histogram2D(plotsGroupName + "/" + triggerNames[i] + "/" - + positionNames[j] + "/Cluster Seed Position", 46, -23, 23, 11, -5.5, 5.5); + + positionNames[j] + "/Cluster Seed Position", 46, -23, 23, 11, -5.5, 5.5); pairEnergySum2D[i][j] = aida.histogram2D(plotsGroupName + "/" + triggerNames[i] + "/" - + positionNames[j] + "/Pair Energy Sum 2D", 150, 0.000, 1.500, 150, 0.000, 1.500); + + positionNames[j] + "/Pair Energy Sum 2D", 150, 0.000, 1.500, 150, 0.000, 1.500); pairCoplanarityEnergySum[i][j] = aida.histogram2D(plotsGroupName + "/" + triggerNames[i] + "/" - + positionNames[j] + "/Pair Energy Sum vs. Coplanarity", 150, 0.000, 1.500, 180, 0, 180); + + positionNames[j] + "/Pair Energy Sum vs. Coplanarity", 150, 0.000, 1.500, 180, 0, 180); pairEnergySlope2D[i][j] = aida.histogram2D(plotsGroupName + "/" + triggerNames[i] + "/" - + positionNames[j] + "/Pair Energy Slope 2D", 75, 0.000, 1.500, 100, 0.0, 400.0); - } - } - } - - /** - * Processes the event clusters and populates distribution charts - * from them for each trigger. Also creates separate plots for the - * edge and fiducial regions. - * @param event - The event containing LCIO collections to be used - * for plot population. - */ - @Override - public void process(EventHeader event) { - // Get the TI and SSP banks. - TIData tiBank = null; - SSPData sspBank = null; - if(event.hasCollection(GenericObject.class, bankCollectionName)) { - // Get the bank list. - List<GenericObject> bankList = event.get(GenericObject.class, bankCollectionName); - - // Search through the banks and get the SSP and TI banks. - for(GenericObject obj : bankList) { - // If this is an SSP bank, parse it. - if(AbstractIntData.getTag(obj) == SSPData.BANK_TAG) { - sspBank = new SSPData(obj); - } - - // Otherwise, if this is a TI bank, parse it. - else if(AbstractIntData.getTag(obj) == TIData.BANK_TAG) { - tiBank = new TIData(obj); - } - } - } - - // Get the list of clusters. - List<Cluster> clusters = null; - if(event.hasCollection(Cluster.class, clusterCollectionName)) { - clusters = event.get(Cluster.class, clusterCollectionName); - } - - // Require that all collections be initialized. - if(sspBank == null || tiBank == null || clusters == null) { - return; - } - - // Track which triggers are active. - boolean[] activeTrigger = new boolean[5]; - activeTrigger[PULSER] = tiBank.isPulserTrigger(); - activeTrigger[SINGLES0] = tiBank.isSingle0Trigger(); - activeTrigger[SINGLES1] = tiBank.isSingle1Trigger(); - activeTrigger[PAIR0] = tiBank.isPair0Trigger(); - activeTrigger[PAIR1] = tiBank.isPair1Trigger(); - - // Plot all cluster properties for each trigger. - for(Cluster cluster : clusters) { - // Check whether the cluster is a fiducial or edge cluster. - int positional = inFiducialRegion(cluster) ? FIDUCIAL : EDGE; - - // Fill the appropriate plots for each trigger with an - // active trigger bit for single clusters. - for(int i = 0; i < 5; i++) { - if(activeTrigger[i]) { - // Populate the ALL plots. - clusterSeedEnergy[i][ALL].fill(TriggerModule.getValueClusterSeedEnergy(cluster)); - clusterTotalEnergy[i][ALL].fill(cluster.getEnergy()); - clusterHitCount[i][ALL].fill(TriggerModule.getClusterHitCount(cluster)); - clusterTime[i][ALL].fill(TriggerModule.getClusterTime(cluster)); - clusterSeedPosition[i][ALL].fill(TriggerModule.getClusterXIndex(cluster), - TriggerModule.getClusterYIndex(cluster)); - - // Populate the positional plots. - clusterSeedEnergy[i][positional].fill(TriggerModule.getValueClusterSeedEnergy(cluster)); - clusterTotalEnergy[i][positional].fill(cluster.getEnergy()); - clusterHitCount[i][positional].fill(TriggerModule.getClusterHitCount(cluster)); - clusterTime[i][positional].fill(TriggerModule.getClusterTime(cluster)); - clusterSeedPosition[i][positional].fill(TriggerModule.getClusterXIndex(cluster), - TriggerModule.getClusterYIndex(cluster)); - } - } - } - - // Plot all pair properties for each trigger. - List<Cluster[]> pairs = TriggerModule.getTopBottomPairs(clusters, Cluster.class); - for(Cluster[] pair : pairs) { - // Check whether the cluster is a fiducial or edge cluster. - boolean[] isFiducial = { - inFiducialRegion(pair[0]), - inFiducialRegion(pair[1]) - }; - int positional = (isFiducial[0] && isFiducial[1]) ? FIDUCIAL : EDGE; - - // Fill the appropriate plots for each trigger with an - // active trigger bit for single clusters. - for(int i = 0; i < 5; i++) { - if(activeTrigger[i]) { - // Calculate the values. - double energySum = TriggerModule.getValueEnergySum(pair); - double energyDiff = TriggerModule.getValueEnergyDifference(pair); - double energySlope = TriggerModule.getValueEnergySlope(pair, 0.00550); - double coplanarity = TriggerModule.getValueCoplanarity(pair); - double timeCoincidence = TriggerModule.getValueTimeCoincidence(pair); - - // Get the energy slope values. - Cluster lowCluster = pair[0].getEnergy() < pair[1].getEnergy() ? pair[0] : pair[1]; - double clusterDistance = TriggerModule.getClusterDistance(lowCluster); - - // Populate the ALL plots. - pairEnergySum[i][ALL].fill(energySum); - pairEnergyDifference[i][ALL].fill(energyDiff); - pairEnergySlope[i][ALL].fill(energySlope); - pairCoplanarity[i][ALL].fill(coplanarity); - pairTimeCoincidence[i][ALL].fill(timeCoincidence); - pairEnergySum2D[i][ALL].fill(pair[0].getEnergy(), pair[1].getEnergy()); - pairCoplanarityEnergySum[i][ALL].fill(energySum, coplanarity); - pairEnergySlope2D[i][ALL].fill(lowCluster.getEnergy(), clusterDistance); - - // Populate the positional plots. - pairEnergySum[i][positional].fill(energySum); - pairEnergyDifference[i][positional].fill(energyDiff); - pairEnergySlope[i][positional].fill(energySlope); - pairCoplanarity[i][positional].fill(coplanarity); - pairTimeCoincidence[i][positional].fill(timeCoincidence); - pairEnergySum2D[i][positional].fill(pair[0].getEnergy(), pair[1].getEnergy()); - pairCoplanarityEnergySum[i][positional].fill(energySum, coplanarity); - pairEnergySlope2D[i][positional].fill(lowCluster.getEnergy(), clusterDistance); - } - } - } - } - - /** - * Indicates whether the argument cluster is located in the fiducial - * region or not. - * @param cluster - The cluster to check. - * @return Returns <code>true</code> if the cluster is located in - * the fiducial region and <code>false</code> otherwise. - */ - private static final boolean inFiducialRegion(Cluster cluster) { - // Get the x and y indices for the cluster. - int ix = TriggerModule.getClusterXIndex(cluster); - int absx = Math.abs(TriggerModule.getClusterXIndex(cluster)); - int absy = Math.abs(TriggerModule.getClusterYIndex(cluster)); - - // Check if the cluster is on the top or the bottom of the - // calorimeter, as defined by |y| == 5. This is an edge cluster - // and is not in the fiducial region. - if(absy == 5) { - return false; - } - - // Check if the cluster is on the extreme left or right side - // of the calorimeter, as defined by |x| == 23. This is also - // and edge cluster is not in the fiducial region. - if(absx == 23) { - return false; - } - - // Check if the cluster is along the beam gap, as defined by - // |y| == 1. This is an internal edge cluster and is not in the - // fiducial region. - if(absy == 1) { - return false; - } - - // Lastly, check if the cluster falls along the beam hole, as - // defined by clusters with -11 <= x <= -1 and |y| == 2. This - // is not the fiducial region. - if(absy == 2 && ix <= -1 && ix >= -11) { - return false; - } - - // If all checks fail, the cluster is in the fiducial region. - return true; - } - - /** - * Sets the name of the LCIO collection containing the clusters - * that are to be plotted. - * @param collection - The LCIO collection name. - */ - public void setClusterCollectionName(String collection) { - clusterCollectionName = collection; - } - - /** - * Defines the name of the LCIO collection containing the TI bank. - * @param collection - The LCIO collection name. - */ - public void setBankCollectionName(String collection) { - bankCollectionName = collection; - } - - /** - * Sets the name of the super-group folder containing all plots. - * @param name - The name of the plots folder. - */ - public void setPlotsGroupName(String name) { - plotsGroupName = name; - } + + positionNames[j] + "/Pair Energy Slope 2D", 75, 0.000, 1.500, 100, 0.0, 400.0); + } + } + } + + /** + * Processes the event clusters and populates distribution charts + * from them for each trigger. Also creates separate plots for the + * edge and fiducial regions. + * @param event - The event containing LCIO collections to be used + * for plot population. + */ + @Override + public void process(EventHeader event) { + // Get the TI and SSP banks. + TIData tiBank = null; + SSPData sspBank = null; + if(event.hasCollection(GenericObject.class, bankCollectionName)) { + // Get the bank list. + List<GenericObject> bankList = event.get(GenericObject.class, bankCollectionName); + + // Search through the banks and get the SSP and TI banks. + for(GenericObject obj : bankList) { + // If this is an SSP bank, parse it. + if(AbstractIntData.getTag(obj) == SSPData.BANK_TAG) { + sspBank = new SSPData(obj); + } + + // Otherwise, if this is a TI bank, parse it. + else if(AbstractIntData.getTag(obj) == TIData.BANK_TAG) { + tiBank = new TIData(obj); + } + } + } + + // Get the list of clusters. + List<Cluster> clusters = null; + if(event.hasCollection(Cluster.class, clusterCollectionName)) { + clusters = event.get(Cluster.class, clusterCollectionName); + } + + // Require that all collections be initialized. + if(sspBank == null || tiBank == null || clusters == null) { + return; + } + + // Track which triggers are active. + boolean[] activeTrigger = new boolean[5]; + activeTrigger[PULSER] = tiBank.isPulserTrigger(); + activeTrigger[SINGLES0] = tiBank.isSingle0Trigger(); + activeTrigger[SINGLES1] = tiBank.isSingle1Trigger(); + activeTrigger[PAIR0] = tiBank.isPair0Trigger(); + activeTrigger[PAIR1] = tiBank.isPair1Trigger(); + + // Plot all cluster properties for each trigger. + for(Cluster cluster : clusters) { + // Check whether the cluster is a fiducial or edge cluster. + int positional = inFiducialRegion(cluster) ? FIDUCIAL : EDGE; + + // Fill the appropriate plots for each trigger with an + // active trigger bit for single clusters. + for(int i = 0; i < 5; i++) { + if(activeTrigger[i]) { + // Populate the ALL plots. + clusterSeedEnergy[i][ALL].fill(TriggerModule.getValueClusterSeedEnergy(cluster)); + clusterTotalEnergy[i][ALL].fill(cluster.getEnergy()); + clusterHitCount[i][ALL].fill(TriggerModule.getClusterHitCount(cluster)); + clusterTime[i][ALL].fill(TriggerModule.getClusterTime(cluster)); + clusterSeedPosition[i][ALL].fill(TriggerModule.getClusterXIndex(cluster), + TriggerModule.getClusterYIndex(cluster)); + + // Populate the positional plots. + clusterSeedEnergy[i][positional].fill(TriggerModule.getValueClusterSeedEnergy(cluster)); + clusterTotalEnergy[i][positional].fill(cluster.getEnergy()); + clusterHitCount[i][positional].fill(TriggerModule.getClusterHitCount(cluster)); + clusterTime[i][positional].fill(TriggerModule.getClusterTime(cluster)); + clusterSeedPosition[i][positional].fill(TriggerModule.getClusterXIndex(cluster), + TriggerModule.getClusterYIndex(cluster)); + } + } + } + + // Plot all pair properties for each trigger. + List<Cluster[]> pairs = TriggerModule.getTopBottomPairs(clusters, Cluster.class); + for(Cluster[] pair : pairs) { + // Check whether the cluster is a fiducial or edge cluster. + boolean[] isFiducial = { + inFiducialRegion(pair[0]), + inFiducialRegion(pair[1]) + }; + int positional = (isFiducial[0] && isFiducial[1]) ? FIDUCIAL : EDGE; + + // Fill the appropriate plots for each trigger with an + // active trigger bit for single clusters. + for(int i = 0; i < 5; i++) { + if(activeTrigger[i]) { + // Calculate the values. + double energySum = TriggerModule.getValueEnergySum(pair); + double energyDiff = TriggerModule.getValueEnergyDifference(pair); + double energySlope = TriggerModule.getValueEnergySlope(pair, 0.00550); + double coplanarity = TriggerModule.getValueCoplanarity(pair); + double timeCoincidence = TriggerModule.getValueTimeCoincidence(pair); + + // Get the energy slope values. + Cluster lowCluster = pair[0].getEnergy() < pair[1].getEnergy() ? pair[0] : pair[1]; + double clusterDistance = TriggerModule.getClusterDistance(lowCluster); + + // Populate the ALL plots. + pairEnergySum[i][ALL].fill(energySum); + pairEnergyDifference[i][ALL].fill(energyDiff); + pairEnergySlope[i][ALL].fill(energySlope); + pairCoplanarity[i][ALL].fill(coplanarity); + pairTimeCoincidence[i][ALL].fill(timeCoincidence); + pairEnergySum2D[i][ALL].fill(pair[0].getEnergy(), pair[1].getEnergy()); + pairCoplanarityEnergySum[i][ALL].fill(energySum, coplanarity); + pairEnergySlope2D[i][ALL].fill(lowCluster.getEnergy(), clusterDistance); + + // Populate the positional plots. + pairEnergySum[i][positional].fill(energySum); + pairEnergyDifference[i][positional].fill(energyDiff); + pairEnergySlope[i][positional].fill(energySlope); + pairCoplanarity[i][positional].fill(coplanarity); + pairTimeCoincidence[i][positional].fill(timeCoincidence); + pairEnergySum2D[i][positional].fill(pair[0].getEnergy(), pair[1].getEnergy()); + pairCoplanarityEnergySum[i][positional].fill(energySum, coplanarity); + pairEnergySlope2D[i][positional].fill(lowCluster.getEnergy(), clusterDistance); + } + } + } + } + + /** + * Indicates whether the argument cluster is located in the fiducial + * region or not. + * @param cluster - The cluster to check. + * @return Returns <code>true</code> if the cluster is located in + * the fiducial region and <code>false</code> otherwise. + */ + private static final boolean inFiducialRegion(Cluster cluster) { + // Get the x and y indices for the cluster. + int ix = TriggerModule.getClusterXIndex(cluster); + int absx = Math.abs(TriggerModule.getClusterXIndex(cluster)); + int absy = Math.abs(TriggerModule.getClusterYIndex(cluster)); + + // Check if the cluster is on the top or the bottom of the + // calorimeter, as defined by |y| == 5. This is an edge cluster + // and is not in the fiducial region. + if(absy == 5) { + return false; + } + + // Check if the cluster is on the extreme left or right side + // of the calorimeter, as defined by |x| == 23. This is also + // and edge cluster is not in the fiducial region. + if(absx == 23) { + return false; + } + + // Check if the cluster is along the beam gap, as defined by + // |y| == 1. This is an internal edge cluster and is not in the + // fiducial region. + if(absy == 1) { + return false; + } + + // Lastly, check if the cluster falls along the beam hole, as + // defined by clusters with -11 <= x <= -1 and |y| == 2. This + // is not the fiducial region. + if(absy == 2 && ix <= -1 && ix >= -11) { + return false; + } + + // If all checks fail, the cluster is in the fiducial region. + return true; + } + + /** + * Sets the name of the LCIO collection containing the clusters + * that are to be plotted. + * @param collection - The LCIO collection name. + */ + public void setClusterCollectionName(String collection) { + clusterCollectionName = collection; + } + + /** + * Defines the name of the LCIO collection containing the TI bank. + * @param collection - The LCIO collection name. + */ + public void setBankCollectionName(String collection) { + bankCollectionName = collection; + } + + /** + * Sets the name of the super-group folder containing all plots. + * @param name - The name of the plots folder. + */ + public void setPlotsGroupName(String name) { + plotsGroupName = name; + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/InvariantMassPairDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/InvariantMassPairDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/InvariantMassPairDriver.java Wed Mar 9 11:43:24 2016 @@ -15,255 +15,255 @@ import org.lcsim.util.aida.AIDA; public class InvariantMassPairDriver extends Driver { - private int[] events = new int[3]; - private TriggerModule[] trigger = new TriggerModule[2]; - - private String gtpClusterCollectionName = "EcalClustersGTP"; - private String particleCollectionName = "FinalStateParticles"; - private String reconParticleCollectionName = "UnconstrainedV0Candidates"; - - private AIDA aida = AIDA.defaultInstance(); - private IHistogram1D electronEnergyHist = aida.histogram1D("Trident Analysis/Electron Energy", 150, 0.000, 1.500); - private IHistogram1D positronEnergyHist = aida.histogram1D("Trident Analysis/Positron Energy", 150, 0.000, 1.500); - private IHistogram1D pairEnergyHist = aida.histogram1D("Trident Analysis/Energy Sum Distribution", 220, 0.00, 2.200); - private IHistogram2D pair2DEnergyHist = aida.histogram2D("Trident Analysis/2D Energy Distribution", 55, 0, 1.1, 55, 0, 1.1); - private IHistogram1D pair1MassHist = aida.histogram1D("Trident Analysis/Particle Invariant Mass (1 Hit)", 240, 0.000, 0.120); - private IHistogram1D pair1ModMassHist = aida.histogram1D("Trident Analysis/Particle Invariant Mass (2 Hit)", 240, 0.000, 0.120); - private IHistogram1D elasticElectronEnergyHist = aida.histogram1D("Trident Analysis/Trident Electron Energy", 150, 0.000, 1.500); - private IHistogram1D elasticPositronEnergyHist = aida.histogram1D("Trident Analysis/Trident Positron Energy", 150, 0.000, 1.500); - - @Override - public void startOfData() { - // Instantiate the pair 1 trigger. - trigger[0] = new TriggerModule(); - trigger[0].setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 1); - trigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.054); - trigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 0.630); - trigger[0].setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 30); - trigger[0].setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, 0.540); - trigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, 0.180); - trigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, 0.860); - trigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.600); - trigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_F, 0.0055); - trigger[0].setCutValue(TriggerModule.PAIR_TIME_COINCIDENCE, 12); - - // Instantiate the pair 1 trigger with a hit count cut of two. - trigger[1] = new TriggerModule(); - trigger[1].setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 2); - trigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.054); - trigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 0.630); - trigger[0].setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 30); - trigger[0].setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, 0.540); - trigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, 0.180); - trigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, 0.860); - trigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.600); - trigger[1].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_F, 0.0055); - trigger[0].setCutValue(TriggerModule.PAIR_TIME_COINCIDENCE, 12); - } - - @Override - public void endOfData() { - System.out.printf("Pair 1 :: %d / %d%n", events[0], events[2]); - System.out.printf("Pair 1 Mod :: %d / %d%n", events[1], events[2]); - } - - @Override - public void process(EventHeader event) { - // Skip the event if there is no reconstructed particle list. - if(!event.hasCollection(ReconstructedParticle.class, particleCollectionName)) { - return; - } - - // Get a list of all tracks in the event. - List<ReconstructedParticle> trackList = event.get(ReconstructedParticle.class, particleCollectionName); - - // Plot the energies of the electrons and positrons. - for(ReconstructedParticle track : trackList) { - // Positive tracks are assumed to be positrons. - if(track.getCharge() > 0) { - positronEnergyHist.fill(track.getMomentum().magnitude()); - } - - // Negative tracks are assumed to be electrons. - else if(track.getCharge() < 0) { - electronEnergyHist.fill(track.getMomentum().magnitude()); - } - } - - // Get track pairs. - List<ReconstructedParticle[]> trackPairList = getTrackPairs(trackList); - - // Populate the pair plots. - trackPairLoop: - for(ReconstructedParticle[] trackPair : trackPairList) { - // Note the polarity of the tracks. - boolean[] trackIsPositive = { - trackPair[0].getCharge() > 0, - trackPair[1].getCharge() > 0 - }; - - // Require that one track be positive and one be negative. - if(!(trackIsPositive[0] ^ trackIsPositive[1])) { - continue trackPairLoop; - } - - // Populate the track pair plots. - pairEnergyHist.fill(VecOp.add(trackPair[0].getMomentum(), trackPair[1].getMomentum()).magnitude()); - if(trackIsPositive[0]) { - pair2DEnergyHist.fill(trackPair[0].getMomentum().magnitude(), trackPair[1].getMomentum().magnitude()); - } else { - pair2DEnergyHist.fill(trackPair[1].getMomentum().magnitude(), trackPair[0].getMomentum().magnitude()); - } - } - - // Check that the event has a collection of GTP clusters. - if(!event.hasCollection(Cluster.class, gtpClusterCollectionName)) { - return; - } - - // Increment the total event count. - events[2]++; - - // Get the GTP clusters. - List<Cluster> clusters = event.get(Cluster.class, gtpClusterCollectionName); - - // Get the list of top/bottom pairs. - List<Cluster[]> pairs = getClusterPairs(clusters); - - // Iterate over the pairs and determine if any cluster passes - // pair 1 trigger or the pair 1 modified trigger. - boolean passedPair1 = false; - boolean passedPair1Mod = false; - pairLoop: - for(Cluster[] pair : pairs) { - // Check the cluster energy cut. - if(!trigger[0].clusterTotalEnergyCut(pair[0])) { continue pairLoop; } - if(!trigger[0].clusterTotalEnergyCut(pair[1])) { continue pairLoop; } - - // Check the pair cuts. - if(!trigger[0].pairCoplanarityCut(pair)) { continue pairLoop; } - if(!trigger[0].pairEnergyDifferenceCut(pair)) { continue pairLoop; } - if(!trigger[0].pairEnergySumCut(pair)) { continue pairLoop; } - if(!trigger[0].pairEnergySlopeCut(pair)) { continue pairLoop; } - - // Check if the pair passes the singles 0 hit count cut. - if(trigger[0].clusterHitCountCut(pair[0]) && trigger[0].clusterHitCountCut(pair[1])) { - // Note that a pair passed the pair 1 trigger. - passedPair1 = true; - - // Check whether the pair passed the modified pair 1 - // trigger hit count cut. - if(trigger[1].clusterHitCountCut(pair[0]) && trigger[1].clusterHitCountCut(pair[1])) { - passedPair1Mod = true; - } - } else { continue pairLoop; } - } - - // If no pair passed the pair 1 cut, nothing further need be done. - if(!passedPair1) { return; } - - // Otherwise, increment the "passed pair 1" count and the - // "passed pair 1 mod" count, if appropriate. - events[0]++; - if(passedPair1Mod) { events[1]++; } - - // Get the collection of reconstructed V0 candidates. - List<ReconstructedParticle> candidateList = event.get(ReconstructedParticle.class, reconParticleCollectionName); - - // Populate the invariant mass plot. - candidateLoop: - for(ReconstructedParticle particle : candidateList) { - // Track the electron and positron momenta. - double electronMomentum = 0.0; - double positronMomentum = 0.0; - - // Check that it has component particles that meet the - // trident condition. - boolean seenPositive = false; - boolean seenNegative = false; - for(ReconstructedParticle track : particle.getParticles()) { - // Exactly one track must be negative. Its energy is - // disallowed from exceeding 900 MeV. - if(track.getCharge() < 0) { - // Reject a second negative particle. - if(seenNegative) { continue candidateLoop; } - - // Otherwise, note that one has been seen. - seenNegative = true; - electronMomentum = track.getMomentum().magnitude(); - - // Reject electrons with a momentum exceeding 900 MeV. - if(track.getMomentum().magnitude() > 0.900) { - continue candidateLoop; - } - } - - // Exactly one track must be positive. Its energy is - // not constrained. - else if(track.getCharge() > 0) { - // Reject a second positive particle. - if(seenPositive) { continue candidateLoop; } - - // Otherwise, note that one has been seen. - seenPositive = true; - positronMomentum = track.getMomentum().magnitude(); - } - - // Lastly, reject any particle that produced a photon. - else { continue candidateLoop; } - } - - // Populate the plots. - pair1MassHist.fill(particle.getMass()); - elasticElectronEnergyHist.fill(electronMomentum); - elasticPositronEnergyHist.fill(positronMomentum); - if(passedPair1Mod) { pair1ModMassHist.fill(particle.getMass()); } - } - } - - /** - * Creates a list of top/bottom cluster pairs. - * @param clusters - A <code>List</code> collection of objects of - * type <code>Cluster</code>. - * @return Returns a <code>List</code> collection of 2-entry arrays - * of <code>Cluster</code> objects representing top/bottom cluster - * pairs. The first entry is always the top cluster. - */ - private static final List<Cluster[]> getClusterPairs(List<Cluster> clusters) { - // Separate the clusters into top and bottom clusters. - List<Cluster> topList = new ArrayList<Cluster>(); - List<Cluster> botList = new ArrayList<Cluster>(); - for(Cluster cluster : clusters) { - if(cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy") > 0) { - topList.add(cluster); - } - else { botList.add(cluster); } - } - - // Create a list of all top/bottom pairs. - List<Cluster[]> pairs = new ArrayList<Cluster[]>(); - for(Cluster topCluster : topList) { - for(Cluster botCluster : botList) { - pairs.add(new Cluster[] { topCluster, botCluster }); - } - } - - // Return the list of cluster pairs. - return pairs; - } - - private static final List<ReconstructedParticle[]> getTrackPairs(List<ReconstructedParticle> trackList) { - // Create an empty list for the pairs. - List<ReconstructedParticle[]> pairs = new ArrayList<ReconstructedParticle[]>(); - - // Add all possible pairs of tracks. - for(int i = 0; i < trackList.size(); i++) { - for(int j = i + 1; j < trackList.size(); j++) { - pairs.add(new ReconstructedParticle[] { trackList.get(i), trackList.get(j) }); - } - } - - // Return the list of tracks. - return pairs; - } + private int[] events = new int[3]; + private TriggerModule[] trigger = new TriggerModule[2]; + + private String gtpClusterCollectionName = "EcalClustersGTP"; + private String particleCollectionName = "FinalStateParticles"; + private String reconParticleCollectionName = "UnconstrainedV0Candidates"; + + private AIDA aida = AIDA.defaultInstance(); + private IHistogram1D electronEnergyHist = aida.histogram1D("Trident Analysis/Electron Energy", 150, 0.000, 1.500); + private IHistogram1D positronEnergyHist = aida.histogram1D("Trident Analysis/Positron Energy", 150, 0.000, 1.500); + private IHistogram1D pairEnergyHist = aida.histogram1D("Trident Analysis/Energy Sum Distribution", 220, 0.00, 2.200); + private IHistogram2D pair2DEnergyHist = aida.histogram2D("Trident Analysis/2D Energy Distribution", 55, 0, 1.1, 55, 0, 1.1); + private IHistogram1D pair1MassHist = aida.histogram1D("Trident Analysis/Particle Invariant Mass (1 Hit)", 240, 0.000, 0.120); + private IHistogram1D pair1ModMassHist = aida.histogram1D("Trident Analysis/Particle Invariant Mass (2 Hit)", 240, 0.000, 0.120); + private IHistogram1D elasticElectronEnergyHist = aida.histogram1D("Trident Analysis/Trident Electron Energy", 150, 0.000, 1.500); + private IHistogram1D elasticPositronEnergyHist = aida.histogram1D("Trident Analysis/Trident Positron Energy", 150, 0.000, 1.500); + + @Override + public void startOfData() { + // Instantiate the pair 1 trigger. + trigger[0] = new TriggerModule(); + trigger[0].setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 1); + trigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.054); + trigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 0.630); + trigger[0].setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 30); + trigger[0].setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, 0.540); + trigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, 0.180); + trigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, 0.860); + trigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.600); + trigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_F, 0.0055); + trigger[0].setCutValue(TriggerModule.PAIR_TIME_COINCIDENCE, 12); + + // Instantiate the pair 1 trigger with a hit count cut of two. + trigger[1] = new TriggerModule(); + trigger[1].setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, 2); + trigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, 0.054); + trigger[0].setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, 0.630); + trigger[0].setCutValue(TriggerModule.PAIR_COPLANARITY_HIGH, 30); + trigger[0].setCutValue(TriggerModule.PAIR_ENERGY_DIFFERENCE_HIGH, 0.540); + trigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SUM_LOW, 0.180); + trigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SUM_HIGH, 0.860); + trigger[0].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_LOW, 0.600); + trigger[1].setCutValue(TriggerModule.PAIR_ENERGY_SLOPE_F, 0.0055); + trigger[0].setCutValue(TriggerModule.PAIR_TIME_COINCIDENCE, 12); + } + + @Override + public void endOfData() { + System.out.printf("Pair 1 :: %d / %d%n", events[0], events[2]); + System.out.printf("Pair 1 Mod :: %d / %d%n", events[1], events[2]); + } + + @Override + public void process(EventHeader event) { + // Skip the event if there is no reconstructed particle list. + if(!event.hasCollection(ReconstructedParticle.class, particleCollectionName)) { + return; + } + + // Get a list of all tracks in the event. + List<ReconstructedParticle> trackList = event.get(ReconstructedParticle.class, particleCollectionName); + + // Plot the energies of the electrons and positrons. + for(ReconstructedParticle track : trackList) { + // Positive tracks are assumed to be positrons. + if(track.getCharge() > 0) { + positronEnergyHist.fill(track.getMomentum().magnitude()); + } + + // Negative tracks are assumed to be electrons. + else if(track.getCharge() < 0) { + electronEnergyHist.fill(track.getMomentum().magnitude()); + } + } + + // Get track pairs. + List<ReconstructedParticle[]> trackPairList = getTrackPairs(trackList); + + // Populate the pair plots. + trackPairLoop: + for(ReconstructedParticle[] trackPair : trackPairList) { + // Note the polarity of the tracks. + boolean[] trackIsPositive = { + trackPair[0].getCharge() > 0, + trackPair[1].getCharge() > 0 + }; + + // Require that one track be positive and one be negative. + if(!(trackIsPositive[0] ^ trackIsPositive[1])) { + continue trackPairLoop; + } + + // Populate the track pair plots. + pairEnergyHist.fill(VecOp.add(trackPair[0].getMomentum(), trackPair[1].getMomentum()).magnitude()); + if(trackIsPositive[0]) { + pair2DEnergyHist.fill(trackPair[0].getMomentum().magnitude(), trackPair[1].getMomentum().magnitude()); + } else { + pair2DEnergyHist.fill(trackPair[1].getMomentum().magnitude(), trackPair[0].getMomentum().magnitude()); + } + } + + // Check that the event has a collection of GTP clusters. + if(!event.hasCollection(Cluster.class, gtpClusterCollectionName)) { + return; + } + + // Increment the total event count. + events[2]++; + + // Get the GTP clusters. + List<Cluster> clusters = event.get(Cluster.class, gtpClusterCollectionName); + + // Get the list of top/bottom pairs. + List<Cluster[]> pairs = getClusterPairs(clusters); + + // Iterate over the pairs and determine if any cluster passes + // pair 1 trigger or the pair 1 modified trigger. + boolean passedPair1 = false; + boolean passedPair1Mod = false; + pairLoop: + for(Cluster[] pair : pairs) { + // Check the cluster energy cut. + if(!trigger[0].clusterTotalEnergyCut(pair[0])) { continue pairLoop; } + if(!trigger[0].clusterTotalEnergyCut(pair[1])) { continue pairLoop; } + + // Check the pair cuts. + if(!trigger[0].pairCoplanarityCut(pair)) { continue pairLoop; } + if(!trigger[0].pairEnergyDifferenceCut(pair)) { continue pairLoop; } + if(!trigger[0].pairEnergySumCut(pair)) { continue pairLoop; } + if(!trigger[0].pairEnergySlopeCut(pair)) { continue pairLoop; } + + // Check if the pair passes the singles 0 hit count cut. + if(trigger[0].clusterHitCountCut(pair[0]) && trigger[0].clusterHitCountCut(pair[1])) { + // Note that a pair passed the pair 1 trigger. + passedPair1 = true; + + // Check whether the pair passed the modified pair 1 + // trigger hit count cut. + if(trigger[1].clusterHitCountCut(pair[0]) && trigger[1].clusterHitCountCut(pair[1])) { + passedPair1Mod = true; + } + } else { continue pairLoop; } + } + + // If no pair passed the pair 1 cut, nothing further need be done. + if(!passedPair1) { return; } + + // Otherwise, increment the "passed pair 1" count and the + // "passed pair 1 mod" count, if appropriate. + events[0]++; + if(passedPair1Mod) { events[1]++; } + + // Get the collection of reconstructed V0 candidates. + List<ReconstructedParticle> candidateList = event.get(ReconstructedParticle.class, reconParticleCollectionName); + + // Populate the invariant mass plot. + candidateLoop: + for(ReconstructedParticle particle : candidateList) { + // Track the electron and positron momenta. + double electronMomentum = 0.0; + double positronMomentum = 0.0; + + // Check that it has component particles that meet the + // trident condition. + boolean seenPositive = false; + boolean seenNegative = false; + for(ReconstructedParticle track : particle.getParticles()) { + // Exactly one track must be negative. Its energy is + // disallowed from exceeding 900 MeV. + if(track.getCharge() < 0) { + // Reject a second negative particle. + if(seenNegative) { continue candidateLoop; } + + // Otherwise, note that one has been seen. + seenNegative = true; + electronMomentum = track.getMomentum().magnitude(); + + // Reject electrons with a momentum exceeding 900 MeV. + if(track.getMomentum().magnitude() > 0.900) { + continue candidateLoop; + } + } + + // Exactly one track must be positive. Its energy is + // not constrained. + else if(track.getCharge() > 0) { + // Reject a second positive particle. + if(seenPositive) { continue candidateLoop; } + + // Otherwise, note that one has been seen. + seenPositive = true; + positronMomentum = track.getMomentum().magnitude(); + } + + // Lastly, reject any particle that produced a photon. + else { continue candidateLoop; } + } + + // Populate the plots. + pair1MassHist.fill(particle.getMass()); + elasticElectronEnergyHist.fill(electronMomentum); + elasticPositronEnergyHist.fill(positronMomentum); + if(passedPair1Mod) { pair1ModMassHist.fill(particle.getMass()); } + } + } + + /** + * Creates a list of top/bottom cluster pairs. + * @param clusters - A <code>List</code> collection of objects of + * type <code>Cluster</code>. + * @return Returns a <code>List</code> collection of 2-entry arrays + * of <code>Cluster</code> objects representing top/bottom cluster + * pairs. The first entry is always the top cluster. + */ + private static final List<Cluster[]> getClusterPairs(List<Cluster> clusters) { + // Separate the clusters into top and bottom clusters. + List<Cluster> topList = new ArrayList<Cluster>(); + List<Cluster> botList = new ArrayList<Cluster>(); + for(Cluster cluster : clusters) { + if(cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy") > 0) { + topList.add(cluster); + } + else { botList.add(cluster); } + } + + // Create a list of all top/bottom pairs. + List<Cluster[]> pairs = new ArrayList<Cluster[]>(); + for(Cluster topCluster : topList) { + for(Cluster botCluster : botList) { + pairs.add(new Cluster[] { topCluster, botCluster }); + } + } + + // Return the list of cluster pairs. + return pairs; + } + + private static final List<ReconstructedParticle[]> getTrackPairs(List<ReconstructedParticle> trackList) { + // Create an empty list for the pairs. + List<ReconstructedParticle[]> pairs = new ArrayList<ReconstructedParticle[]>(); + + // Add all possible pairs of tracks. + for(int i = 0; i < trackList.size(); i++) { + for(int j = i + 1; j < trackList.size(); j++) { + pairs.add(new ReconstructedParticle[] { trackList.get(i), trackList.get(j) }); + } + } + + // Return the list of tracks. + return pairs; + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/MTEAnalysis.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/MTEAnalysis.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/MTEAnalysis.java Wed Mar 9 11:43:24 2016 @@ -24,145 +24,145 @@ import org.lcsim.util.aida.AIDA; public class MTEAnalysis extends Driver { - // Define track LCIO information. - private boolean skipBadSVT = true; - private String bankCollectionName = "TriggerBank"; - private String particleCollectionName = "FinalStateParticles"; - private static final AIDA aida = AIDA.defaultInstance(); - private IHistogram1D[] chargedTracksPlot = { - aida.histogram1D("MTE Analysis/Møller Event Tracks", 10, -0.5, 9.5), - aida.histogram1D("MTE Analysis/Trident Event Tracks", 10, -0.5, 9.5), - aida.histogram1D("MTE Analysis/Elastic Event Tracks", 10, -0.5, 9.5) - }; - private IHistogram1D[] clusterCountPlot = { - aida.histogram1D("MTE Analysis/Møller Event Clusters", 10, -0.5, 9.5), - aida.histogram1D("MTE Analysis/Trident Event Clusters", 10, -0.5, 9.5), - aida.histogram1D("MTE Analysis/Elastic Event Clusters", 10, -0.5, 9.5) - }; - private IHistogram1D[] energyPlot = { - aida.histogram1D("MTE Analysis/Møller Energy Sum Distribution", 220, 0, 2.2), - aida.histogram1D("MTE Analysis/Trident Energy Sum Distribution", 220, 0, 2.2), - aida.histogram1D("MTE Analysis/Elastic Energy Distribution", 110, 0, 1.5) - }; - private IHistogram1D[] electronPlot = { - aida.histogram1D("MTE Analysis/Møller Electron Energy Distribution", 220, 0, 2.2), - aida.histogram1D("MTE Analysis/Trident Electron Energy Distribution", 220, 0, 2.2), - }; - private IHistogram1D positronPlot = aida.histogram1D("MTE Analysis/Trident Positron Energy Distribution", 220, 0, 2.2); - private IHistogram2D[] energy2DPlot = { - aida.histogram2D("MTE Analysis/Møller 2D Energy Distribution", 55, 0, 1.1, 55, 0, 1.1), - aida.histogram2D("MTE Analysis/Trident 2D Energy Distribution", 55, 0, 1.1, 55, 0, 1.1), - }; - private IHistogram1D timePlot = aida.histogram1D("MTE Analysis/Track Cluster Time Distribution", 4000, 0, 400); - private IHistogram1D timeCoincidencePlot = aida.histogram1D("MTE Analysis/Møller Time Coincidence Distribution", 1000, 0, 100); - private IHistogram1D timeCoincidenceAllCutsPlot = aida.histogram1D("MTE Analysis/Møller Time Coincidence Distribution (All Møller Cuts)", 1000, 0, 100); - private IHistogram1D negTrackCount = aida.histogram1D("MTE Analysis/All Negative Tracks", 10, -0.5, 9.5); - private IHistogram1D posTrackCount = aida.histogram1D("MTE Analysis/All Positive Event Tracks", 10, -0.5, 9.5); - private IHistogram1D chargedTrackCount = aida.histogram1D("MTE Analysis/All Event Event Tracks", 10, -0.5, 9.5); - - private IHistogram1D trInvariantMassAll = aida.histogram1D("Trident/Invariant Mass", 1500, 0.0, 1.5); - private IHistogram1D trInvariantMassFiducial = aida.histogram1D("Trident/Invariant Mass (Fiducial Region)", 1500, 0.0, 1.5); - private IHistogram1D trTimeCoincidenceAll = aida.histogram1D("Trident/Time Coincidence", 300, -15.0, 15.0); - private IHistogram1D trTimeCoincidenceFiducial = aida.histogram1D("Trident/Time Coincidence (Fiducial Region)", 300, -15.0, 15.0); - private IHistogram1D trEnergySumAll = aida.histogram1D("Trident/Energy Sum", 300, 0.0, 1.5); - private IHistogram1D trEnergySumFiducial = aida.histogram1D("Trident/Energy Sum (Fiducial Region)", 300, 0.0, 1.5); - private IHistogram2D trEnergySum2DAll = aida.histogram2D("Trident/First Cluster Energy vs. Second Cluster Energy", 300, 0, 1.5, 300, 0, 1.5); - private IHistogram2D trEnergySum2DFiducial = aida.histogram2D("Trident/First Cluster Energy vs. Second Cluster Energy (Fiducial Region)", 300, 0, 1.5, 300, 0, 1.5); - private IHistogram2D trSumCoplanarityAll = aida.histogram2D("Trident/Hardware Coplanarity vs. Energy Sum", 300, 0, 1.5, 115, 0, 180); - private IHistogram2D trSumCoplanarityFiducial = aida.histogram2D("Trident/Hardware Coplanarity vs. Energy Sum (Fiducial Region)", 300, 0, 1.5, 115, 0, 180); - private IHistogram2D trSumCoplanarityCalcAll = aida.histogram2D("Trident/Calculated Coplanarity vs. Energy Sum", 300, 0, 1.5, 115, 130, 230); - private IHistogram2D trSumCoplanarityCalcFiducial = aida.histogram2D("Trident/Calculated Coplanarity vs. Energy Sum (Fiducial Region)", 300, 0, 1.5, 115, 130, 230); - private IHistogram2D trTimeEnergyAll = aida.histogram2D("Trident/Cluster Time vs. Cluster Energy", 300, 0, 1.5, 100, 0, 100); - private IHistogram2D trTimeEnergyFiducial = aida.histogram2D("Trident/Cluster Time vs. Cluster Energy (Fiducial Region)", 300, 0, 1.5, 100, 0, 100); - - private TriggerPlotsModule allPlots = new TriggerPlotsModule("All"); - private TriggerPlotsModule møllerPlots = new TriggerPlotsModule("Møller"); - private TriggerPlotsModule tridentPlots = new TriggerPlotsModule("Trident"); - private TriggerPlotsModule elasticPlots = new TriggerPlotsModule("Elastic"); - private static final int MÃLLER = 0; - private static final int TRIDENT = 1; - private static final int ELASTIC = 2; - private boolean verbose = false; - private boolean excludeNoTrackEvents = false; - private double timeCoincidenceCut = Double.MAX_VALUE; - private Map<String, Integer> møllerBitMap = new HashMap<String, Integer>(); - private Map<String, Integer> tridentBitMap = new HashMap<String, Integer>(); - private Map<String, Integer> elasticBitMap = new HashMap<String, Integer>(); - private int møllerEvents = 0; - private int tridentEvents = 0; - private int elasticEvents = 0; - private int totalEvents = 0; - private int pair1Events = 0; - private int pair0Events = 0; - private int singles1Events = 0; - private int singles0Events = 0; - private int pulserEvents = 0; - - @Override - public void startOfData() { - for(int s0 = 0; s0 <= 1; s0++) { - for(int s1 = 0; s1 <= 1; s1++) { - for(int p0 = 0; p0 <= 1; p0++) { - for(int p1 = 0; p1 <= 1; p1++) { - for(int pulser = 0; pulser <=1; pulser++) { - // Set each "trigger bit." - boolean s0bit = (s0 == 1); - boolean s1bit = (s1 == 1); - boolean p0bit = (p0 == 1); - boolean p1bit = (p1 == 1); - boolean pulserBit = (p1 == 1); - - // Generate the bit string. - String bitString = getBitString(s0bit, s1bit, p0bit, p1bit, pulserBit); - - // Set a default value of zero for this bit combination. - møllerBitMap.put(bitString, 1); - tridentBitMap.put(bitString, 1); - elasticBitMap.put(bitString, 1); - } - } - } - } - } - } - - @Override - public void endOfData() { - System.out.println("Møller Events :: " + møllerEvents); - System.out.println("Trident Events :: " + tridentEvents); - System.out.println("Elastic Events :: " + elasticEvents); - System.out.println("Total Events :: " + totalEvents); - System.out.println("Pair 1 Events :: " + pair1Events); - System.out.println("Pair 0 Events :: " + pair0Events); - System.out.println("Singles 1 Events :: " + singles1Events); - System.out.println("Singles 0 Events :: " + singles0Events); - System.out.println("Pulser Events :: " + pulserEvents); - - System.out.println("Plsr\tS0\tS1\tP0\tP1\tMøller"); - for(Entry<String, Integer> entry : møllerBitMap.entrySet()) { - System.out.println(entry.getKey() + "\t" + entry.getValue()); - } - - System.out.println("Plsr\tS0\tS1\tP0\tP1\tTrident"); - for(Entry<String, Integer> entry : tridentBitMap.entrySet()) { - System.out.println(entry.getKey() + "\t" + entry.getValue()); - } - - System.out.println("Plsr\tS0\tS1\tP0\tP1\tElastic"); - for(Entry<String, Integer> entry : elasticBitMap.entrySet()) { - System.out.println(entry.getKey() + "\t" + entry.getValue()); - } - } - - private static final String getBitString(boolean s0, boolean s1, boolean p0, boolean p1, boolean pulser) { - return String.format("%d\t%d\t%d\t%d\t%d", (pulser ? 1 : 0), (s0 ? 1 : 0), (s1 ? 1 : 0), (p0 ? 1 : 0), (p1 ? 1 : 0)); - } - - @Override - public void process(EventHeader event) { - // Check whether the SVT was active in this event. - final String[] flagNames = { "svt_bias_good", "svt_burstmode_noise_good", "svt_position_good" }; - boolean svtGood = true; + // Define track LCIO information. + private boolean skipBadSVT = true; + private String bankCollectionName = "TriggerBank"; + private String particleCollectionName = "FinalStateParticles"; + private static final AIDA aida = AIDA.defaultInstance(); + private IHistogram1D[] chargedTracksPlot = { + aida.histogram1D("MTE Analysis/Møller Event Tracks", 10, -0.5, 9.5), + aida.histogram1D("MTE Analysis/Trident Event Tracks", 10, -0.5, 9.5), + aida.histogram1D("MTE Analysis/Elastic Event Tracks", 10, -0.5, 9.5) + }; + private IHistogram1D[] clusterCountPlot = { + aida.histogram1D("MTE Analysis/Møller Event Clusters", 10, -0.5, 9.5), + aida.histogram1D("MTE Analysis/Trident Event Clusters", 10, -0.5, 9.5), + aida.histogram1D("MTE Analysis/Elastic Event Clusters", 10, -0.5, 9.5) + }; + private IHistogram1D[] energyPlot = { + aida.histogram1D("MTE Analysis/Møller Energy Sum Distribution", 220, 0, 2.2), + aida.histogram1D("MTE Analysis/Trident Energy Sum Distribution", 220, 0, 2.2), + aida.histogram1D("MTE Analysis/Elastic Energy Distribution", 110, 0, 1.5) + }; + private IHistogram1D[] electronPlot = { + aida.histogram1D("MTE Analysis/Møller Electron Energy Distribution", 220, 0, 2.2), + aida.histogram1D("MTE Analysis/Trident Electron Energy Distribution", 220, 0, 2.2), + }; + private IHistogram1D positronPlot = aida.histogram1D("MTE Analysis/Trident Positron Energy Distribution", 220, 0, 2.2); + private IHistogram2D[] energy2DPlot = { + aida.histogram2D("MTE Analysis/Møller 2D Energy Distribution", 55, 0, 1.1, 55, 0, 1.1), + aida.histogram2D("MTE Analysis/Trident 2D Energy Distribution", 55, 0, 1.1, 55, 0, 1.1), + }; + private IHistogram1D timePlot = aida.histogram1D("MTE Analysis/Track Cluster Time Distribution", 4000, 0, 400); + private IHistogram1D timeCoincidencePlot = aida.histogram1D("MTE Analysis/Møller Time Coincidence Distribution", 1000, 0, 100); + private IHistogram1D timeCoincidenceAllCutsPlot = aida.histogram1D("MTE Analysis/Møller Time Coincidence Distribution (All Møller Cuts)", 1000, 0, 100); + private IHistogram1D negTrackCount = aida.histogram1D("MTE Analysis/All Negative Tracks", 10, -0.5, 9.5); + private IHistogram1D posTrackCount = aida.histogram1D("MTE Analysis/All Positive Event Tracks", 10, -0.5, 9.5); + private IHistogram1D chargedTrackCount = aida.histogram1D("MTE Analysis/All Event Event Tracks", 10, -0.5, 9.5); + + private IHistogram1D trInvariantMassAll = aida.histogram1D("Trident/Invariant Mass", 1500, 0.0, 1.5); + private IHistogram1D trInvariantMassFiducial = aida.histogram1D("Trident/Invariant Mass (Fiducial Region)", 1500, 0.0, 1.5); + private IHistogram1D trTimeCoincidenceAll = aida.histogram1D("Trident/Time Coincidence", 300, -15.0, 15.0); + private IHistogram1D trTimeCoincidenceFiducial = aida.histogram1D("Trident/Time Coincidence (Fiducial Region)", 300, -15.0, 15.0); + private IHistogram1D trEnergySumAll = aida.histogram1D("Trident/Energy Sum", 300, 0.0, 1.5); + private IHistogram1D trEnergySumFiducial = aida.histogram1D("Trident/Energy Sum (Fiducial Region)", 300, 0.0, 1.5); + private IHistogram2D trEnergySum2DAll = aida.histogram2D("Trident/First Cluster Energy vs. Second Cluster Energy", 300, 0, 1.5, 300, 0, 1.5); + private IHistogram2D trEnergySum2DFiducial = aida.histogram2D("Trident/First Cluster Energy vs. Second Cluster Energy (Fiducial Region)", 300, 0, 1.5, 300, 0, 1.5); + private IHistogram2D trSumCoplanarityAll = aida.histogram2D("Trident/Hardware Coplanarity vs. Energy Sum", 300, 0, 1.5, 115, 0, 180); + private IHistogram2D trSumCoplanarityFiducial = aida.histogram2D("Trident/Hardware Coplanarity vs. Energy Sum (Fiducial Region)", 300, 0, 1.5, 115, 0, 180); + private IHistogram2D trSumCoplanarityCalcAll = aida.histogram2D("Trident/Calculated Coplanarity vs. Energy Sum", 300, 0, 1.5, 115, 130, 230); + private IHistogram2D trSumCoplanarityCalcFiducial = aida.histogram2D("Trident/Calculated Coplanarity vs. Energy Sum (Fiducial Region)", 300, 0, 1.5, 115, 130, 230); + private IHistogram2D trTimeEnergyAll = aida.histogram2D("Trident/Cluster Time vs. Cluster Energy", 300, 0, 1.5, 100, 0, 100); + private IHistogram2D trTimeEnergyFiducial = aida.histogram2D("Trident/Cluster Time vs. Cluster Energy (Fiducial Region)", 300, 0, 1.5, 100, 0, 100); + + private TriggerPlotsModule allPlots = new TriggerPlotsModule("All"); + private TriggerPlotsModule møllerPlots = new TriggerPlotsModule("Møller"); + private TriggerPlotsModule tridentPlots = new TriggerPlotsModule("Trident"); + private TriggerPlotsModule elasticPlots = new TriggerPlotsModule("Elastic"); + private static final int MÃLLER = 0; + private static final int TRIDENT = 1; + private static final int ELASTIC = 2; + private boolean verbose = false; + private boolean excludeNoTrackEvents = false; + private double timeCoincidenceCut = Double.MAX_VALUE; + private Map<String, Integer> møllerBitMap = new HashMap<String, Integer>(); + private Map<String, Integer> tridentBitMap = new HashMap<String, Integer>(); + private Map<String, Integer> elasticBitMap = new HashMap<String, Integer>(); + private int møllerEvents = 0; + private int tridentEvents = 0; + private int elasticEvents = 0; + private int totalEvents = 0; + private int pair1Events = 0; + private int pair0Events = 0; + private int singles1Events = 0; + private int singles0Events = 0; + private int pulserEvents = 0; + + @Override + public void startOfData() { + for(int s0 = 0; s0 <= 1; s0++) { + for(int s1 = 0; s1 <= 1; s1++) { + for(int p0 = 0; p0 <= 1; p0++) { + for(int p1 = 0; p1 <= 1; p1++) { + for(int pulser = 0; pulser <=1; pulser++) { + // Set each "trigger bit." + boolean s0bit = (s0 == 1); + boolean s1bit = (s1 == 1); + boolean p0bit = (p0 == 1); + boolean p1bit = (p1 == 1); + boolean pulserBit = (p1 == 1); + + // Generate the bit string. + String bitString = getBitString(s0bit, s1bit, p0bit, p1bit, pulserBit); + + // Set a default value of zero for this bit combination. + møllerBitMap.put(bitString, 1); + tridentBitMap.put(bitString, 1); + elasticBitMap.put(bitString, 1); + } + } + } + } + } + } + + @Override + public void endOfData() { + System.out.println("Møller Events :: " + møllerEvents); + System.out.println("Trident Events :: " + tridentEvents); + System.out.println("Elastic Events :: " + elasticEvents); + System.out.println("Total Events :: " + totalEvents); + System.out.println("Pair 1 Events :: " + pair1Events); + System.out.println("Pair 0 Events :: " + pair0Events); + System.out.println("Singles 1 Events :: " + singles1Events); + System.out.println("Singles 0 Events :: " + singles0Events); + System.out.println("Pulser Events :: " + pulserEvents); + + System.out.println("Plsr\tS0\tS1\tP0\tP1\tMøller"); + for(Entry<String, Integer> entry : møllerBitMap.entrySet()) { + System.out.println(entry.getKey() + "\t" + entry.getValue()); + } + + System.out.println("Plsr\tS0\tS1\tP0\tP1\tTrident"); + for(Entry<String, Integer> entry : tridentBitMap.entrySet()) { + System.out.println(entry.getKey() + "\t" + entry.getValue()); + } + + System.out.println("Plsr\tS0\tS1\tP0\tP1\tElastic"); + for(Entry<String, Integer> entry : elasticBitMap.entrySet()) { + System.out.println(entry.getKey() + "\t" + entry.getValue()); + } + } + + private static final String getBitString(boolean s0, boolean s1, boolean p0, boolean p1, boolean pulser) { + return String.format("%d\t%d\t%d\t%d\t%d", (pulser ? 1 : 0), (s0 ? 1 : 0), (s1 ? 1 : 0), (p0 ? 1 : 0), (p1 ? 1 : 0)); + } + + @Override + public void process(EventHeader event) { + // Check whether the SVT was active in this event. + final String[] flagNames = { "svt_bias_good", "svt_burstmode_noise_good", "svt_position_good" }; + boolean svtGood = true; for(int i = 0; i < flagNames.length; i++) { int[] flag = event.getIntegerParameters().get(flagNames[i]); if(flag == null || flag[0] == 0) { @@ -172,437 +172,437 @@ // If the SVT was bad, then skip the event. if(!svtGood && skipBadSVT) { - return; - } - - if(event.hasCollection(ReconstructedParticle.class, particleCollectionName)) { - // Get the list of tracks. - List<ReconstructedParticle> trackList = event.get(ReconstructedParticle.class, particleCollectionName); - - // Plot the time stamps of all tracks. - for(ReconstructedParticle track : trackList) { - if(track.getClusters().size() != 0) { - Cluster cluster = track.getClusters().get(0); - timePlot.fill(cluster.getCalorimeterHits().get(0).getTime()); - } - } - - if(verbose) { - System.out.println(trackList.size() + " tracks found."); - for(ReconstructedParticle track : trackList) { - System.out.printf("Track :: Q = %4.1f; E = %6.3f%n", - track.getCharge(), track.getEnergy()); - } - } - - // Populate the all cluster plots. - List<Cluster> topClusters = new ArrayList<Cluster>(); - List<Cluster> botClusters = new ArrayList<Cluster>(); - List<Cluster> clusters = event.get(Cluster.class, "EcalClusters"); - for(Cluster cluster : clusters) { - allPlots.addCluster(cluster); - if(cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy") > 0) { topClusters.add(cluster); } - else { botClusters.add(cluster); } - } - - // Make cluster pairs. - List<Cluster[]> clusterPairs = new ArrayList<Cluster[]>(); - for(Cluster topCluster : topClusters) { - for(Cluster botCluster : botClusters) { - clusterPairs.add(new Cluster[] { topCluster, botCluster }); - } - } - - // Populate the all cluster pair plots. - for(Cluster[] pair : clusterPairs) { - allPlots.addClusterPair(pair); - } - - // Check each of the event-type conditions. - boolean isMøller = false; - boolean isTrident = false; - boolean isElastic = false; - - // Produce all possible pairs of tracks. - List<ReconstructedParticle[]> pairList = getTrackPairs(trackList); - - // Check the Møller condition. A Møller event is expected - // to have two tracks, both negative, with a net energy - // within a certain band of the beam energy. - møllerTrackLoop: - for(ReconstructedParticle[] pair : pairList) { - // If trackless events are to be excluded, then require - // that each "track" have a real track. - if(excludeNoTrackEvents && (pair[0].getTracks().isEmpty() || pair[1].getTracks().isEmpty())) { - continue møllerTrackLoop; - } - - // Both tracks are required to be negatively charged. - if(pair[0].getCharge() >= 0 || pair[1].getCharge() >= 0) { - continue møllerTrackLoop; - } - - // Both tracks must have clusters associated with them. - Cluster[] trackClusters = new Cluster[2]; - for(int i = 0; i < 2; i++) { - // Disallow tracks with no associated clusters. - if(pair[i].getClusters().size() == 0) { - continue møllerTrackLoop; - } - - // Store the first cluster associated with the track. - trackClusters[i] = pair[i].getClusters().get(0); - } - - // Require that the track clusters be within a certain - // time window of one another. - CalorimeterHit[] seeds = new CalorimeterHit[2]; - seeds[0] = trackClusters[0].getCalorimeterHits().get(0); - seeds[1] = trackClusters[1].getCalorimeterHits().get(0); - timeCoincidencePlot.fill(Math.abs(seeds[0].getTime() - seeds[1].getTime())); - if(Math.abs(trackClusters[0].getCalorimeterHits().get(0).getTime() - trackClusters[1].getCalorimeterHits().get(0).getTime()) > timeCoincidenceCut) { - continue møllerTrackLoop; - } - - // Require both tracks to occur within the range of - // 36.5 and 49 ns. - if(seeds[0].getTime() < 36.5 || seeds[0].getTime() > 49) { - continue møllerTrackLoop; - } if(seeds[1].getTime() < 36.5 || seeds[1].getTime() > 49) { - continue møllerTrackLoop; - } - - // No track may have an energy that exceeds 900 MeV. - if(pair[0].getMomentum().magnitude() >= 0.900 || pair[1].getMomentum().magnitude() >= 0.900) { - continue møllerTrackLoop; - } - - // Get the energy sum. - double sum = VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(); - - // "Møller-like" track pairs must have energies within - // an allowed energy range. - if(sum < 0.800 || sum > 1.500) { - continue møllerTrackLoop; - } - - //timeCoincidenceAllCutsPlot.fill(Math.abs(seeds[0].getTime() - seeds[1].getTime())); - - // Note that this is a Møller event. - isMøller = true; - - // Populate the Møller plots. - energyPlot[MÃLLER].fill(sum); - møllerPlots.addClusterPair(trackClusters); - electronPlot[MÃLLER].fill(pair[0].getMomentum().magnitude()); - electronPlot[MÃLLER].fill(pair[1].getMomentum().magnitude()); - energy2DPlot[MÃLLER].fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); - } - - // Check the elastic condition. Elastic events should be - // negatively and have an energy approximately equal to - // the beam energy. - elasticTrackLoop: - for(ReconstructedParticle track : trackList) { - // If trackless events are to be excluded, then require - // that the "track" has a real track. - if(excludeNoTrackEvents && track.getTracks().isEmpty()) { - continue elasticTrackLoop; - } - - // Check the elastic condition. - if(track.getCharge() < 0 && track.getMomentum().magnitude() >= 0.900) { - isElastic = true; - energyPlot[ELASTIC].fill(track.getMomentum().magnitude()); - if(!track.getClusters().isEmpty()) { - elasticPlots.addCluster(track.getClusters().get(0)); - } - } - } - - // Check the trident condition. Tridents are events that - // contain both one positive and one negative track. - tridentTrackLoop: - for(ReconstructedParticle[] pair : pairList) { - // If trackless events are to be excluded, then require - // that each "track" have a real track. - if(pair[0].getTracks().isEmpty() || pair[1].getTracks().isEmpty()) { - continue tridentTrackLoop; - } - - // Require that all tridents consist of a positive and - // negative pair. - boolean isPosNeg = (pair[0].getCharge() < 0 && pair[1].getCharge() > 0) || (pair[0].getCharge() > 0 && pair[1].getCharge() < 0); - if(!isPosNeg) { continue tridentTrackLoop; } - - // Both tracks must have clusters associated with them. - Cluster[] trackClusters = new Cluster[pair.length]; - for(int i = 0; i < pair.length; i++) { - // Disallow tracks with no associated clusters. - if(pair[i].getClusters().size() == 0) { - continue tridentTrackLoop; - } - - // Store the first cluster associated with the track. - trackClusters[i] = pair[i].getClusters().get(0); - } - - // Make sure that the clusters are not the same. - if(trackClusters[0] == trackClusters[1]) { - continue tridentTrackLoop; - } - - // Require that tridents also be a top/bottom pair. - boolean isTopBot = (TriggerModule.getClusterYIndex(trackClusters[0]) > 0 && TriggerModule.getClusterYIndex(trackClusters[1]) < 0) - || (TriggerModule.getClusterYIndex(trackClusters[0]) < 0 && TriggerModule.getClusterYIndex(trackClusters[1]) > 0); - if(!isTopBot) { - continue tridentTrackLoop; - } - - // Require that the track clusters be within a certain - // time window of one another. - CalorimeterHit[] seeds = new CalorimeterHit[2]; - seeds[0] = trackClusters[0].getCalorimeterHits().get(0); - seeds[1] = trackClusters[1].getCalorimeterHits().get(0); - timeCoincidencePlot.fill(Math.abs(seeds[0].getTime() - seeds[1].getTime())); - if(Math.abs(trackClusters[0].getCalorimeterHits().get(0).getTime() - trackClusters[1].getCalorimeterHits().get(0).getTime()) > timeCoincidenceCut) { - continue tridentTrackLoop; - } - - // Require that the energy of the electron is below - // 900 MeV. - boolean electronNotElastic = (pair[0].getCharge() < 0 && pair[0].getMomentum().magnitude() < 0.900) - || (pair[1].getCharge() < 0 && pair[1].getMomentum().magnitude() < 0.900); - if(!electronNotElastic) { - continue tridentTrackLoop; - } - - // If all tests are passed, this is a trident. Note - // this and populate the trident plots. - isTrident = true; - tridentPlots.addClusterPair(trackClusters); - if(pair[0].getCharge() > 0) { - positronPlot.fill(pair[1].getMomentum().magnitude()); - electronPlot[TRIDENT].fill(pair[0].getMomentum().magnitude()); - } else { - positronPlot.fill(pair[0].getMomentum().magnitude()); - electronPlot[TRIDENT].fill(pair[1].getMomentum().magnitude()); - } - energyPlot[TRIDENT].fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude()); - energy2DPlot[TRIDENT].fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); - - // Track which clusters have already been added to the - // singles plot so that there are no repeats. - Set<Cluster> plotSet = new HashSet<Cluster>(); - Set<Cluster> plotFiducial = new HashSet<Cluster>(); - - // Fill the all pairs plots. - double pairEnergy = trackClusters[0].getEnergy() + trackClusters[1].getEnergy(); - trEnergySumAll.fill(pairEnergy); - trEnergySum2DAll.fill(trackClusters[1].getEnergy(), trackClusters[0].getEnergy()); - trTimeCoincidenceAll.fill(RafoAnalysis.getTimeConicidence(trackClusters)); - trSumCoplanarityCalcAll.fill(pairEnergy, getCalculatedCoplanarity(trackClusters)); - trSumCoplanarityAll.fill(pairEnergy, TriggerModule.getValueCoplanarity(trackClusters)); - trInvariantMassAll.fill(RafoAnalysis.getInvariantMass(pair)); - - // Fill the singles plots. - if(!plotSet.contains(trackClusters[0])) { - plotSet.add(trackClusters[0]); - trTimeEnergyAll.fill(trackClusters[0].getEnergy(), TriggerModule.getClusterTime(trackClusters[0])); - } if(!plotSet.contains(trackClusters[1])) { - plotSet.add(trackClusters[1]); - trTimeEnergyAll.fill(trackClusters[1].getEnergy(), TriggerModule.getClusterTime(trackClusters[1])); - } - - // Fill the fiducial plots if appropriate. - if(inFiducialRegion(trackClusters[0]) && inFiducialRegion(trackClusters[1])) { - trEnergySumFiducial.fill(pairEnergy); - trEnergySum2DFiducial.fill(trackClusters[1].getEnergy(), trackClusters[0].getEnergy()); - trTimeCoincidenceFiducial.fill(RafoAnalysis.getTimeConicidence(trackClusters)); - trSumCoplanarityCalcFiducial.fill(pairEnergy, getCalculatedCoplanarity(trackClusters)); - trSumCoplanarityFiducial.fill(pairEnergy, TriggerModule.getValueCoplanarity(trackClusters)); - trInvariantMassFiducial.fill(RafoAnalysis.getInvariantMass(pair)); - } - - // Fill the singles fiducial plots if appropriate. - if(!plotFiducial.contains(trackClusters[0]) && inFiducialRegion(trackClusters[0])) { - plotFiducial.add(trackClusters[0]); - trTimeEnergyFiducial.fill(trackClusters[0].getEnergy(), TriggerModule.getClusterTime(trackClusters[0])); - } if(!plotFiducial.contains(trackClusters[1]) && inFiducialRegion(trackClusters[1])) { - plotFiducial.add(trackClusters[1]); - trTimeEnergyFiducial.fill(trackClusters[1].getEnergy(), TriggerModule.getClusterTime(trackClusters[1])); - } - } - - if(verbose) { - System.out.printf("\tMøller :: %b%n", isMøller); - System.out.printf("\tTrident :: %b%n", isTrident); - System.out.printf("\tElastic :: %b%n", isElastic); - System.out.println(); - } - - // Get the TI bits. - String bitString = null; - TIData tiBank = null; - List<GenericObject> bankList = event.get(GenericObject.class, bankCollectionName); - for(GenericObject obj : bankList) { - if(AbstractIntData.getTag(obj) == TIData.BANK_TAG) { - tiBank = new TIData(obj); - bitString = getBitString(tiBank.isPulserTrigger(), tiBank.isSingle0Trigger(), - tiBank.isSingle1Trigger(), tiBank.isPair0Trigger(), tiBank.isPair1Trigger()); - - if(tiBank.isPair1Trigger()) { - pair1Events++; - } else if(tiBank.isPair0Trigger()) { - pair0Events++; - } else if(tiBank.isSingle1Trigger()) { - singles1Events++; - } else if(tiBank.isSingle0Trigger()) { - singles0Events++; - } else if(tiBank.isPulserTrigger()) { - pulserEvents++; - } - } - } - if(bitString == null) { - System.out.println("No TI data found!!"); - } - - // Get the number of charged tracks in the event. - int tracks = 0; - int posTracks = 0; - int negTracks = 0; - for(ReconstructedParticle track : trackList) { - if(track.getCharge() != 0 && tiBank.isPulserTrigger()) { - if(excludeNoTrackEvents && !track.getTracks().isEmpty()) { - tracks++; - if(track.getCharge() > 0) { posTracks++; } - else { negTracks++; } - } else { - tracks++; - if(track.getCharge() > 0) { posTracks++; } - else { negTracks++; } - } - } - } - - // Populate the "all tracks" plots. - posTrackCount.fill(posTracks); - negTrackCount.fill(negTracks); - chargedTrackCount.fill(tracks); - - // Add the result to the appropriate plots and increment - // the appropriate trigger bit combination. - if(isMøller) { - møllerEvents++; - chargedTracksPlot[MÃLLER].fill(tracks); - clusterCountPlot[MÃLLER].fill(clusters.size()); - - Integer val = møllerBitMap.get(bitString); - if(val == null) { møllerBitMap.put(bitString, 1); } - else { møllerBitMap.put(bitString, val + 1); } - } else if(isTrident) { - tridentEvents++; - chargedTracksPlot[TRIDENT].fill(tracks); - clusterCountPlot[TRIDENT].fill(clusters.size()); - - Integer val = tridentBitMap.get(bitString); - if(val == null) { tridentBitMap.put(bitString, 1); } - else { tridentBitMap.put(bitString, val + 1); } - } else if(isElastic) { - elasticEvents++; - chargedTracksPlot[ELASTIC].fill(tracks); - clusterCountPlot[ELASTIC].fill(clusters.size()); - - Integer val = elasticBitMap.get(bitString); - if(val == null) { elasticBitMap.put(bitString, 1); } - else { elasticBitMap.put(bitString, val + 1); } - } - totalEvents++; - } - } - - private static final double getCalculatedCoplanarity(Cluster[] pair) { - // Define the x- and y-coordinates of the clusters as well as - // calorimeter center. - final double ORIGIN_X = 42.52; - double x[] = { pair[0].getPosition()[0], pair[1].getPosition()[0] }; - double y[] = { pair[0].getPosition()[1], pair[1].getPosition()[1] }; - + return; + } + + if(event.hasCollection(ReconstructedParticle.class, particleCollectionName)) { + // Get the list of tracks. + List<ReconstructedParticle> trackList = event.get(ReconstructedParticle.class, particleCollectionName); + + // Plot the time stamps of all tracks. + for(ReconstructedParticle track : trackList) { + if(track.getClusters().size() != 0) { + Cluster cluster = track.getClusters().get(0); + timePlot.fill(cluster.getCalorimeterHits().get(0).getTime()); + } + } + + if(verbose) { + System.out.println(trackList.size() + " tracks found."); + for(ReconstructedParticle track : trackList) { + System.out.printf("Track :: Q = %4.1f; E = %6.3f%n", + track.getCharge(), track.getEnergy()); + } + } + + // Populate the all cluster plots. + List<Cluster> topClusters = new ArrayList<Cluster>(); + List<Cluster> botClusters = new ArrayList<Cluster>(); + List<Cluster> clusters = event.get(Cluster.class, "EcalClusters"); + for(Cluster cluster : clusters) { + allPlots.addCluster(cluster); + if(cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy") > 0) { topClusters.add(cluster); } + else { botClusters.add(cluster); } + } + + // Make cluster pairs. + List<Cluster[]> clusterPairs = new ArrayList<Cluster[]>(); + for(Cluster topCluster : topClusters) { + for(Cluster botCluster : botClusters) { + clusterPairs.add(new Cluster[] { topCluster, botCluster }); + } + } + + // Populate the all cluster pair plots. + for(Cluster[] pair : clusterPairs) { + allPlots.addClusterPair(pair); + } + + // Check each of the event-type conditions. + boolean isMøller = false; + boolean isTrident = false; + boolean isElastic = false; + + // Produce all possible pairs of tracks. + List<ReconstructedParticle[]> pairList = getTrackPairs(trackList); + + // Check the Møller condition. A Møller event is expected + // to have two tracks, both negative, with a net energy + // within a certain band of the beam energy. + møllerTrackLoop: + for(ReconstructedParticle[] pair : pairList) { + // If trackless events are to be excluded, then require + // that each "track" have a real track. + if(excludeNoTrackEvents && (pair[0].getTracks().isEmpty() || pair[1].getTracks().isEmpty())) { + continue møllerTrackLoop; + } + + // Both tracks are required to be negatively charged. + if(pair[0].getCharge() >= 0 || pair[1].getCharge() >= 0) { + continue møllerTrackLoop; + } + + // Both tracks must have clusters associated with them. + Cluster[] trackClusters = new Cluster[2]; + for(int i = 0; i < 2; i++) { + // Disallow tracks with no associated clusters. + if(pair[i].getClusters().size() == 0) { + continue møllerTrackLoop; + } + + // Store the first cluster associated with the track. + trackClusters[i] = pair[i].getClusters().get(0); + } + + // Require that the track clusters be within a certain + // time window of one another. + CalorimeterHit[] seeds = new CalorimeterHit[2]; + seeds[0] = trackClusters[0].getCalorimeterHits().get(0); + seeds[1] = trackClusters[1].getCalorimeterHits().get(0); + timeCoincidencePlot.fill(Math.abs(seeds[0].getTime() - seeds[1].getTime())); + if(Math.abs(trackClusters[0].getCalorimeterHits().get(0).getTime() - trackClusters[1].getCalorimeterHits().get(0).getTime()) > timeCoincidenceCut) { + continue møllerTrackLoop; + } + + // Require both tracks to occur within the range of + // 36.5 and 49 ns. + if(seeds[0].getTime() < 36.5 || seeds[0].getTime() > 49) { + continue møllerTrackLoop; + } if(seeds[1].getTime() < 36.5 || seeds[1].getTime() > 49) { + continue møllerTrackLoop; + } + + // No track may have an energy that exceeds 900 MeV. + if(pair[0].getMomentum().magnitude() >= 0.900 || pair[1].getMomentum().magnitude() >= 0.900) { + continue møllerTrackLoop; + } + + // Get the energy sum. + double sum = VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(); + + // "Møller-like" track pairs must have energies within + // an allowed energy range. + if(sum < 0.800 || sum > 1.500) { + continue møllerTrackLoop; + } + + //timeCoincidenceAllCutsPlot.fill(Math.abs(seeds[0].getTime() - seeds[1].getTime())); + + // Note that this is a Møller event. + isMøller = true; + + // Populate the Møller plots. + energyPlot[MÃLLER].fill(sum); + møllerPlots.addClusterPair(trackClusters); + electronPlot[MÃLLER].fill(pair[0].getMomentum().magnitude()); + electronPlot[MÃLLER].fill(pair[1].getMomentum().magnitude()); + energy2DPlot[MÃLLER].fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); + } + + // Check the elastic condition. Elastic events should be + // negatively and have an energy approximately equal to + // the beam energy. + elasticTrackLoop: + for(ReconstructedParticle track : trackList) { + // If trackless events are to be excluded, then require + // that the "track" has a real track. + if(excludeNoTrackEvents && track.getTracks().isEmpty()) { + continue elasticTrackLoop; + } + + // Check the elastic condition. + if(track.getCharge() < 0 && track.getMomentum().magnitude() >= 0.900) { + isElastic = true; + energyPlot[ELASTIC].fill(track.getMomentum().magnitude()); + if(!track.getClusters().isEmpty()) { + elasticPlots.addCluster(track.getClusters().get(0)); + } + } + } + + // Check the trident condition. Tridents are events that + // contain both one positive and one negative track. + tridentTrackLoop: + for(ReconstructedParticle[] pair : pairList) { + // If trackless events are to be excluded, then require + // that each "track" have a real track. + if(pair[0].getTracks().isEmpty() || pair[1].getTracks().isEmpty()) { + continue tridentTrackLoop; + } + + // Require that all tridents consist of a positive and + // negative pair. + boolean isPosNeg = (pair[0].getCharge() < 0 && pair[1].getCharge() > 0) || (pair[0].getCharge() > 0 && pair[1].getCharge() < 0); + if(!isPosNeg) { continue tridentTrackLoop; } + + // Both tracks must have clusters associated with them. + Cluster[] trackClusters = new Cluster[pair.length]; + for(int i = 0; i < pair.length; i++) { + // Disallow tracks with no associated clusters. + if(pair[i].getClusters().size() == 0) { + continue tridentTrackLoop; + } + + // Store the first cluster associated with the track. + trackClusters[i] = pair[i].getClusters().get(0); + } + + // Make sure that the clusters are not the same. + if(trackClusters[0] == trackClusters[1]) { + continue tridentTrackLoop; + } + + // Require that tridents also be a top/bottom pair. + boolean isTopBot = (TriggerModule.getClusterYIndex(trackClusters[0]) > 0 && TriggerModule.getClusterYIndex(trackClusters[1]) < 0) + || (TriggerModule.getClusterYIndex(trackClusters[0]) < 0 && TriggerModule.getClusterYIndex(trackClusters[1]) > 0); + if(!isTopBot) { + continue tridentTrackLoop; + } + + // Require that the track clusters be within a certain + // time window of one another. + CalorimeterHit[] seeds = new CalorimeterHit[2]; + seeds[0] = trackClusters[0].getCalorimeterHits().get(0); + seeds[1] = trackClusters[1].getCalorimeterHits().get(0); + timeCoincidencePlot.fill(Math.abs(seeds[0].getTime() - seeds[1].getTime())); + if(Math.abs(trackClusters[0].getCalorimeterHits().get(0).getTime() - trackClusters[1].getCalorimeterHits().get(0).getTime()) > timeCoincidenceCut) { + continue tridentTrackLoop; + } + + // Require that the energy of the electron is below + // 900 MeV. + boolean electronNotElastic = (pair[0].getCharge() < 0 && pair[0].getMomentum().magnitude() < 0.900) + || (pair[1].getCharge() < 0 && pair[1].getMomentum().magnitude() < 0.900); + if(!electronNotElastic) { + continue tridentTrackLoop; + } + + // If all tests are passed, this is a trident. Note + // this and populate the trident plots. + isTrident = true; + tridentPlots.addClusterPair(trackClusters); + if(pair[0].getCharge() > 0) { + positronPlot.fill(pair[1].getMomentum().magnitude()); + electronPlot[TRIDENT].fill(pair[0].getMomentum().magnitude()); + } else { + positronPlot.fill(pair[0].getMomentum().magnitude()); + electronPlot[TRIDENT].fill(pair[1].getMomentum().magnitude()); + } + energyPlot[TRIDENT].fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude()); + energy2DPlot[TRIDENT].fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); + + // Track which clusters have already been added to the + // singles plot so that there are no repeats. + Set<Cluster> plotSet = new HashSet<Cluster>(); + Set<Cluster> plotFiducial = new HashSet<Cluster>(); + + // Fill the all pairs plots. + double pairEnergy = trackClusters[0].getEnergy() + trackClusters[1].getEnergy(); + trEnergySumAll.fill(pairEnergy); + trEnergySum2DAll.fill(trackClusters[1].getEnergy(), trackClusters[0].getEnergy()); + trTimeCoincidenceAll.fill(RafoAnalysis.getTimeConicidence(trackClusters)); + trSumCoplanarityCalcAll.fill(pairEnergy, getCalculatedCoplanarity(trackClusters)); + trSumCoplanarityAll.fill(pairEnergy, TriggerModule.getValueCoplanarity(trackClusters)); + trInvariantMassAll.fill(RafoAnalysis.getInvariantMass(pair)); + + // Fill the singles plots. + if(!plotSet.contains(trackClusters[0])) { + plotSet.add(trackClusters[0]); + trTimeEnergyAll.fill(trackClusters[0].getEnergy(), TriggerModule.getClusterTime(trackClusters[0])); + } if(!plotSet.contains(trackClusters[1])) { + plotSet.add(trackClusters[1]); + trTimeEnergyAll.fill(trackClusters[1].getEnergy(), TriggerModule.getClusterTime(trackClusters[1])); + } + + // Fill the fiducial plots if appropriate. + if(inFiducialRegion(trackClusters[0]) && inFiducialRegion(trackClusters[1])) { + trEnergySumFiducial.fill(pairEnergy); + trEnergySum2DFiducial.fill(trackClusters[1].getEnergy(), trackClusters[0].getEnergy()); + trTimeCoincidenceFiducial.fill(RafoAnalysis.getTimeConicidence(trackClusters)); + trSumCoplanarityCalcFiducial.fill(pairEnergy, getCalculatedCoplanarity(trackClusters)); + trSumCoplanarityFiducial.fill(pairEnergy, TriggerModule.getValueCoplanarity(trackClusters)); + trInvariantMassFiducial.fill(RafoAnalysis.getInvariantMass(pair)); + } + + // Fill the singles fiducial plots if appropriate. + if(!plotFiducial.contains(trackClusters[0]) && inFiducialRegion(trackClusters[0])) { + plotFiducial.add(trackClusters[0]); + trTimeEnergyFiducial.fill(trackClusters[0].getEnergy(), TriggerModule.getClusterTime(trackClusters[0])); + } if(!plotFiducial.contains(trackClusters[1]) && inFiducialRegion(trackClusters[1])) { + plotFiducial.add(trackClusters[1]); + trTimeEnergyFiducial.fill(trackClusters[1].getEnergy(), TriggerModule.getClusterTime(trackClusters[1])); + } + } + + if(verbose) { + System.out.printf("\tMøller :: %b%n", isMøller); + System.out.printf("\tTrident :: %b%n", isTrident); + System.out.printf("\tElastic :: %b%n", isElastic); + System.out.println(); + } + + // Get the TI bits. + String bitString = null; + TIData tiBank = null; + List<GenericObject> bankList = event.get(GenericObject.class, bankCollectionName); + for(GenericObject obj : bankList) { + if(AbstractIntData.getTag(obj) == TIData.BANK_TAG) { + tiBank = new TIData(obj); + bitString = getBitString(tiBank.isPulserTrigger(), tiBank.isSingle0Trigger(), + tiBank.isSingle1Trigger(), tiBank.isPair0Trigger(), tiBank.isPair1Trigger()); + + if(tiBank.isPair1Trigger()) { + pair1Events++; + } else if(tiBank.isPair0Trigger()) { + pair0Events++; + } else if(tiBank.isSingle1Trigger()) { + singles1Events++; + } else if(tiBank.isSingle0Trigger()) { + singles0Events++; + } else if(tiBank.isPulserTrigger()) { + pulserEvents++; + } + } + } + if(bitString == null) { + System.out.println("No TI data found!!"); + } + + // Get the number of charged tracks in the event. + int tracks = 0; + int posTracks = 0; + int negTracks = 0; + for(ReconstructedParticle track : trackList) { + if(track.getCharge() != 0 && tiBank.isPulserTrigger()) { + if(excludeNoTrackEvents && !track.getTracks().isEmpty()) { + tracks++; + if(track.getCharge() > 0) { posTracks++; } + else { negTracks++; } + } else { + tracks++; + if(track.getCharge() > 0) { posTracks++; } + else { negTracks++; } + } + } + } + + // Populate the "all tracks" plots. + posTrackCount.fill(posTracks); + negTrackCount.fill(negTracks); + chargedTrackCount.fill(tracks); + + // Add the result to the appropriate plots and increment + // the appropriate trigger bit combination. + if(isMøller) { + møllerEvents++; + chargedTracksPlot[MÃLLER].fill(tracks); + clusterCountPlot[MÃLLER].fill(clusters.size()); + + Integer val = møllerBitMap.get(bitString); + if(val == null) { møllerBitMap.put(bitString, 1); } + else { møllerBitMap.put(bitString, val + 1); } + } else if(isTrident) { + tridentEvents++; + chargedTracksPlot[TRIDENT].fill(tracks); + clusterCountPlot[TRIDENT].fill(clusters.size()); + + Integer val = tridentBitMap.get(bitString); + if(val == null) { tridentBitMap.put(bitString, 1); } + else { tridentBitMap.put(bitString, val + 1); } + } else if(isElastic) { + elasticEvents++; + chargedTracksPlot[ELASTIC].fill(tracks); + clusterCountPlot[ELASTIC].fill(clusters.size()); + + Integer val = elasticBitMap.get(bitString); + if(val == null) { elasticBitMap.put(bitString, 1); } + else { elasticBitMap.put(bitString, val + 1); } + } + totalEvents++; + } + } + + private static final double getCalculatedCoplanarity(Cluster[] pair) { + // Define the x- and y-coordinates of the clusters as well as + // calorimeter center. + final double ORIGIN_X = 42.52; + double x[] = { pair[0].getPosition()[0], pair[1].getPosition()[0] }; + double y[] = { pair[0].getPosition()[1], pair[1].getPosition()[1] }; + // Get the cluster angles. double[] clusterAngle = new double[2]; for(int i = 0; i < 2; i++) { - clusterAngle[i] = Math.atan2(y[i], x[i] - ORIGIN_X) * 180 / Math.PI; - if(clusterAngle[i] <= 0) { clusterAngle[i] += 360; } + clusterAngle[i] = Math.atan2(y[i], x[i] - ORIGIN_X) * 180 / Math.PI; + if(clusterAngle[i] <= 0) { clusterAngle[i] += 360; } } // Calculate the coplanarity cut value. double clusterDiff = clusterAngle[0] - clusterAngle[1]; return clusterDiff > 0 ? clusterDiff : clusterDiff + 360; - } - - public void setTimeCoincidenceCut(double value) { - timeCoincidenceCut = value; - } - - public void setExcludeNoTrackEvents(boolean state) { - excludeNoTrackEvents = state; - } - - public void setSkipBadSVT(boolean state) { - skipBadSVT = state; - } - - private static final boolean inFiducialRegion(Cluster cluster) { - // Get the x and y indices for the cluster. - int ix = TriggerModule.getClusterXIndex(cluster); - int absx = Math.abs(TriggerModule.getClusterXIndex(cluster)); - int absy = Math.abs(TriggerModule.getClusterYIndex(cluster)); - - // Check if the cluster is on the top or the bottom of the - // calorimeter, as defined by |y| == 5. This is an edge cluster - // and is not in the fiducial region. - if(absy == 5) { - return false; - } - - // Check if the cluster is on the extreme left or right side - // of the calorimeter, as defined by |x| == 23. This is also - // and edge cluster is not in the fiducial region. - if(absx == 23) { - return false; - } - - // Check if the cluster is along the beam gap, as defined by - // |y| == 1. This is an internal edge cluster and is not in the - // fiducial region. - if(absy == 1) { - return false; - } - - // Lastly, check if the cluster falls along the beam hole, as - // defined by clusters with -11 <= x <= -1 and |y| == 2. This - // is not the fiducial region. - if(absy == 2 && ix <= -1 && ix >= -11) { - return false; - } - - // If all checks fail, the cluster is in the fiducial region. - return true; - } - - private static final List<ReconstructedParticle[]> getTrackPairs(List<ReconstructedParticle> trackList) { - // Create an empty list for the pairs. - List<ReconstructedParticle[]> pairs = new ArrayList<ReconstructedParticle[]>(); - - // Add all possible pairs of tracks. - for(int i = 0; i < trackList.size(); i++) { - for(int j = i + 1; j < trackList.size(); j++) { - pairs.add(new ReconstructedParticle[] { trackList.get(i), trackList.get(j) }); - } - } - - // Return the list of tracks. - return pairs; - } + } + + public void setTimeCoincidenceCut(double value) { + timeCoincidenceCut = value; + } + + public void setExcludeNoTrackEvents(boolean state) { + excludeNoTrackEvents = state; + } + + public void setSkipBadSVT(boolean state) { + skipBadSVT = state; + } + + private static final boolean inFiducialRegion(Cluster cluster) { + // Get the x and y indices for the cluster. + int ix = TriggerModule.getClusterXIndex(cluster); + int absx = Math.abs(TriggerModule.getClusterXIndex(cluster)); + int absy = Math.abs(TriggerModule.getClusterYIndex(cluster)); + + // Check if the cluster is on the top or the bottom of the + // calorimeter, as defined by |y| == 5. This is an edge cluster + // and is not in the fiducial region. + if(absy == 5) { + return false; + } + + // Check if the cluster is on the extreme left or right side + // of the calorimeter, as defined by |x| == 23. This is also + // and edge cluster is not in the fiducial region. + if(absx == 23) { + return false; + } + + // Check if the cluster is along the beam gap, as defined by + // |y| == 1. This is an internal edge cluster and is not in the + // fiducial region. + if(absy == 1) { + return false; + } + + // Lastly, check if the cluster falls along the beam hole, as + // defined by clusters with -11 <= x <= -1 and |y| == 2. This + // is not the fiducial region. + if(absy == 2 && ix <= -1 && ix >= -11) { + return false; + } + + // If all checks fail, the cluster is in the fiducial region. + return true; + } + + private static final List<ReconstructedParticle[]> getTrackPairs(List<ReconstructedParticle> trackList) { + // Create an empty list for the pairs. + List<ReconstructedParticle[]> pairs = new ArrayList<ReconstructedParticle[]>(); + + // Add all possible pairs of tracks. + for(int i = 0; i < trackList.size(); i++) { + for(int j = i + 1; j < trackList.size(); j++) { + pairs.add(new ReconstructedParticle[] { trackList.get(i), trackList.get(j) }); + } + } + + // Return the list of tracks. + return pairs; + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/MTETriggerPlotsFormatter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/MTETriggerPlotsFormatter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/MTETriggerPlotsFormatter.java Wed Mar 9 11:43:24 2016 @@ -15,164 +15,164 @@ public class MTETriggerPlotsFormatter { - public static void main(String[] args) throws IllegalArgumentException, IOException { - // Define the root directory for the plots. - String rootDir = "D:\\cygwin64\\home\\Kyle\\"; - - // Define the new name of the file containing the trigger plots. - String plotFile = rootDir + "5772-ana.aida"; - - // Get the plots file and open it. - IAnalysisFactory af = IAnalysisFactory.create(); - ITree tree = af.createTreeFactory().create(plotFile); - if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } - - // Define the 1D trigger plot names for Møllers and tridents. - String[] plotNames1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy", - "Pair Coplanarity", "Pair Energy Difference", "Pair Energy Slope", "Pair Energy Sum" }; - String[] displayNames1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy", - "Pair Coplanarity", "Pair Energy Difference", "Pair Energy Slope", "Pair Energy Sum" }; - String[] xAxisNames1D = { "Hit Count", "Seed Energy (GeV)", "Total Energy (GeV)", - "Coplanarity (Degrees)", "Energy Difference (GeV)", "Energy Slope (GeV)", "Energy Sum (GeV)" }; - String yAxisName1D = "Count"; - - // Define the 2D trigger plot names for Møllers and tridents. - String[] plotNames2D = { "Cluster Seed", "Pair Energy Sum 2D" }; - String[] displayNames2D = { "Cluster Seed Distribution", "2D Energy Sum" }; - String[] xAxisNames2D = { "x-Index", "Second Cluster Energy (GeV)" }; - String[] yAxisNames2D = { "y-Index", "First Cluster Energy (GeV)" }; - - // Define the 1D trigger plot names for elastics. - String[] plotNamesElastic1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy" }; - String[] displayNamesElastic1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy" }; - String[] xAxisNamesElastic1D = { "Hit Count", "Seed Energy (GeV)", "Total Energy (GeV)" }; - String yAxisNameElastic1D = "Count"; - - // Define the 2D trigger plot names for elastics. - String[] plotNamesElastic2D = { "Cluster Seed" }; - String[] displayNamesElastic2D = { "Cluster Seed Distribution" }; - String[] xAxisNamesElastic2D = { "x-Index" }; - String[] yAxisNamesElastic2D = { "y-Index" }; - - // Define the Møller, trident, and elastic prefixes. - String allPrefix = "All Trigger Plots/Pair Plots/"; - String møllerPrefix = "Møller Trigger Plots/Pair Plots/"; - String tridentPrefix = "Trident Trigger Plots/Pair Plots/"; - String elasticPrefix = "Elastic Trigger Plots/Singles Plots/"; - String allSinglesPrefix = "All Trigger Plots/Singles Plots/"; - - // Define the plot type prefix. - String allTypeName = "All Pairs - "; - String møllerTypeName = "Møller - "; - String tridentTypeName = "Trident - "; - String elasticTypeName = "Elastic - "; - String allSinglesTypeName = "All Singles - "; - - // Define the plot type colors. - ColorStyle allColor = PlotsFormatter.ColorStyle.GREY; - ColorStyle møllerColor = PlotsFormatter.ColorStyle.MS_BLUE; - ColorStyle tridentColor = PlotsFormatter.ColorStyle.MS_ORANGE; - ColorStyle elasticColor = PlotsFormatter.ColorStyle.MS_GREEN; - - // Create a plot formatting module. - PlotFormatModule module = new PlotFormatModule(); - - // Get the histograms and add them to the module. Start with the - // trident and Møller plots. - for(int i = 0; i < plotNames1D.length; i++) { - // Get the Møller and trident plots. - IHistogram1D allPlot = (IHistogram1D) tree.find(allPrefix + plotNames1D[i]); - IHistogram1D møllerPlot = (IHistogram1D) tree.find(møllerPrefix + plotNames1D[i]); - IHistogram1D tridentPlot = (IHistogram1D) tree.find(tridentPrefix + plotNames1D[i]); - - // Make a formatted plot for each. - FormattedPlot1D allFormattedPlot = new FormattedPlot1D(allPlot, allColor, xAxisNames1D[i], yAxisName1D, allTypeName + displayNames1D[i]); - FormattedPlot1D møllerFormattedPlot = new FormattedPlot1D(møllerPlot, møllerColor, xAxisNames1D[i], yAxisName1D, møllerTypeName + displayNames1D[i]); - FormattedPlot1D tridentFormattedPlot = new FormattedPlot1D(tridentPlot, tridentColor, xAxisNames1D[i], yAxisName1D, tridentTypeName + displayNames1D[i]); - - // Add them to the module. - module.addPlot1D(allFormattedPlot); - module.addPlot1D(møllerFormattedPlot); - module.addPlot1D(tridentFormattedPlot); - } - for(int i = 0; i < plotNames2D.length; i++) { - // Get the Møller and trident plots. - IHistogram2D allPlot = (IHistogram2D) tree.find(allPrefix + plotNames2D[i]); - IHistogram2D møllerPlot = (IHistogram2D) tree.find(møllerPrefix + plotNames2D[i]); - IHistogram2D tridentPlot = (IHistogram2D) tree.find(tridentPrefix + plotNames2D[i]); - - // Make a formatted plot for each. - FormattedPlot2D allFormattedPlot = new FormattedPlot2D(allPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], allTypeName + displayNames2D[i]); - FormattedPlot2D møllerFormattedPlot = new FormattedPlot2D(møllerPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], møllerTypeName + displayNames2D[i]); - FormattedPlot2D tridentFormattedPlot = new FormattedPlot2D(tridentPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], tridentTypeName + displayNames2D[i]); - - // Add them to the module. - module.addPlot2D(allFormattedPlot); - module.addPlot2D(møllerFormattedPlot); - module.addPlot2D(tridentFormattedPlot); - } - - // Get the histograms for the elastic plots and add them to the module. - for(int i = 0; i < plotNamesElastic1D.length; i++) { - // Get the Møller and trident plots. - IHistogram1D allPlot = (IHistogram1D) tree.find(allSinglesPrefix + plotNames1D[i]); - IHistogram1D elasticPlot = (IHistogram1D) tree.find(elasticPrefix + plotNames1D[i]); - - // Make a formatted plot for each. - FormattedPlot1D allFormattedPlot = new FormattedPlot1D(allPlot, allColor, xAxisNamesElastic1D[i], yAxisNameElastic1D, - allSinglesTypeName + displayNamesElastic1D[i]); - FormattedPlot1D elasticFormattedPlot = new FormattedPlot1D(elasticPlot, elasticColor, xAxisNamesElastic1D[i], yAxisNameElastic1D, - elasticTypeName + displayNamesElastic1D[i]); - - // Add them to the module. - module.addPlot1D(allFormattedPlot); - module.addPlot1D(elasticFormattedPlot); - } - for(int i = 0; i < plotNamesElastic2D.length; i++) { - // Get the Møller and trident plots. - IHistogram2D allPlot = (IHistogram2D) tree.find(allPrefix + plotNamesElastic2D[i]); - IHistogram2D elasticPlot = (IHistogram2D) tree.find(møllerPrefix + plotNamesElastic2D[i]); - - // Make a formatted plot for each. - FormattedPlot2D allFormattedPlot = new FormattedPlot2D(allPlot, i == 0 ? true : false, xAxisNamesElastic2D[i], yAxisNamesElastic2D[i], - allSinglesTypeName + plotNames2D[i]); - FormattedPlot2D elasticFormattedPlot = new FormattedPlot2D(elasticPlot, i == 0 ? true : false, xAxisNamesElastic2D[i], yAxisNamesElastic2D[i], - elasticTypeName + displayNamesElastic2D[i]); - - // Add them to the module. - module.addPlot2D(allFormattedPlot); - module.addPlot2D(elasticFormattedPlot); - } - - // Add the MTE plots to the module. - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Elastic Energy Distribution"), elasticColor, - "Momentum (GeV)", "Count", "Elastic - Momentum")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Elastic Event Tracks"), elasticColor, - "Tracks", "Count", "Elastic - Tracks in Event")); - - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Energy Sum Distribution"), møllerColor, - "Momentum Sum (GeV)", "Count", "Møller - Momentum Sum")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Electron Energy Distribution"), møllerColor, - "Momentum (GeV)", "Count", "Møller - Momentum (Electron)")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Time Coincidence Distribution (All Møller Cuts)"), møllerColor, - "Time (ns)", "Count", "Møller - Time Coincidence")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Event Tracks"), møllerColor, - "Tracks", "Count", "Møller - Tracks in Event")); - module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MTE Analysis/Møller 2D Energy Distribution"), false, - "First Track Momentum (GeV)", "Second Track Momentum (GeV)", "Møller - 2D Momentum Sum")); - - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Energy Sum Distribution"), tridentColor, - "Momentum Sum (GeV)", "Count", "Trident - Momentum Sum")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Electron Energy Distribution"), tridentColor, - "Momentum (GeV)", "Count", "Trident - Momentum (Electron)")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Positron Energy Distribution"), tridentColor, - "Momentum (GeV)", "Count", "Trident - Momentum (Positron)")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Event Tracks"), tridentColor, - "Tracks", "Count", "Trident - Tracks in Event")); - module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MTE Analysis/Trident 2D Energy Distribution"), false, - "First Track Momentum (GeV)", "Second Track Momentum (GeV)", "Trident - 2D Momentum Sum")); - - // Display the plots. - module.savePlots("C:\\Users\\Kyle\\Desktop\\EnergyShift\\TestPrint\\"); - } + public static void main(String[] args) throws IllegalArgumentException, IOException { + // Define the root directory for the plots. + String rootDir = "D:\\cygwin64\\home\\Kyle\\"; + + // Define the new name of the file containing the trigger plots. + String plotFile = rootDir + "5772-ana.aida"; + + // Get the plots file and open it. + IAnalysisFactory af = IAnalysisFactory.create(); + ITree tree = af.createTreeFactory().create(plotFile); + if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } + + // Define the 1D trigger plot names for Møllers and tridents. + String[] plotNames1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy", + "Pair Coplanarity", "Pair Energy Difference", "Pair Energy Slope", "Pair Energy Sum" }; + String[] displayNames1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy", + "Pair Coplanarity", "Pair Energy Difference", "Pair Energy Slope", "Pair Energy Sum" }; + String[] xAxisNames1D = { "Hit Count", "Seed Energy (GeV)", "Total Energy (GeV)", + "Coplanarity (Degrees)", "Energy Difference (GeV)", "Energy Slope (GeV)", "Energy Sum (GeV)" }; + String yAxisName1D = "Count"; + + // Define the 2D trigger plot names for Møllers and tridents. + String[] plotNames2D = { "Cluster Seed", "Pair Energy Sum 2D" }; + String[] displayNames2D = { "Cluster Seed Distribution", "2D Energy Sum" }; + String[] xAxisNames2D = { "x-Index", "Second Cluster Energy (GeV)" }; + String[] yAxisNames2D = { "y-Index", "First Cluster Energy (GeV)" }; + + // Define the 1D trigger plot names for elastics. + String[] plotNamesElastic1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy" }; + String[] displayNamesElastic1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy" }; + String[] xAxisNamesElastic1D = { "Hit Count", "Seed Energy (GeV)", "Total Energy (GeV)" }; + String yAxisNameElastic1D = "Count"; + + // Define the 2D trigger plot names for elastics. + String[] plotNamesElastic2D = { "Cluster Seed" }; + String[] displayNamesElastic2D = { "Cluster Seed Distribution" }; + String[] xAxisNamesElastic2D = { "x-Index" }; + String[] yAxisNamesElastic2D = { "y-Index" }; + + // Define the Møller, trident, and elastic prefixes. + String allPrefix = "All Trigger Plots/Pair Plots/"; + String møllerPrefix = "Møller Trigger Plots/Pair Plots/"; + String tridentPrefix = "Trident Trigger Plots/Pair Plots/"; + String elasticPrefix = "Elastic Trigger Plots/Singles Plots/"; + String allSinglesPrefix = "All Trigger Plots/Singles Plots/"; + + // Define the plot type prefix. + String allTypeName = "All Pairs - "; + String møllerTypeName = "Møller - "; + String tridentTypeName = "Trident - "; + String elasticTypeName = "Elastic - "; + String allSinglesTypeName = "All Singles - "; + + // Define the plot type colors. + ColorStyle allColor = PlotsFormatter.ColorStyle.GREY; + ColorStyle møllerColor = PlotsFormatter.ColorStyle.MS_BLUE; + ColorStyle tridentColor = PlotsFormatter.ColorStyle.MS_ORANGE; + ColorStyle elasticColor = PlotsFormatter.ColorStyle.MS_GREEN; + + // Create a plot formatting module. + PlotFormatModule module = new PlotFormatModule(); + + // Get the histograms and add them to the module. Start with the + // trident and Møller plots. + for(int i = 0; i < plotNames1D.length; i++) { + // Get the Møller and trident plots. + IHistogram1D allPlot = (IHistogram1D) tree.find(allPrefix + plotNames1D[i]); + IHistogram1D møllerPlot = (IHistogram1D) tree.find(møllerPrefix + plotNames1D[i]); + IHistogram1D tridentPlot = (IHistogram1D) tree.find(tridentPrefix + plotNames1D[i]); + + // Make a formatted plot for each. + FormattedPlot1D allFormattedPlot = new FormattedPlot1D(allPlot, allColor, xAxisNames1D[i], yAxisName1D, allTypeName + displayNames1D[i]); + FormattedPlot1D møllerFormattedPlot = new FormattedPlot1D(møllerPlot, møllerColor, xAxisNames1D[i], yAxisName1D, møllerTypeName + displayNames1D[i]); + FormattedPlot1D tridentFormattedPlot = new FormattedPlot1D(tridentPlot, tridentColor, xAxisNames1D[i], yAxisName1D, tridentTypeName + displayNames1D[i]); + + // Add them to the module. + module.addPlot1D(allFormattedPlot); + module.addPlot1D(møllerFormattedPlot); + module.addPlot1D(tridentFormattedPlot); + } + for(int i = 0; i < plotNames2D.length; i++) { + // Get the Møller and trident plots. + IHistogram2D allPlot = (IHistogram2D) tree.find(allPrefix + plotNames2D[i]); + IHistogram2D møllerPlot = (IHistogram2D) tree.find(møllerPrefix + plotNames2D[i]); + IHistogram2D tridentPlot = (IHistogram2D) tree.find(tridentPrefix + plotNames2D[i]); + + // Make a formatted plot for each. + FormattedPlot2D allFormattedPlot = new FormattedPlot2D(allPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], allTypeName + displayNames2D[i]); + FormattedPlot2D møllerFormattedPlot = new FormattedPlot2D(møllerPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], møllerTypeName + displayNames2D[i]); + FormattedPlot2D tridentFormattedPlot = new FormattedPlot2D(tridentPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], tridentTypeName + displayNames2D[i]); + + // Add them to the module. + module.addPlot2D(allFormattedPlot); + module.addPlot2D(møllerFormattedPlot); + module.addPlot2D(tridentFormattedPlot); + } + + // Get the histograms for the elastic plots and add them to the module. + for(int i = 0; i < plotNamesElastic1D.length; i++) { + // Get the Møller and trident plots. + IHistogram1D allPlot = (IHistogram1D) tree.find(allSinglesPrefix + plotNames1D[i]); + IHistogram1D elasticPlot = (IHistogram1D) tree.find(elasticPrefix + plotNames1D[i]); + + // Make a formatted plot for each. + FormattedPlot1D allFormattedPlot = new FormattedPlot1D(allPlot, allColor, xAxisNamesElastic1D[i], yAxisNameElastic1D, + allSinglesTypeName + displayNamesElastic1D[i]); + FormattedPlot1D elasticFormattedPlot = new FormattedPlot1D(elasticPlot, elasticColor, xAxisNamesElastic1D[i], yAxisNameElastic1D, + elasticTypeName + displayNamesElastic1D[i]); + + // Add them to the module. + module.addPlot1D(allFormattedPlot); + module.addPlot1D(elasticFormattedPlot); + } + for(int i = 0; i < plotNamesElastic2D.length; i++) { + // Get the Møller and trident plots. + IHistogram2D allPlot = (IHistogram2D) tree.find(allPrefix + plotNamesElastic2D[i]); + IHistogram2D elasticPlot = (IHistogram2D) tree.find(møllerPrefix + plotNamesElastic2D[i]); + + // Make a formatted plot for each. + FormattedPlot2D allFormattedPlot = new FormattedPlot2D(allPlot, i == 0 ? true : false, xAxisNamesElastic2D[i], yAxisNamesElastic2D[i], + allSinglesTypeName + plotNames2D[i]); + FormattedPlot2D elasticFormattedPlot = new FormattedPlot2D(elasticPlot, i == 0 ? true : false, xAxisNamesElastic2D[i], yAxisNamesElastic2D[i], + elasticTypeName + displayNamesElastic2D[i]); + + // Add them to the module. + module.addPlot2D(allFormattedPlot); + module.addPlot2D(elasticFormattedPlot); + } + + // Add the MTE plots to the module. + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Elastic Energy Distribution"), elasticColor, + "Momentum (GeV)", "Count", "Elastic - Momentum")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Elastic Event Tracks"), elasticColor, + "Tracks", "Count", "Elastic - Tracks in Event")); + + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Energy Sum Distribution"), møllerColor, + "Momentum Sum (GeV)", "Count", "Møller - Momentum Sum")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Electron Energy Distribution"), møllerColor, + "Momentum (GeV)", "Count", "Møller - Momentum (Electron)")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Time Coincidence Distribution (All Møller Cuts)"), møllerColor, + "Time (ns)", "Count", "Møller - Time Coincidence")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Event Tracks"), møllerColor, + "Tracks", "Count", "Møller - Tracks in Event")); + module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MTE Analysis/Møller 2D Energy Distribution"), false, + "First Track Momentum (GeV)", "Second Track Momentum (GeV)", "Møller - 2D Momentum Sum")); + + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Energy Sum Distribution"), tridentColor, + "Momentum Sum (GeV)", "Count", "Trident - Momentum Sum")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Electron Energy Distribution"), tridentColor, + "Momentum (GeV)", "Count", "Trident - Momentum (Electron)")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Positron Energy Distribution"), tridentColor, + "Momentum (GeV)", "Count", "Trident - Momentum (Positron)")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Event Tracks"), tridentColor, + "Tracks", "Count", "Trident - Tracks in Event")); + module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MTE Analysis/Trident 2D Energy Distribution"), false, + "First Track Momentum (GeV)", "Second Track Momentum (GeV)", "Trident - 2D Momentum Sum")); + + // Display the plots. + module.savePlots("C:\\Users\\Kyle\\Desktop\\EnergyShift\\TestPrint\\"); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/ParticleMCAnalysisDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/ParticleMCAnalysisDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/ParticleMCAnalysisDriver.java Wed Mar 9 11:43:24 2016 @@ -13,136 +13,136 @@ import org.lcsim.util.aida.AIDA; public class ParticleMCAnalysisDriver extends Driver { - // Store collection names. - private String particleCollectionName = "MCParticle"; - - // Declare plots. - private AIDA aida = AIDA.defaultInstance(); - private IHistogram1D chargedTracksPlot = aida.histogram1D("MC Analysis/Event Tracks", 10, -0.5, 9.5); - private IHistogram1D allPlot = aida.histogram1D("MC Analysis/Electron Energy Distribution", 110, 0, 1.1); - private IHistogram1D electronPlot = aida.histogram1D("MC Analysis/Electron Energy Distribution", 110, 0, 1.1); - private IHistogram1D positronPlot = aida.histogram1D("MC Analysis/Positron Energy Distribution", 110, 0, 1.1); - private IHistogram1D momentumXPlot = aida.histogram1D("MC Analysis/Particle x-Momentum Distribution", 110, 0.0, 1.1); - private IHistogram1D momentumYPlot = aida.histogram1D("MC Analysis/Particle y-Momentum Distribution", 110, 0.0, 1.1); - private IHistogram1D momentumZPlot = aida.histogram1D("MC Analysis/Particle z-Momentum Distribution", 110, 0.0, 1.1); - private IHistogram1D epAnglePlot = aida.histogram1D("MC Analysis/Positron\\Electron Pair Angle Distribution", 90, 0, 180); - private IHistogram1D eeAnglePlot = aida.histogram1D("MC Analysis/Electron\\Electron Pair Angle Distribution", 90, 0, 180); - private IHistogram1D epMomentumSumPlot = aida.histogram1D("MC Analysis/Positron\\Electron Momentum Sum Distribution", 220, 0, 2.2); - private IHistogram1D eeMomentumSumPlot = aida.histogram1D("MC Analysis/Electron\\Electron Momentum Sum Distribution", 220, 0, 2.2); - private IHistogram2D momentumPlot = aida.histogram2D("MC Analysis/Particle Momentum Distribution", 100, 0.0, 0.40, 110, 0.0, 0.40); - private IHistogram2D epMomentumSum2DPlot = aida.histogram2D("MC Analysis/Positron\\Electron 2D Momentum Distribution", 55, 0, 1.1, 55, 0, 1.1); - private IHistogram2D eeMomentumSum2DPlot = aida.histogram2D("MC Analysis/Electron\\Electron 2D Momentum Distribution", 55, 0, 1.1, 55, 0, 1.1); - - @Override - public void process(EventHeader event) { - // Skip the event if there is no Monte Carlo collection. - if(!event.hasCollection(MCParticle.class, particleCollectionName)) { - return; - } - - // Get the list of Monte Carlo particles. - List<MCParticle> particleList = event.get(MCParticle.class, particleCollectionName); - - // Track the positive and negative particles. - List<MCParticle> electronList = new ArrayList<MCParticle>(); - List<MCParticle> positronList = new ArrayList<MCParticle>(); - - // Count the number of particles in the event. - int chargedParticles = 0; - - // Iterate through the particles. - for(MCParticle particle : particleList) { - // Look at only t = 0 particles. - if(particle.getProductionTime() == 0) { - // Plot the x/y momentum of each particle. - momentumPlot.fill(particle.getMomentum().x(), particle.getMomentum().y()); - - // If the particle is charged, increment the charged - // particle count. - if(particle.getCharge() > 0) { - chargedParticles++; - } - - // Get the particle momentum in each direction. - momentumXPlot.fill(particle.getMomentum().x()); - momentumYPlot.fill(particle.getMomentum().y()); - momentumZPlot.fill(particle.getMomentum().z()); - - // Populate the general momentum plot. - allPlot.fill(particle.getMomentum().magnitude()); - momentumPlot.fill(particle.getMomentum().x(), particle.getMomentum().y()); - - // Store each particle based on its PID and populate - // the appropriate plot. - if(particle.getPDGID() == 11) { - electronList.add(particle); - electronPlot.fill(particle.getMomentum().magnitude()); - } else if(particle.getPDGID() == -11) { - positronList.add(particle); - positronPlot.fill(particle.getMomentum().magnitude()); - } - } - } - - // Populate the charged particles plot. - chargedTracksPlot.fill(chargedParticles); - - // Form all electron/positron pairs. - List<MCParticle[]> epPairList = new ArrayList<MCParticle[]>(); - for(MCParticle electron : electronList) { - for(MCParticle positron : positronList) { - epPairList.add(new MCParticle[] { electron, positron }); - } - } - - // Populate the positron/electron pair plots. - for(MCParticle[] pair : epPairList) { - epAnglePlot.fill(getVectorAngle(pair[0].getMomentum(), pair[1].getMomentum())); - epMomentumSumPlot.fill(getVectorSum(pair[0].getMomentum(), pair[1].getMomentum())); - epMomentumSum2DPlot.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); - } - - // Form all electron/electron pairs. - List<MCParticle[]> eePairList = new ArrayList<MCParticle[]>(); - for(int i = 0; i < electronList.size(); i++) { - for(int j = i + 1; j < electronList.size(); j++) { - eePairList.add(new MCParticle[] { electronList.get(i), electronList.get(j) }); - } - } - - // Populate the electron/electron pair plots. - for(MCParticle[] pair : eePairList) { - eeAnglePlot.fill(getVectorAngle(pair[0].getMomentum(), pair[1].getMomentum())); - eeMomentumSumPlot.fill(getVectorSum(pair[0].getMomentum(), pair[1].getMomentum())); - eeMomentumSum2DPlot.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); - } - } - - private static final double getVectorSum(Hep3Vector v1, Hep3Vector v2) { - // Calculate the sum of the sum of the vector components, squared. - double sum = 0; - for(int i = 0; i < 3; i++) { - double elementSum = v1.v()[i] + v2.v()[i]; - sum += (elementSum * elementSum); - } - - // Return the square root of the sum. - return Math.sqrt(sum); - } - - private static final double getVectorAngle(Hep3Vector v1, Hep3Vector v2) { - // The vector angle is defined as Acos[(v1 · v2) / (âv1â à âv2â)] - return Math.acos(getDotProduct(v1, v2) / (v1.magnitude() * v2.magnitude())) / Math.PI * 180.0; - } - - private static final double getDotProduct(Hep3Vector v1, Hep3Vector v2) { - // Calculate the sum of the vector element products. - int product = 0; - for(int i = 0; i < 3; i++) { - product += (v1.v()[i] * v2.v()[i]); - } - - // Return the result. - return product; - } + // Store collection names. + private String particleCollectionName = "MCParticle"; + + // Declare plots. + private AIDA aida = AIDA.defaultInstance(); + private IHistogram1D chargedTracksPlot = aida.histogram1D("MC Analysis/Event Tracks", 10, -0.5, 9.5); + private IHistogram1D allPlot = aida.histogram1D("MC Analysis/Electron Energy Distribution", 110, 0, 1.1); + private IHistogram1D electronPlot = aida.histogram1D("MC Analysis/Electron Energy Distribution", 110, 0, 1.1); + private IHistogram1D positronPlot = aida.histogram1D("MC Analysis/Positron Energy Distribution", 110, 0, 1.1); + private IHistogram1D momentumXPlot = aida.histogram1D("MC Analysis/Particle x-Momentum Distribution", 110, 0.0, 1.1); + private IHistogram1D momentumYPlot = aida.histogram1D("MC Analysis/Particle y-Momentum Distribution", 110, 0.0, 1.1); + private IHistogram1D momentumZPlot = aida.histogram1D("MC Analysis/Particle z-Momentum Distribution", 110, 0.0, 1.1); + private IHistogram1D epAnglePlot = aida.histogram1D("MC Analysis/Positron\\Electron Pair Angle Distribution", 90, 0, 180); + private IHistogram1D eeAnglePlot = aida.histogram1D("MC Analysis/Electron\\Electron Pair Angle Distribution", 90, 0, 180); + private IHistogram1D epMomentumSumPlot = aida.histogram1D("MC Analysis/Positron\\Electron Momentum Sum Distribution", 220, 0, 2.2); + private IHistogram1D eeMomentumSumPlot = aida.histogram1D("MC Analysis/Electron\\Electron Momentum Sum Distribution", 220, 0, 2.2); + private IHistogram2D momentumPlot = aida.histogram2D("MC Analysis/Particle Momentum Distribution", 100, 0.0, 0.40, 110, 0.0, 0.40); + private IHistogram2D epMomentumSum2DPlot = aida.histogram2D("MC Analysis/Positron\\Electron 2D Momentum Distribution", 55, 0, 1.1, 55, 0, 1.1); + private IHistogram2D eeMomentumSum2DPlot = aida.histogram2D("MC Analysis/Electron\\Electron 2D Momentum Distribution", 55, 0, 1.1, 55, 0, 1.1); + + @Override + public void process(EventHeader event) { + // Skip the event if there is no Monte Carlo collection. + if(!event.hasCollection(MCParticle.class, particleCollectionName)) { + return; + } + + // Get the list of Monte Carlo particles. + List<MCParticle> particleList = event.get(MCParticle.class, particleCollectionName); + + // Track the positive and negative particles. + List<MCParticle> electronList = new ArrayList<MCParticle>(); + List<MCParticle> positronList = new ArrayList<MCParticle>(); + + // Count the number of particles in the event. + int chargedParticles = 0; + + // Iterate through the particles. + for(MCParticle particle : particleList) { + // Look at only t = 0 particles. + if(particle.getProductionTime() == 0) { + // Plot the x/y momentum of each particle. + momentumPlot.fill(particle.getMomentum().x(), particle.getMomentum().y()); + + // If the particle is charged, increment the charged + // particle count. + if(particle.getCharge() > 0) { + chargedParticles++; + } + + // Get the particle momentum in each direction. + momentumXPlot.fill(particle.getMomentum().x()); + momentumYPlot.fill(particle.getMomentum().y()); + momentumZPlot.fill(particle.getMomentum().z()); + + // Populate the general momentum plot. + allPlot.fill(particle.getMomentum().magnitude()); + momentumPlot.fill(particle.getMomentum().x(), particle.getMomentum().y()); + + // Store each particle based on its PID and populate + // the appropriate plot. + if(particle.getPDGID() == 11) { + electronList.add(particle); + electronPlot.fill(particle.getMomentum().magnitude()); + } else if(particle.getPDGID() == -11) { + positronList.add(particle); + positronPlot.fill(particle.getMomentum().magnitude()); + } + } + } + + // Populate the charged particles plot. + chargedTracksPlot.fill(chargedParticles); + + // Form all electron/positron pairs. + List<MCParticle[]> epPairList = new ArrayList<MCParticle[]>(); + for(MCParticle electron : electronList) { + for(MCParticle positron : positronList) { + epPairList.add(new MCParticle[] { electron, positron }); + } + } + + // Populate the positron/electron pair plots. + for(MCParticle[] pair : epPairList) { + epAnglePlot.fill(getVectorAngle(pair[0].getMomentum(), pair[1].getMomentum())); + epMomentumSumPlot.fill(getVectorSum(pair[0].getMomentum(), pair[1].getMomentum())); + epMomentumSum2DPlot.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); + } + + // Form all electron/electron pairs. + List<MCParticle[]> eePairList = new ArrayList<MCParticle[]>(); + for(int i = 0; i < electronList.size(); i++) { + for(int j = i + 1; j < electronList.size(); j++) { + eePairList.add(new MCParticle[] { electronList.get(i), electronList.get(j) }); + } + } + + // Populate the electron/electron pair plots. + for(MCParticle[] pair : eePairList) { + eeAnglePlot.fill(getVectorAngle(pair[0].getMomentum(), pair[1].getMomentum())); + eeMomentumSumPlot.fill(getVectorSum(pair[0].getMomentum(), pair[1].getMomentum())); + eeMomentumSum2DPlot.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); + } + } + + private static final double getVectorSum(Hep3Vector v1, Hep3Vector v2) { + // Calculate the sum of the sum of the vector components, squared. + double sum = 0; + for(int i = 0; i < 3; i++) { + double elementSum = v1.v()[i] + v2.v()[i]; + sum += (elementSum * elementSum); + } + + // Return the square root of the sum. + return Math.sqrt(sum); + } + + private static final double getVectorAngle(Hep3Vector v1, Hep3Vector v2) { + // The vector angle is defined as Acos[(v1 · v2) / (âv1â à âv2â)] + return Math.acos(getDotProduct(v1, v2) / (v1.magnitude() * v2.magnitude())) / Math.PI * 180.0; + } + + private static final double getDotProduct(Hep3Vector v1, Hep3Vector v2) { + // Calculate the sum of the vector element products. + int product = 0; + for(int i = 0; i < 3; i++) { + product += (v1.v()[i] * v2.v()[i]); + } + + // Return the result. + return product; + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/PlotsFormatter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/PlotsFormatter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/PlotsFormatter.java Wed Mar 9 11:43:24 2016 @@ -8,120 +8,120 @@ import java.awt.Font; public class PlotsFormatter { - // Define plot fonts. - public static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 30); - public static final Font AXIS_FONT = new Font("Calibri", Font.BOLD, 35); - public static final Font TITLE_FONT = new Font("Calibri", Font.BOLD, 45); - - // Defines the color style options for plot data. - public static enum ColorStyle { - MS_BLUE(new Color( 79, 129, 189), new Color( 36, 64, 97)), MS_ORANGE(new Color(247, 150, 70), new Color(152, 72, 6)), - MS_RED(new Color(192, 80, 77), new Color( 99, 36, 35)), GREY(new Color(166, 166, 166), new Color( 89, 89, 89)), - MS_GREEN(new Color(155, 187, 89), new Color( 79, 98, 40)), CRIMSON(new Color(161, 0, 0), new Color(104, 0, 0)), - RUST(new Color(161, 80, 0), new Color(105, 80, 0)), YELLOW(new Color(161, 161, 0), new Color(122, 109, 8)), - FOREST(new Color( 65, 102, 0), new Color( 37, 79, 0)), GREEN(new Color( 7, 132, 70), new Color( 7, 82, 30)), - TEAL(new Color( 0, 130, 130), new Color( 0, 90, 100)), CERULEAN(new Color( 0, 86, 130), new Color( 0, 28, 83)), - BLUE(new Color( 0, 33, 203), new Color( 0, 0, 137)), INDIGO(new Color( 68, 10, 127), new Color( 0, 0, 61)), - PURPLE(new Color(106, 0, 106), new Color( 63, 0, 56)), FUSCHIA(new Color(119, 0, 60), new Color( 60, 0, 60)); - - private final Color fillColor; - private final Color lineColor; - - private ColorStyle(Color fillColor, Color lineColor) { - this.fillColor = fillColor; - this.lineColor = lineColor; - } - - public Color getFillColor() { return fillColor; } - - public Color getLineColor() { return lineColor; } - }; - - /** - * Sets the plot display formatting for 1D plots. - * @param region - The plotter region to format. - * @param color - The data color settings to use. - */ - public static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) { - // Get the names of each plot on in the region. - String[] dataNames = region.getAllDataNames(); - - // Check whether this is an overlay plot. Overlay plots contain - // more than one data name. - boolean overlay = (dataNames.length > 1 ? true : false); - - // Iterate over each plot in the region. - for(int i = 0; i < dataNames.length; i++) { - // Set the overlay style if needed. - if(overlay) { - // Get the fill style for the current data type. - JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); - - // Set the histogram style to display thick-lined bars - // with no fill. The color is set by the "color" argument. - fillStyle.setHistogramFill(false); - fillStyle.setHistogramBarLineWidth(3); - fillStyle.setHistogramBarLineColor(color[i].getFillColor()); - - // Set the legend text style. - region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20)); - } - - // Otherwise, set the fill style for a single plot. - else { - // Get the fill style for the current data type. - JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); - - // Set the histogram style to display thick-lined bars - // with a fill color. The colors are defined by the - // "color" argument. - fillStyle.setHistogramBarLineWidth(3); - fillStyle.setHistogramBarColor(color[i].getFillColor()); - fillStyle.setHistogramBarLineColor(color[i].getLineColor()); - } - - // Set the statistics box style. - region.getPlot().getStats().setVisible(true); - region.getPlot().getStats().setFont(BASIC_FONT); - - // Set the title font. - region.getPlot().getTitleObject().setFont(TITLE_FONT); - - // Set the axis tick-mark fonts. - region.getPlot().getXAxis().setFont(BASIC_FONT); - region.getPlot().getYAxis().setFont(BASIC_FONT); - region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); - region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); - } - } - - /** - * Sets the plot display formatting for 1D plots. - * @param region - The plotter region to format. - */ - public static final void setDefault2DStyle(PlotterRegion region, boolean logarithmic) { - // Get the fill style object. 2D plots should never be overlay - // plots, so there should only ever be one data name. - JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); - - // Set the fill style for a two-dimensional plot. - if(logarithmic) { fillStyle.setLogZ(true); } - fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP); - fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW); - - // Make the statistics box invisible. - region.getPlot().getStats().setVisible(false); - - // Set the general plot font (which is also the z-axis font). - region.getPlot().setFont(BASIC_FONT); - - // Set the title font. - region.getPlot().getTitleObject().setFont(TITLE_FONT); - - // Set the axis tick-mark fonts. - region.getPlot().getXAxis().setFont(BASIC_FONT); - region.getPlot().getYAxis().setFont(BASIC_FONT); - region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); - region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); - } + // Define plot fonts. + public static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 30); + public static final Font AXIS_FONT = new Font("Calibri", Font.BOLD, 35); + public static final Font TITLE_FONT = new Font("Calibri", Font.BOLD, 45); + + // Defines the color style options for plot data. + public static enum ColorStyle { + MS_BLUE(new Color( 79, 129, 189), new Color( 36, 64, 97)), MS_ORANGE(new Color(247, 150, 70), new Color(152, 72, 6)), + MS_RED(new Color(192, 80, 77), new Color( 99, 36, 35)), GREY(new Color(166, 166, 166), new Color( 89, 89, 89)), + MS_GREEN(new Color(155, 187, 89), new Color( 79, 98, 40)), CRIMSON(new Color(161, 0, 0), new Color(104, 0, 0)), + RUST(new Color(161, 80, 0), new Color(105, 80, 0)), YELLOW(new Color(161, 161, 0), new Color(122, 109, 8)), + FOREST(new Color( 65, 102, 0), new Color( 37, 79, 0)), GREEN(new Color( 7, 132, 70), new Color( 7, 82, 30)), + TEAL(new Color( 0, 130, 130), new Color( 0, 90, 100)), CERULEAN(new Color( 0, 86, 130), new Color( 0, 28, 83)), + BLUE(new Color( 0, 33, 203), new Color( 0, 0, 137)), INDIGO(new Color( 68, 10, 127), new Color( 0, 0, 61)), + PURPLE(new Color(106, 0, 106), new Color( 63, 0, 56)), FUSCHIA(new Color(119, 0, 60), new Color( 60, 0, 60)); + + private final Color fillColor; + private final Color lineColor; + + private ColorStyle(Color fillColor, Color lineColor) { + this.fillColor = fillColor; + this.lineColor = lineColor; + } + + public Color getFillColor() { return fillColor; } + + public Color getLineColor() { return lineColor; } + }; + + /** + * Sets the plot display formatting for 1D plots. + * @param region - The plotter region to format. + * @param color - The data color settings to use. + */ + public static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) { + // Get the names of each plot on in the region. + String[] dataNames = region.getAllDataNames(); + + // Check whether this is an overlay plot. Overlay plots contain + // more than one data name. + boolean overlay = (dataNames.length > 1 ? true : false); + + // Iterate over each plot in the region. + for(int i = 0; i < dataNames.length; i++) { + // Set the overlay style if needed. + if(overlay) { + // Get the fill style for the current data type. + JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); + + // Set the histogram style to display thick-lined bars + // with no fill. The color is set by the "color" argument. + fillStyle.setHistogramFill(false); + fillStyle.setHistogramBarLineWidth(3); + fillStyle.setHistogramBarLineColor(color[i].getFillColor()); + + // Set the legend text style. + region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20)); + } + + // Otherwise, set the fill style for a single plot. + else { + // Get the fill style for the current data type. + JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); + + // Set the histogram style to display thick-lined bars + // with a fill color. The colors are defined by the + // "color" argument. + fillStyle.setHistogramBarLineWidth(3); + fillStyle.setHistogramBarColor(color[i].getFillColor()); + fillStyle.setHistogramBarLineColor(color[i].getLineColor()); + } + + // Set the statistics box style. + region.getPlot().getStats().setVisible(true); + region.getPlot().getStats().setFont(BASIC_FONT); + + // Set the title font. + region.getPlot().getTitleObject().setFont(TITLE_FONT); + + // Set the axis tick-mark fonts. + region.getPlot().getXAxis().setFont(BASIC_FONT); + region.getPlot().getYAxis().setFont(BASIC_FONT); + region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); + region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); + } + } + + /** + * Sets the plot display formatting for 1D plots. + * @param region - The plotter region to format. + */ + public static final void setDefault2DStyle(PlotterRegion region, boolean logarithmic) { + // Get the fill style object. 2D plots should never be overlay + // plots, so there should only ever be one data name. + JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); + + // Set the fill style for a two-dimensional plot. + if(logarithmic) { fillStyle.setLogZ(true); } + fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP); + fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW); + + // Make the statistics box invisible. + region.getPlot().getStats().setVisible(false); + + // Set the general plot font (which is also the z-axis font). + region.getPlot().setFont(BASIC_FONT); + + // Set the title font. + region.getPlot().getTitleObject().setFont(TITLE_FONT); + + // Set the axis tick-mark fonts. + region.getPlot().getXAxis().setFont(BASIC_FONT); + region.getPlot().getYAxis().setFont(BASIC_FONT); + region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); + region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/RafoAnalysis.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/RafoAnalysis.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/RafoAnalysis.java Wed Mar 9 11:43:24 2016 @@ -16,431 +16,431 @@ import org.lcsim.util.aida.AIDA; public class RafoAnalysis extends Driver { - private boolean useGoodSVT = false; - private String clusterCollectionName = "EcalClustersCorr"; - private String particleCollectionName = "FinalStateParticles"; - - private AIDA aida = AIDA.defaultInstance(); - private IHistogram1D t0TimeCoincidenceAll = aida.histogram1D("Tier 0/Time Coincidence", 300, -15.0, 15.0); - private IHistogram1D t0TimeCoincidenceFiducial = aida.histogram1D("Tier 0/Time Coincidence (Fiducial Region)", 300, -15.0, 15.0); - private IHistogram1D t0EnergySumAll = aida.histogram1D("Tier 0/Energy Sum", 300, 0.0, 1.5); - private IHistogram1D t0EnergySumFiducial = aida.histogram1D("Tier 0/Energy Sum (Fiducial Region)", 300, 0.0, 1.5); - private IHistogram1D t0InvariantMassAll = aida.histogram1D("Tier 0/Invariant Mass", 2200, 0.0, 1.1); - private IHistogram2D t0EnergySum2DAll = aida.histogram2D("Tier 0/Top Cluster Energy vs. Bottom Cluster Energy", 300, 0, 1.5, 300, 0, 1.5); - private IHistogram2D t0EnergySum2DFiducial = aida.histogram2D("Tier 0/Top Cluster Energy vs. Bottom Cluster Energy (Fiducial Region)", 300, 0, 1.5, 300, 0, 1.5); - private IHistogram2D t0SumCoplanarityAll = aida.histogram2D("Tier 0/Hardware Coplanarity vs. Energy Sum", 300, 0, 1.5, 115, 0, 230); - private IHistogram2D t0SumCoplanarityFiducial = aida.histogram2D("Tier 0/Hardware Coplanarity vs. Energy Sum (Fiducial Region)", 300, 0, 1.5, 115, 0, 230); - private IHistogram2D t0SumCoplanarityCalcAll = aida.histogram2D("Tier 0/Calculated Coplanarity vs. Energy Sum", 300, 0, 1.5, 115, 130, 230); - private IHistogram2D t0SumCoplanarityCalcFiducial = aida.histogram2D("Tier 0/Calculated Coplanarity vs. Energy Sum (Fiducial Region)", 300, 0, 1.5, 115, 130, 230); - private IHistogram2D t0TimeEnergyAll = aida.histogram2D("Tier 0/Cluster Time vs. Cluster Energy", 300, 0, 1.5, 100, 0, 100); - private IHistogram2D t0TimeEnergyFiducial = aida.histogram2D("Tier 0/Cluster Time vs. Cluster Energy (Fiducial Region)", 300, 0, 1.5, 100, 0, 100); - - private IHistogram1D t1TimeCoincidenceAll = aida.histogram1D("Tier 1/Time Coincidence", 300, -15.0, 15.0); - private IHistogram1D t1TimeCoincidenceFiducial = aida.histogram1D("Tier 1/Time Coincidence (Fiducial Region)", 300, -15.0, 15.0); - private IHistogram1D t1EnergySumAll = aida.histogram1D("Tier 1/Energy Sum", 300, 0.0, 1.5); - private IHistogram1D t1EnergySumFiducial = aida.histogram1D("Tier 1/Energy Sum (Fiducial Region)", 300, 0.0, 1.5); - private IHistogram1D t1InvariantMassAll = aida.histogram1D("Tier 1/Invariant Mass", 2200, 0.0, 1.1); - private IHistogram2D t1EnergySum2DAll = aida.histogram2D("Tier 1/Top Cluster Energy vs. Bottom Cluster Energy", 300, 0, 1.5, 300, 0, 1.5); - private IHistogram2D t1EnergySum2DFiducial = aida.histogram2D("Tier 1/Top Cluster Energy vs. Bottom Cluster Energy (Fiducial Region)", 300, 0, 1.5, 300, 0, 1.5); - private IHistogram2D t1SumCoplanarityAll = aida.histogram2D("Tier 1/Hardware Coplanarity vs. Energy Sum", 300, 0, 1.5, 115, 0, 230); - private IHistogram2D t1SumCoplanarityFiducial = aida.histogram2D("Tier 1/Hardware Coplanarity vs. Energy Sum (Fiducial Region)", 300, 0, 1.5, 115, 0, 230); - private IHistogram2D t1SumCoplanarityCalcAll = aida.histogram2D("Tier 1/Calculated Coplanarity vs. Energy Sum", 300, 0, 1.5, 115, 130, 230); - private IHistogram2D t1SumCoplanarityCalcFiducial = aida.histogram2D("Tier 1/Calculated Coplanarity vs. Energy Sum (Fiducial Region)", 300, 0, 1.5, 115, 130, 230); - private IHistogram2D t1TimeEnergyAll = aida.histogram2D("Tier 1/Cluster Time vs. Cluster Energy", 300, 0, 1.5, 100, 0, 100); - private IHistogram2D t1TimeEnergyFiducial = aida.histogram2D("Tier 1/Cluster Time vs. Cluster Energy (Fiducial Region)", 300, 0, 1.5, 100, 0, 100); - - private IHistogram1D t2TimeCoincidenceAll = aida.histogram1D("Tier 2/Time Coincidence", 300, -15.0, 15.0); - private IHistogram1D t2TimeCoincidenceFiducial = aida.histogram1D("Tier 2/Time Coincidence (Fiducial Region)", 300, -15.0, 15.0); - private IHistogram1D t2EnergySumAll = aida.histogram1D("Tier 2/Energy Sum", 300, 0.0, 1.5); - private IHistogram1D t2EnergySumFiducial = aida.histogram1D("Tier 2/Energy Sum (Fiducial Region)", 300, 0.0, 1.5); - private IHistogram1D t2InvariantMassAll = aida.histogram1D("Tier 2/Invariant Mass", 2200, 0.0, 1.1); - private IHistogram2D t2EnergySum2DAll = aida.histogram2D("Tier 2/Top Cluster Energy vs. Bottom Cluster Energy", 300, 0, 1.5, 300, 0, 1.5); - private IHistogram2D t2EnergySum2DFiducial = aida.histogram2D("Tier 2/Top Cluster Energy vs. Bottom Cluster Energy (Fiducial Region)", 300, 0, 1.5, 300, 0, 1.5); - private IHistogram2D t2SumCoplanarityAll = aida.histogram2D("Tier 2/Hardware Coplanarity vs. Energy Sum", 300, 0, 1.5, 115, 0, 230); - private IHistogram2D t2SumCoplanarityFiducial = aida.histogram2D("Tier 2/Hardware Coplanarity vs. Energy Sum (Fiducial Region)", 300, 0, 1.5, 115, 0, 230); - private IHistogram2D t2SumCoplanarityCalcAll = aida.histogram2D("Tier 2/Calculated Coplanarity vs. Energy Sum", 300, 0, 1.5, 115, 130, 230); - private IHistogram2D t2SumCoplanarityCalcFiducial = aida.histogram2D("Tier 2/Calculated Coplanarity vs. Energy Sum (Fiducial Region)", 300, 0, 1.5, 115, 130, 230); - private IHistogram2D t2TimeEnergyAll = aida.histogram2D("Tier 2/Cluster Time vs. Cluster Energy", 300, 0, 1.5, 100, 0, 100); - private IHistogram2D t2TimeEnergyFiducial = aida.histogram2D("Tier 2/Cluster Time vs. Cluster Energy (Fiducial Region)", 300, 0, 1.5, 100, 0, 100); - - private int t0Events = 0; - private int t1Events = 0; - private int t2Events = 0; - - @Override - public void endOfData() { - System.out.printf("Tier 0 Events: %d%n", t0Events); - System.out.printf("Tier 1 Events: %d%n", t1Events); - System.out.printf("Tier 2 Events: %d%n", t2Events); - } - - @Override - public void process(EventHeader event) { - // Check whether the SVT was active in this event. - final String[] flagNames = { "svt_bias_good", "svt_burstmode_noise_good", "svt_position_good" }; - boolean svtGood = true; + private boolean useGoodSVT = false; + private String clusterCollectionName = "EcalClustersCorr"; + private String particleCollectionName = "FinalStateParticles"; + + private AIDA aida = AIDA.defaultInstance(); + private IHistogram1D t0TimeCoincidenceAll = aida.histogram1D("Tier 0/Time Coincidence", 300, -15.0, 15.0); + private IHistogram1D t0TimeCoincidenceFiducial = aida.histogram1D("Tier 0/Time Coincidence (Fiducial Region)", 300, -15.0, 15.0); + private IHistogram1D t0EnergySumAll = aida.histogram1D("Tier 0/Energy Sum", 300, 0.0, 1.5); + private IHistogram1D t0EnergySumFiducial = aida.histogram1D("Tier 0/Energy Sum (Fiducial Region)", 300, 0.0, 1.5); + private IHistogram1D t0InvariantMassAll = aida.histogram1D("Tier 0/Invariant Mass", 2200, 0.0, 1.1); + private IHistogram2D t0EnergySum2DAll = aida.histogram2D("Tier 0/Top Cluster Energy vs. Bottom Cluster Energy", 300, 0, 1.5, 300, 0, 1.5); + private IHistogram2D t0EnergySum2DFiducial = aida.histogram2D("Tier 0/Top Cluster Energy vs. Bottom Cluster Energy (Fiducial Region)", 300, 0, 1.5, 300, 0, 1.5); + private IHistogram2D t0SumCoplanarityAll = aida.histogram2D("Tier 0/Hardware Coplanarity vs. Energy Sum", 300, 0, 1.5, 115, 0, 230); + private IHistogram2D t0SumCoplanarityFiducial = aida.histogram2D("Tier 0/Hardware Coplanarity vs. Energy Sum (Fiducial Region)", 300, 0, 1.5, 115, 0, 230); + private IHistogram2D t0SumCoplanarityCalcAll = aida.histogram2D("Tier 0/Calculated Coplanarity vs. Energy Sum", 300, 0, 1.5, 115, 130, 230); + private IHistogram2D t0SumCoplanarityCalcFiducial = aida.histogram2D("Tier 0/Calculated Coplanarity vs. Energy Sum (Fiducial Region)", 300, 0, 1.5, 115, 130, 230); + private IHistogram2D t0TimeEnergyAll = aida.histogram2D("Tier 0/Cluster Time vs. Cluster Energy", 300, 0, 1.5, 100, 0, 100); + private IHistogram2D t0TimeEnergyFiducial = aida.histogram2D("Tier 0/Cluster Time vs. Cluster Energy (Fiducial Region)", 300, 0, 1.5, 100, 0, 100); + + private IHistogram1D t1TimeCoincidenceAll = aida.histogram1D("Tier 1/Time Coincidence", 300, -15.0, 15.0); + private IHistogram1D t1TimeCoincidenceFiducial = aida.histogram1D("Tier 1/Time Coincidence (Fiducial Region)", 300, -15.0, 15.0); + private IHistogram1D t1EnergySumAll = aida.histogram1D("Tier 1/Energy Sum", 300, 0.0, 1.5); + private IHistogram1D t1EnergySumFiducial = aida.histogram1D("Tier 1/Energy Sum (Fiducial Region)", 300, 0.0, 1.5); + private IHistogram1D t1InvariantMassAll = aida.histogram1D("Tier 1/Invariant Mass", 2200, 0.0, 1.1); + private IHistogram2D t1EnergySum2DAll = aida.histogram2D("Tier 1/Top Cluster Energy vs. Bottom Cluster Energy", 300, 0, 1.5, 300, 0, 1.5); + private IHistogram2D t1EnergySum2DFiducial = aida.histogram2D("Tier 1/Top Cluster Energy vs. Bottom Cluster Energy (Fiducial Region)", 300, 0, 1.5, 300, 0, 1.5); + private IHistogram2D t1SumCoplanarityAll = aida.histogram2D("Tier 1/Hardware Coplanarity vs. Energy Sum", 300, 0, 1.5, 115, 0, 230); + private IHistogram2D t1SumCoplanarityFiducial = aida.histogram2D("Tier 1/Hardware Coplanarity vs. Energy Sum (Fiducial Region)", 300, 0, 1.5, 115, 0, 230); + private IHistogram2D t1SumCoplanarityCalcAll = aida.histogram2D("Tier 1/Calculated Coplanarity vs. Energy Sum", 300, 0, 1.5, 115, 130, 230); + private IHistogram2D t1SumCoplanarityCalcFiducial = aida.histogram2D("Tier 1/Calculated Coplanarity vs. Energy Sum (Fiducial Region)", 300, 0, 1.5, 115, 130, 230); + private IHistogram2D t1TimeEnergyAll = aida.histogram2D("Tier 1/Cluster Time vs. Cluster Energy", 300, 0, 1.5, 100, 0, 100); + private IHistogram2D t1TimeEnergyFiducial = aida.histogram2D("Tier 1/Cluster Time vs. Cluster Energy (Fiducial Region)", 300, 0, 1.5, 100, 0, 100); + + private IHistogram1D t2TimeCoincidenceAll = aida.histogram1D("Tier 2/Time Coincidence", 300, -15.0, 15.0); + private IHistogram1D t2TimeCoincidenceFiducial = aida.histogram1D("Tier 2/Time Coincidence (Fiducial Region)", 300, -15.0, 15.0); + private IHistogram1D t2EnergySumAll = aida.histogram1D("Tier 2/Energy Sum", 300, 0.0, 1.5); + private IHistogram1D t2EnergySumFiducial = aida.histogram1D("Tier 2/Energy Sum (Fiducial Region)", 300, 0.0, 1.5); + private IHistogram1D t2InvariantMassAll = aida.histogram1D("Tier 2/Invariant Mass", 2200, 0.0, 1.1); + private IHistogram2D t2EnergySum2DAll = aida.histogram2D("Tier 2/Top Cluster Energy vs. Bottom Cluster Energy", 300, 0, 1.5, 300, 0, 1.5); + private IHistogram2D t2EnergySum2DFiducial = aida.histogram2D("Tier 2/Top Cluster Energy vs. Bottom Cluster Energy (Fiducial Region)", 300, 0, 1.5, 300, 0, 1.5); + private IHistogram2D t2SumCoplanarityAll = aida.histogram2D("Tier 2/Hardware Coplanarity vs. Energy Sum", 300, 0, 1.5, 115, 0, 230); + private IHistogram2D t2SumCoplanarityFiducial = aida.histogram2D("Tier 2/Hardware Coplanarity vs. Energy Sum (Fiducial Region)", 300, 0, 1.5, 115, 0, 230); + private IHistogram2D t2SumCoplanarityCalcAll = aida.histogram2D("Tier 2/Calculated Coplanarity vs. Energy Sum", 300, 0, 1.5, 115, 130, 230); + private IHistogram2D t2SumCoplanarityCalcFiducial = aida.histogram2D("Tier 2/Calculated Coplanarity vs. Energy Sum (Fiducial Region)", 300, 0, 1.5, 115, 130, 230); + private IHistogram2D t2TimeEnergyAll = aida.histogram2D("Tier 2/Cluster Time vs. Cluster Energy", 300, 0, 1.5, 100, 0, 100); + private IHistogram2D t2TimeEnergyFiducial = aida.histogram2D("Tier 2/Cluster Time vs. Cluster Energy (Fiducial Region)", 300, 0, 1.5, 100, 0, 100); + + private int t0Events = 0; + private int t1Events = 0; + private int t2Events = 0; + + @Override + public void endOfData() { + System.out.printf("Tier 0 Events: %d%n", t0Events); + System.out.printf("Tier 1 Events: %d%n", t1Events); + System.out.printf("Tier 2 Events: %d%n", t2Events); + } + + @Override + public void process(EventHeader event) { + // Check whether the SVT was active in this event. + final String[] flagNames = { "svt_bias_good", "svt_burstmode_noise_good", "svt_position_good" }; + boolean svtGood = true; for(int i = 0; i < flagNames.length; i++) { int[] flag = event.getIntegerParameters().get(flagNames[i]); if(flag == null || flag[0] == 0) { svtGood = false; } } - + // If the SVT is not properly running, skip the event. if(!svtGood && useGoodSVT) { return; } - // Get the list of particles, if it exists. - List<ReconstructedParticle> trackList = null; - if(event.hasCollection(ReconstructedParticle.class, particleCollectionName)) { - trackList = event.get(ReconstructedParticle.class, particleCollectionName); - } - - // Get the list of clusters, if it exists. - List<Cluster> clusterList = null; - if(event.hasCollection(Cluster.class, clusterCollectionName)) { - clusterList = event.get(Cluster.class, clusterCollectionName); - } - - // Make sure that the cluster and track lists both exist. - if(clusterList == null || trackList == null) { - return; - } - - // Perform tier 1 analysis. This requires that there be at - // least one top/bottom cluster pair with a time difference - // of less then 4 ns. - double t1TimeThreshold = 1.5; - - // Get a list of cluster pairs. - List<Cluster[]> pairList = getClusterPairs(clusterList); - - // Iterate over the cluster pairs. - boolean t1Passed = false; - t1ClusterLoop: - for(Cluster[] pair : pairList) { - // Check that the time difference for the cluster pair - // meets the time cut. - if(TriggerModule.getValueTimeCoincidence(pair) <= t1TimeThreshold) { - // Note that the tier 1 analysis condition passed. - t1Passed = true; - - // Break from the loop. - break t1ClusterLoop; - } - } - - // Perform the additional checks for tier 2 analysis. This - // requires that there be at least one top/bottom track pair - // and that one track be positive and the other be negative. - - // Get a list of top and bottom track pairs. - List<ReconstructedParticle[]> trackPairList = getTrackPairs(trackList); - - // Check that at least one top/bottom track has one negative and - // one positive track. - boolean t2Passed = false; - t2TrackLoop: - for(ReconstructedParticle[] pair : trackPairList) { - if((pair[0].getCharge() > 0 && pair[1].getCharge() < 0) || (pair[0].getCharge() < 0 && pair[1].getCharge() > 0)) { - t2Passed = true; - break t2TrackLoop; - } - } - - // Populate the tier 0 analysis plot. - if(true) { - // Increment the number of tier 1 events found. - t0Events++; - - // Track which clusters have already been added to the - // singles plot so that there are no repeats. - Set<Cluster> plotSet = new HashSet<Cluster>(clusterList.size()); - Set<Cluster> plotFiducial = new HashSet<Cluster>(clusterList.size()); - - for(ReconstructedParticle[] pair : trackPairList) { - t0InvariantMassAll.fill(getInvariantMass(pair)); - } - - for(Cluster[] pair : pairList) { - // Fill the all pairs plots. - double pairEnergy = pair[0].getEnergy() + pair[1].getEnergy(); - t0EnergySumAll.fill(pairEnergy); - t0EnergySum2DAll.fill(pair[1].getEnergy(), pair[0].getEnergy()); - t0TimeCoincidenceAll.fill(getTimeConicidence(pair)); - t0SumCoplanarityCalcAll.fill(pairEnergy, getCalculatedCoplanarity(pair)); - t0SumCoplanarityAll.fill(pairEnergy, TriggerModule.getValueCoplanarity(pair)); - - // Fill the singles plots. - if(!plotSet.contains(pair[0])) { - plotSet.add(pair[0]); - t0TimeEnergyAll.fill(pair[0].getEnergy(), TriggerModule.getClusterTime(pair[0])); - } if(!plotSet.contains(pair[1])) { - plotSet.add(pair[1]); - t0TimeEnergyAll.fill(pair[1].getEnergy(), TriggerModule.getClusterTime(pair[1])); - } - - // Fill the fiducial plots if appropriate. - if(inFiducialRegion(pair[0]) && inFiducialRegion(pair[1])) { - t0EnergySumFiducial.fill(pairEnergy); - t0EnergySum2DFiducial.fill(pair[1].getEnergy(), pair[0].getEnergy()); - t0TimeCoincidenceFiducial.fill(getTimeConicidence(pair)); - t0SumCoplanarityCalcFiducial.fill(pairEnergy, getCalculatedCoplanarity(pair)); - t0SumCoplanarityFiducial.fill(pairEnergy, TriggerModule.getValueCoplanarity(pair)); - } - - // Fill the singles fiducial plots if appropriate. - if(!plotFiducial.contains(pair[0]) && inFiducialRegion(pair[0])) { - plotFiducial.add(pair[0]); - t0TimeEnergyFiducial.fill(pair[0].getEnergy(), TriggerModule.getClusterTime(pair[0])); - } if(!plotFiducial.contains(pair[1]) && inFiducialRegion(pair[1])) { - plotFiducial.add(pair[1]); - t0TimeEnergyFiducial.fill(pair[1].getEnergy(), TriggerModule.getClusterTime(pair[1])); - } - } - } - - // Populate the tier 1 analysis plots, if the conditions were met. - if(t1Passed) { - // Increment the number of tier 1 events found. - t1Events++; - - // Track which clusters have already been added to the - // singles plot so that there are no repeats. - Set<Cluster> plotSet = new HashSet<Cluster>(clusterList.size()); - Set<Cluster> plotFiducial = new HashSet<Cluster>(clusterList.size()); - - for(ReconstructedParticle[] pair : trackPairList) { - t1InvariantMassAll.fill(getInvariantMass(pair)); - } - - for(Cluster[] pair : pairList) { - // Only include clusters that pass the time coincidence. - if(TriggerModule.getValueTimeCoincidence(pair) > t1TimeThreshold) { - continue; - } - - // Fill the all pairs plots. - double pairEnergy = pair[0].getEnergy() + pair[1].getEnergy(); - t1EnergySumAll.fill(pairEnergy); - t1EnergySum2DAll.fill(pair[1].getEnergy(), pair[0].getEnergy()); - t1TimeCoincidenceAll.fill(getTimeConicidence(pair)); - t1SumCoplanarityCalcAll.fill(pairEnergy, getCalculatedCoplanarity(pair)); - t1SumCoplanarityAll.fill(pairEnergy, TriggerModule.getValueCoplanarity(pair)); - - // Fill the singles plots. - if(!plotSet.contains(pair[0])) { - plotSet.add(pair[0]); - t1TimeEnergyAll.fill(pair[0].getEnergy(), TriggerModule.getClusterTime(pair[0])); - } if(!plotSet.contains(pair[1])) { - plotSet.add(pair[1]); - t1TimeEnergyAll.fill(pair[1].getEnergy(), TriggerModule.getClusterTime(pair[1])); - } - - // Fill the fiducial plots if appropriate. - if(inFiducialRegion(pair[0]) && inFiducialRegion(pair[1])) { - t1EnergySumFiducial.fill(pairEnergy); - t1EnergySum2DFiducial.fill(pair[1].getEnergy(), pair[0].getEnergy()); - t1TimeCoincidenceFiducial.fill(getTimeConicidence(pair)); - t1SumCoplanarityCalcFiducial.fill(pairEnergy, getCalculatedCoplanarity(pair)); - t1SumCoplanarityFiducial.fill(pairEnergy, TriggerModule.getValueCoplanarity(pair)); - } - - // Fill the singles fiducial plots if appropriate. - if(!plotFiducial.contains(pair[0]) && inFiducialRegion(pair[0])) { - plotFiducial.add(pair[0]); - t1TimeEnergyFiducial.fill(pair[0].getEnergy(), TriggerModule.getClusterTime(pair[0])); - } if(!plotFiducial.contains(pair[1]) && inFiducialRegion(pair[1])) { - plotFiducial.add(pair[1]); - t1TimeEnergyFiducial.fill(pair[1].getEnergy(), TriggerModule.getClusterTime(pair[1])); - } - } - } - - // Populate the tier 2 analysis plots, if the conditions were met. - if(t1Passed && t2Passed) { - // Increment the number of tier 2 events found. - t2Events++; - - // Track which clusters have already been added to the - // singles plot so that there are no repeats. - Set<Cluster> plotSet = new HashSet<Cluster>(clusterList.size()); - Set<Cluster> plotFiducial = new HashSet<Cluster>(clusterList.size()); - - for(ReconstructedParticle[] pair : trackPairList) { - t2InvariantMassAll.fill(getInvariantMass(pair)); - } - - for(Cluster[] pair : pairList) { - // Only include clusters that pass the time coincidence. - if(TriggerModule.getValueTimeCoincidence(pair) > t1TimeThreshold) { - continue; - } - - // Fill the all pairs plots. - double pairEnergy = pair[0].getEnergy() + pair[1].getEnergy(); - t2EnergySumAll.fill(pairEnergy); - t2EnergySum2DAll.fill(pair[1].getEnergy(), pair[0].getEnergy()); - t2TimeCoincidenceAll.fill(getTimeConicidence(pair)); - t2SumCoplanarityCalcAll.fill(pairEnergy, getCalculatedCoplanarity(pair)); - t2SumCoplanarityAll.fill(pairEnergy, TriggerModule.getValueCoplanarity(pair)); - - // Fill the singles plots. - if(!plotSet.contains(pair[0])) { - plotSet.add(pair[0]); - t2TimeEnergyAll.fill(pair[0].getEnergy(), TriggerModule.getClusterTime(pair[0])); - } if(!plotSet.contains(pair[1])) { - plotSet.add(pair[1]); - t2TimeEnergyAll.fill(pair[1].getEnergy(), TriggerModule.getClusterTime(pair[1])); - } - - // Fill the fiducial plots if appropriate. - if(inFiducialRegion(pair[0]) && inFiducialRegion(pair[1])) { - t2EnergySumFiducial.fill(pairEnergy); - t2EnergySum2DFiducial.fill(pair[1].getEnergy(), pair[0].getEnergy()); - t2TimeCoincidenceFiducial.fill(getTimeConicidence(pair)); - t2SumCoplanarityCalcFiducial.fill(pairEnergy, getCalculatedCoplanarity(pair)); - t2SumCoplanarityFiducial.fill(pairEnergy, TriggerModule.getValueCoplanarity(pair)); - } - - // Fill the singles fiducial plots if appropriate. - if(!plotFiducial.contains(pair[0]) && inFiducialRegion(pair[0])) { - plotFiducial.add(pair[0]); - t2TimeEnergyFiducial.fill(pair[0].getEnergy(), TriggerModule.getClusterTime(pair[0])); - } if(!plotFiducial.contains(pair[1]) && inFiducialRegion(pair[1])) { - plotFiducial.add(pair[1]); - t2TimeEnergyFiducial.fill(pair[1].getEnergy(), TriggerModule.getClusterTime(pair[1])); - } - } - } - } - - public static final double getInvariantMass(ReconstructedParticle[] pair) { - // Get energy. - double[] energy = new double[2]; - final double electronMassSquared = Math.pow(0.00051099891, 2); - energy[0] = Math.sqrt(pair[0].getMomentum().magnitudeSquared() + electronMassSquared); - energy[1] = Math.sqrt(pair[1].getMomentum().magnitudeSquared() + electronMassSquared); - - // Calculate the invariant mass. - return Math.sqrt(Math.pow(energy[0] + energy[1], 2) - Math.pow(pair[0].getMomentum().x() + pair[1].getMomentum().x(), 2) - + Math.pow(pair[0].getMomentum().y() + pair[1].getMomentum().y(), 2) + Math.pow(pair[0].getMomentum().z() + pair[1].getMomentum().z(), 2)); - } - - public static final double getCalculatedCoplanarity(Cluster[] pair) { - // Define the x- and y-coordinates of the clusters as well as - // calorimeter center. - final double ORIGIN_X = 42.52; - double x[] = { pair[0].getPosition()[0], pair[1].getPosition()[0] }; - double y[] = { pair[0].getPosition()[1], pair[1].getPosition()[1] }; - + // Get the list of particles, if it exists. + List<ReconstructedParticle> trackList = null; + if(event.hasCollection(ReconstructedParticle.class, particleCollectionName)) { + trackList = event.get(ReconstructedParticle.class, particleCollectionName); + } + + // Get the list of clusters, if it exists. + List<Cluster> clusterList = null; + if(event.hasCollection(Cluster.class, clusterCollectionName)) { + clusterList = event.get(Cluster.class, clusterCollectionName); + } + + // Make sure that the cluster and track lists both exist. + if(clusterList == null || trackList == null) { + return; + } + + // Perform tier 1 analysis. This requires that there be at + // least one top/bottom cluster pair with a time difference + // of less then 4 ns. + double t1TimeThreshold = 1.5; + + // Get a list of cluster pairs. + List<Cluster[]> pairList = getClusterPairs(clusterList); + + // Iterate over the cluster pairs. + boolean t1Passed = false; + t1ClusterLoop: + for(Cluster[] pair : pairList) { + // Check that the time difference for the cluster pair + // meets the time cut. + if(TriggerModule.getValueTimeCoincidence(pair) <= t1TimeThreshold) { + // Note that the tier 1 analysis condition passed. + t1Passed = true; + + // Break from the loop. + break t1ClusterLoop; + } + } + + // Perform the additional checks for tier 2 analysis. This + // requires that there be at least one top/bottom track pair + // and that one track be positive and the other be negative. + + // Get a list of top and bottom track pairs. + List<ReconstructedParticle[]> trackPairList = getTrackPairs(trackList); + + // Check that at least one top/bottom track has one negative and + // one positive track. + boolean t2Passed = false; + t2TrackLoop: + for(ReconstructedParticle[] pair : trackPairList) { + if((pair[0].getCharge() > 0 && pair[1].getCharge() < 0) || (pair[0].getCharge() < 0 && pair[1].getCharge() > 0)) { + t2Passed = true; + break t2TrackLoop; + } + } + + // Populate the tier 0 analysis plot. + if(true) { + // Increment the number of tier 1 events found. + t0Events++; + + // Track which clusters have already been added to the + // singles plot so that there are no repeats. + Set<Cluster> plotSet = new HashSet<Cluster>(clusterList.size()); + Set<Cluster> plotFiducial = new HashSet<Cluster>(clusterList.size()); + + for(ReconstructedParticle[] pair : trackPairList) { + t0InvariantMassAll.fill(getInvariantMass(pair)); + } + + for(Cluster[] pair : pairList) { + // Fill the all pairs plots. + double pairEnergy = pair[0].getEnergy() + pair[1].getEnergy(); + t0EnergySumAll.fill(pairEnergy); + t0EnergySum2DAll.fill(pair[1].getEnergy(), pair[0].getEnergy()); + t0TimeCoincidenceAll.fill(getTimeConicidence(pair)); + t0SumCoplanarityCalcAll.fill(pairEnergy, getCalculatedCoplanarity(pair)); + t0SumCoplanarityAll.fill(pairEnergy, TriggerModule.getValueCoplanarity(pair)); + + // Fill the singles plots. + if(!plotSet.contains(pair[0])) { + plotSet.add(pair[0]); + t0TimeEnergyAll.fill(pair[0].getEnergy(), TriggerModule.getClusterTime(pair[0])); + } if(!plotSet.contains(pair[1])) { + plotSet.add(pair[1]); + t0TimeEnergyAll.fill(pair[1].getEnergy(), TriggerModule.getClusterTime(pair[1])); + } + + // Fill the fiducial plots if appropriate. + if(inFiducialRegion(pair[0]) && inFiducialRegion(pair[1])) { + t0EnergySumFiducial.fill(pairEnergy); + t0EnergySum2DFiducial.fill(pair[1].getEnergy(), pair[0].getEnergy()); + t0TimeCoincidenceFiducial.fill(getTimeConicidence(pair)); + t0SumCoplanarityCalcFiducial.fill(pairEnergy, getCalculatedCoplanarity(pair)); + t0SumCoplanarityFiducial.fill(pairEnergy, TriggerModule.getValueCoplanarity(pair)); + } + + // Fill the singles fiducial plots if appropriate. + if(!plotFiducial.contains(pair[0]) && inFiducialRegion(pair[0])) { + plotFiducial.add(pair[0]); + t0TimeEnergyFiducial.fill(pair[0].getEnergy(), TriggerModule.getClusterTime(pair[0])); + } if(!plotFiducial.contains(pair[1]) && inFiducialRegion(pair[1])) { + plotFiducial.add(pair[1]); + t0TimeEnergyFiducial.fill(pair[1].getEnergy(), TriggerModule.getClusterTime(pair[1])); + } + } + } + + // Populate the tier 1 analysis plots, if the conditions were met. + if(t1Passed) { + // Increment the number of tier 1 events found. + t1Events++; + + // Track which clusters have already been added to the + // singles plot so that there are no repeats. + Set<Cluster> plotSet = new HashSet<Cluster>(clusterList.size()); + Set<Cluster> plotFiducial = new HashSet<Cluster>(clusterList.size()); + + for(ReconstructedParticle[] pair : trackPairList) { + t1InvariantMassAll.fill(getInvariantMass(pair)); + } + + for(Cluster[] pair : pairList) { + // Only include clusters that pass the time coincidence. + if(TriggerModule.getValueTimeCoincidence(pair) > t1TimeThreshold) { + continue; + } + + // Fill the all pairs plots. + double pairEnergy = pair[0].getEnergy() + pair[1].getEnergy(); + t1EnergySumAll.fill(pairEnergy); + t1EnergySum2DAll.fill(pair[1].getEnergy(), pair[0].getEnergy()); + t1TimeCoincidenceAll.fill(getTimeConicidence(pair)); + t1SumCoplanarityCalcAll.fill(pairEnergy, getCalculatedCoplanarity(pair)); + t1SumCoplanarityAll.fill(pairEnergy, TriggerModule.getValueCoplanarity(pair)); + + // Fill the singles plots. + if(!plotSet.contains(pair[0])) { + plotSet.add(pair[0]); + t1TimeEnergyAll.fill(pair[0].getEnergy(), TriggerModule.getClusterTime(pair[0])); + } if(!plotSet.contains(pair[1])) { + plotSet.add(pair[1]); + t1TimeEnergyAll.fill(pair[1].getEnergy(), TriggerModule.getClusterTime(pair[1])); + } + + // Fill the fiducial plots if appropriate. + if(inFiducialRegion(pair[0]) && inFiducialRegion(pair[1])) { + t1EnergySumFiducial.fill(pairEnergy); + t1EnergySum2DFiducial.fill(pair[1].getEnergy(), pair[0].getEnergy()); + t1TimeCoincidenceFiducial.fill(getTimeConicidence(pair)); + t1SumCoplanarityCalcFiducial.fill(pairEnergy, getCalculatedCoplanarity(pair)); + t1SumCoplanarityFiducial.fill(pairEnergy, TriggerModule.getValueCoplanarity(pair)); + } + + // Fill the singles fiducial plots if appropriate. + if(!plotFiducial.contains(pair[0]) && inFiducialRegion(pair[0])) { + plotFiducial.add(pair[0]); + t1TimeEnergyFiducial.fill(pair[0].getEnergy(), TriggerModule.getClusterTime(pair[0])); + } if(!plotFiducial.contains(pair[1]) && inFiducialRegion(pair[1])) { + plotFiducial.add(pair[1]); + t1TimeEnergyFiducial.fill(pair[1].getEnergy(), TriggerModule.getClusterTime(pair[1])); + } + } + } + + // Populate the tier 2 analysis plots, if the conditions were met. + if(t1Passed && t2Passed) { + // Increment the number of tier 2 events found. + t2Events++; + + // Track which clusters have already been added to the + // singles plot so that there are no repeats. + Set<Cluster> plotSet = new HashSet<Cluster>(clusterList.size()); + Set<Cluster> plotFiducial = new HashSet<Cluster>(clusterList.size()); + + for(ReconstructedParticle[] pair : trackPairList) { + t2InvariantMassAll.fill(getInvariantMass(pair)); + } + + for(Cluster[] pair : pairList) { + // Only include clusters that pass the time coincidence. + if(TriggerModule.getValueTimeCoincidence(pair) > t1TimeThreshold) { + continue; + } + + // Fill the all pairs plots. + double pairEnergy = pair[0].getEnergy() + pair[1].getEnergy(); + t2EnergySumAll.fill(pairEnergy); + t2EnergySum2DAll.fill(pair[1].getEnergy(), pair[0].getEnergy()); + t2TimeCoincidenceAll.fill(getTimeConicidence(pair)); + t2SumCoplanarityCalcAll.fill(pairEnergy, getCalculatedCoplanarity(pair)); + t2SumCoplanarityAll.fill(pairEnergy, TriggerModule.getValueCoplanarity(pair)); + + // Fill the singles plots. + if(!plotSet.contains(pair[0])) { + plotSet.add(pair[0]); + t2TimeEnergyAll.fill(pair[0].getEnergy(), TriggerModule.getClusterTime(pair[0])); + } if(!plotSet.contains(pair[1])) { + plotSet.add(pair[1]); + t2TimeEnergyAll.fill(pair[1].getEnergy(), TriggerModule.getClusterTime(pair[1])); + } + + // Fill the fiducial plots if appropriate. + if(inFiducialRegion(pair[0]) && inFiducialRegion(pair[1])) { + t2EnergySumFiducial.fill(pairEnergy); + t2EnergySum2DFiducial.fill(pair[1].getEnergy(), pair[0].getEnergy()); + t2TimeCoincidenceFiducial.fill(getTimeConicidence(pair)); + t2SumCoplanarityCalcFiducial.fill(pairEnergy, getCalculatedCoplanarity(pair)); + t2SumCoplanarityFiducial.fill(pairEnergy, TriggerModule.getValueCoplanarity(pair)); + } + + // Fill the singles fiducial plots if appropriate. + if(!plotFiducial.contains(pair[0]) && inFiducialRegion(pair[0])) { + plotFiducial.add(pair[0]); + t2TimeEnergyFiducial.fill(pair[0].getEnergy(), TriggerModule.getClusterTime(pair[0])); + } if(!plotFiducial.contains(pair[1]) && inFiducialRegion(pair[1])) { + plotFiducial.add(pair[1]); + t2TimeEnergyFiducial.fill(pair[1].getEnergy(), TriggerModule.getClusterTime(pair[1])); + } + } + } + } + + public static final double getInvariantMass(ReconstructedParticle[] pair) { + // Get energy. + double[] energy = new double[2]; + final double electronMassSquared = Math.pow(0.00051099891, 2); + energy[0] = Math.sqrt(pair[0].getMomentum().magnitudeSquared() + electronMassSquared); + energy[1] = Math.sqrt(pair[1].getMomentum().magnitudeSquared() + electronMassSquared); + + // Calculate the invariant mass. + return Math.sqrt(Math.pow(energy[0] + energy[1], 2) - Math.pow(pair[0].getMomentum().x() + pair[1].getMomentum().x(), 2) + + Math.pow(pair[0].getMomentum().y() + pair[1].getMomentum().y(), 2) + Math.pow(pair[0].getMomentum().z() + pair[1].getMomentum().z(), 2)); + } + + public static final double getCalculatedCoplanarity(Cluster[] pair) { + // Define the x- and y-coordinates of the clusters as well as + // calorimeter center. + final double ORIGIN_X = 42.52; + double x[] = { pair[0].getPosition()[0], pair[1].getPosition()[0] }; + double y[] = { pair[0].getPosition()[1], pair[1].getPosition()[1] }; + // Get the cluster angles. double[] clusterAngle = new double[2]; for(int i = 0; i < 2; i++) { - clusterAngle[i] = Math.atan2(y[i], x[i] - ORIGIN_X) * 180 / Math.PI; - if(clusterAngle[i] <= 0) { clusterAngle[i] += 360; } + clusterAngle[i] = Math.atan2(y[i], x[i] - ORIGIN_X) * 180 / Math.PI; + if(clusterAngle[i] <= 0) { clusterAngle[i] += 360; } } // Calculate the coplanarity cut value. double clusterDiff = clusterAngle[0] - clusterAngle[1]; return clusterDiff > 0 ? clusterDiff : clusterDiff + 360; - } - - private static final boolean inFiducialRegion(Cluster cluster) { - // Get the x and y indices for the cluster. - int ix = TriggerModule.getClusterXIndex(cluster); - int absx = Math.abs(TriggerModule.getClusterXIndex(cluster)); - int absy = Math.abs(TriggerModule.getClusterYIndex(cluster)); - - // Check if the cluster is on the top or the bottom of the - // calorimeter, as defined by |y| == 5. This is an edge cluster - // and is not in the fiducial region. - if(absy == 5) { - return false; - } - - // Check if the cluster is on the extreme left or right side - // of the calorimeter, as defined by |x| == 23. This is also - // and edge cluster is not in the fiducial region. - if(absx == 23) { - return false; - } - - // Check if the cluster is along the beam gap, as defined by - // |y| == 1. This is an internal edge cluster and is not in the - // fiducial region. - if(absy == 1) { - return false; - } - - // Lastly, check if the cluster falls along the beam hole, as - // defined by clusters with -11 <= x <= -1 and |y| == 2. This - // is not the fiducial region. - if(absy == 2 && ix <= -1 && ix >= -11) { - return false; - } - - // If all checks fail, the cluster is in the fiducial region. - return true; - } - - private static final List<ReconstructedParticle[]> getTrackPairs(List<ReconstructedParticle> tracks) { - // Separate the tracks into top and bottom tracks. - List<ReconstructedParticle> topList = new ArrayList<ReconstructedParticle>(); - List<ReconstructedParticle> botList = new ArrayList<ReconstructedParticle>(); - for(ReconstructedParticle track : tracks) { - // Make sure that the track actually contains tracks. - if(track.getTracks().size() > 0) { - // Use the tan(Î) to differentiate "top" and "bottom" - // tracks from one another. - if(track.getTracks().get(0).getTrackStates().get(0).getTanLambda() > 0) { - topList.add(track); - } else { - botList.add(track); - } - } - } - - // Form all permutations of top and bottom tracks. - List<ReconstructedParticle[]> pairList = new ArrayList<ReconstructedParticle[]>(); - for(ReconstructedParticle topTrack : topList) { - for(ReconstructedParticle botTrack : botList) { - pairList.add(new ReconstructedParticle[] { topTrack, botTrack }); - } - } - - // Return the resulting cluster pairs. - return pairList; - } - - private static final List<Cluster[]> getClusterPairs(List<Cluster> clusters) { - // Separate the clusters into top and bottom clusters. - List<Cluster> topList = new ArrayList<Cluster>(); - List<Cluster> botList = new ArrayList<Cluster>(); - for(Cluster cluster : clusters) { - if(TriggerModule.getClusterYIndex(cluster) > 0) { - topList.add(cluster); - } else { - botList.add(cluster); - } - } - - // Form all permutations of top and bottom clusters. - List<Cluster[]> pairList = new ArrayList<Cluster[]>(); - for(Cluster topCluster : topList) { - for(Cluster botCluster : botList) { - pairList.add(new Cluster[] { topCluster, botCluster }); - } - } - - // Return the resulting cluster pairs. - return pairList; - } - - public static final double getTimeConicidence(Cluster[] pair) { - return TriggerModule.getClusterSeedHit(pair[1]).getTime() - TriggerModule.getClusterSeedHit(pair[0]).getTime(); - } - - public void setUseGoodSVT(boolean state) { - useGoodSVT = state; - } + } + + private static final boolean inFiducialRegion(Cluster cluster) { + // Get the x and y indices for the cluster. + int ix = TriggerModule.getClusterXIndex(cluster); + int absx = Math.abs(TriggerModule.getClusterXIndex(cluster)); + int absy = Math.abs(TriggerModule.getClusterYIndex(cluster)); + + // Check if the cluster is on the top or the bottom of the + // calorimeter, as defined by |y| == 5. This is an edge cluster + // and is not in the fiducial region. + if(absy == 5) { + return false; + } + + // Check if the cluster is on the extreme left or right side + // of the calorimeter, as defined by |x| == 23. This is also + // and edge cluster is not in the fiducial region. + if(absx == 23) { + return false; + } + + // Check if the cluster is along the beam gap, as defined by + // |y| == 1. This is an internal edge cluster and is not in the + // fiducial region. + if(absy == 1) { + return false; + } + + // Lastly, check if the cluster falls along the beam hole, as + // defined by clusters with -11 <= x <= -1 and |y| == 2. This + // is not the fiducial region. + if(absy == 2 && ix <= -1 && ix >= -11) { + return false; + } + + // If all checks fail, the cluster is in the fiducial region. + return true; + } + + private static final List<ReconstructedParticle[]> getTrackPairs(List<ReconstructedParticle> tracks) { + // Separate the tracks into top and bottom tracks. + List<ReconstructedParticle> topList = new ArrayList<ReconstructedParticle>(); + List<ReconstructedParticle> botList = new ArrayList<ReconstructedParticle>(); + for(ReconstructedParticle track : tracks) { + // Make sure that the track actually contains tracks. + if(track.getTracks().size() > 0) { + // Use the tan(Î) to differentiate "top" and "bottom" + // tracks from one another. + if(track.getTracks().get(0).getTrackStates().get(0).getTanLambda() > 0) { + topList.add(track); + } else { + botList.add(track); + } + } + } + + // Form all permutations of top and bottom tracks. + List<ReconstructedParticle[]> pairList = new ArrayList<ReconstructedParticle[]>(); + for(ReconstructedParticle topTrack : topList) { + for(ReconstructedParticle botTrack : botList) { + pairList.add(new ReconstructedParticle[] { topTrack, botTrack }); + } + } + + // Return the resulting cluster pairs. + return pairList; + } + + private static final List<Cluster[]> getClusterPairs(List<Cluster> clusters) { + // Separate the clusters into top and bottom clusters. + List<Cluster> topList = new ArrayList<Cluster>(); + List<Cluster> botList = new ArrayList<Cluster>(); + for(Cluster cluster : clusters) { + if(TriggerModule.getClusterYIndex(cluster) > 0) { + topList.add(cluster); + } else { + botList.add(cluster); + } + } + + // Form all permutations of top and bottom clusters. + List<Cluster[]> pairList = new ArrayList<Cluster[]>(); + for(Cluster topCluster : topList) { + for(Cluster botCluster : botList) { + pairList.add(new Cluster[] { topCluster, botCluster }); + } + } + + // Return the resulting cluster pairs. + return pairList; + } + + public static final double getTimeConicidence(Cluster[] pair) { + return TriggerModule.getClusterSeedHit(pair[1]).getTime() - TriggerModule.getClusterSeedHit(pair[0]).getTime(); + } + + public void setUseGoodSVT(boolean state) { + useGoodSVT = state; + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/TridentTrackDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/TridentTrackDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/TridentTrackDriver.java Wed Mar 9 11:43:24 2016 @@ -15,229 +15,229 @@ import org.lcsim.util.aida.AIDA; public class TridentTrackDriver extends Driver { - private String finalStateCollectionName = "FinalStateParticles"; - private String candidateCollectionName = "UnconstrainedV0Candidates"; - - private int tracksCandidate = 0; - private int tracksFinalState = 0; - private int tracksCandidateCluster = 0; - private int tracksFinalStateCluster = 0; - - private static final int ANY_CLUSTER = 0; - private static final int HAS_CLUSTER = 1; - - private AIDA aida = AIDA.defaultInstance(); - private IHistogram1D[] tracks = new IHistogram1D[2]; - private IHistogram1D[] posTracks = new IHistogram1D[2]; - private IHistogram1D[] negTracks = new IHistogram1D[2]; - private IHistogram1D[] posMomentum = new IHistogram1D[2]; - private IHistogram1D[] negMomentum = new IHistogram1D[2]; - private IHistogram1D[] energySum = new IHistogram1D[2]; - private IHistogram1D[] energyMomentumDiff = new IHistogram1D[2]; - private IHistogram1D[] momentumSum = new IHistogram1D[2]; - private IHistogram1D[] invariantMass = new IHistogram1D[2]; - private IHistogram2D[] energySum2D = new IHistogram2D[2]; - private IHistogram2D[] momentumSum2D = new IHistogram2D[2]; - private IHistogram2D[] position = new IHistogram2D[2]; - - @Override - public void startOfData() { - // Instantiate the "any cluster status" plots. - tracks[ANY_CLUSTER] = aida.histogram1D("Trident Analysis/All/Tracks in Event (All)", 7, -0.5, 6.5); - posTracks[ANY_CLUSTER] = aida.histogram1D("Trident Analysis/All/Tracks in Event (Positive)", 7, -0.5, 6.5); - negTracks[ANY_CLUSTER] = aida.histogram1D("Trident Analysis/All/Tracks in Event (Negative)", 7, -0.5, 6.5); - posMomentum[ANY_CLUSTER] = aida.histogram1D("Trident Analysis/All/Momentum (Positive)", 110, 0, 1.1); - negMomentum[ANY_CLUSTER] = aida.histogram1D("Trident Analysis/All/Momentum (Negative)", 110, 0, 1.1); - energySum[ANY_CLUSTER] = aida.histogram1D("Trident Analysis/All/Energy Sum", 55, 0, 2.2); - momentumSum[ANY_CLUSTER] = aida.histogram1D("Trident Analysis/All/Momentum Sum", 55, 0, 2.2); - energyMomentumDiff[ANY_CLUSTER] = aida.histogram1D("Trident Analysis/All/Energy-Momentum Difference", 55, 0, 2.2); - invariantMass[ANY_CLUSTER] = aida.histogram1D("Trident Analysis/All/Invariant Mass", 240, 0.000, 0.120); - energySum2D[ANY_CLUSTER] = aida.histogram2D("Trident Analysis/All/2D Energy Sum", 55, 0, 1.1, 55, 0, 1.1); - momentumSum2D[ANY_CLUSTER] = aida.histogram2D("Trident Analysis/All/2D Momentum Sum", 55, 0, 1.1, 55, 0, 1.1); - position[ANY_CLUSTER] = aida.histogram2D("Trident Analysis/All/Track Cluster Position", 46, -23, 23, 11, -5.5, 5.5); - - // Instantiate the "has a cluster" plots. - tracks[HAS_CLUSTER] = aida.histogram1D("Trident Analysis/Cluster/Tracks in Event (All)", 7, -0.5, 6.5); - posTracks[HAS_CLUSTER] = aida.histogram1D("Trident Analysis/Cluster/Tracks in Event (Positive)", 7, -0.5, 6.5); - negTracks[HAS_CLUSTER] = aida.histogram1D("Trident Analysis/Cluster/Tracks in Event (Negative)", 7, -0.5, 6.5); - posMomentum[HAS_CLUSTER] = aida.histogram1D("Trident Analysis/Cluster/Momentum (Positive)", 110, 0, 1.1); - negMomentum[HAS_CLUSTER] = aida.histogram1D("Trident Analysis/Cluster/Momentum (Negative)", 110, 0, 1.1); - energySum[HAS_CLUSTER] = aida.histogram1D("Trident Analysis/Cluster/Energy Sum", 55, 0, 2.2); - momentumSum[HAS_CLUSTER] = aida.histogram1D("Trident Analysis/Cluster/Momentum Sum", 55, 0, 2.2); - energyMomentumDiff[HAS_CLUSTER] = aida.histogram1D("Trident Analysis/Cluster/Energy-Momentum Difference", 55, 0, 2.2); - invariantMass[HAS_CLUSTER] = aida.histogram1D("Trident Analysis/Cluster/Invariant Mass", 240, 0.000, 0.120); - energySum2D[HAS_CLUSTER] = aida.histogram2D("Trident Analysis/Cluster/2D Energy Sum", 55, 0, 1.1, 55, 0, 1.1); - momentumSum2D[HAS_CLUSTER] = aida.histogram2D("Trident Analysis/Cluster/2D Momentum Sum", 55, 0, 1.1, 55, 0, 1.1); - position[HAS_CLUSTER] = aida.histogram2D("Trident Analysis/Cluster/Track Cluster Position", 46, -23, 23, 11, -5.5, 5.5); - } - - @Override - public void endOfData() { - System.out.printf("Tracks (Candidate) :: %d%n", tracksCandidate); - System.out.printf("Tracks (Final State) :: %d%n", tracksFinalState); - System.out.printf("Cluster Tracks (Candidate) :: %d%n", tracksCandidateCluster); - System.out.printf("Cluster Tracks (Final State) :: %d%n", tracksFinalStateCluster); - } - - @Override - public void process(EventHeader event) { - // Check for final state particles. - if(event.hasCollection(ReconstructedParticle.class, finalStateCollectionName)) { - // Get the final state particles. - List<ReconstructedParticle> trackList = event.get(ReconstructedParticle.class, finalStateCollectionName); - - // Store the positive and negative tracks. - List<ReconstructedParticle> allTrackList = new ArrayList<ReconstructedParticle>(); - List<ReconstructedParticle> posTrackList = new ArrayList<ReconstructedParticle>(); - List<ReconstructedParticle> negTrackList = new ArrayList<ReconstructedParticle>(); - - // Store the same tracks, but limited to those with clusters. - List<ReconstructedParticle> allClusterTrackList = new ArrayList<ReconstructedParticle>(); - List<ReconstructedParticle> posClusterTrackList = new ArrayList<ReconstructedParticle>(); - List<ReconstructedParticle> negClusterTrackList = new ArrayList<ReconstructedParticle>(); - - // Iterate over the tracks and populate the lists. - for(ReconstructedParticle track : trackList) { - // Skip instances with no raw tracks. - if(track.getTracks().size() == 0) { continue; } - - // Add the cluster to the all track list. - allTrackList.add(track); - - // Track the number of cluster tracks. - tracksFinalState++; - if(!track.getClusters().isEmpty()) { - tracksFinalStateCluster++; - } - - // Process the track position plots. - Hep3Vector trackPosAtEcal = TrackUtils.extrapolateTrack(track.getTracks().get(0), 1394.5); - position[ANY_CLUSTER].fill(trackPosAtEcal.x(), trackPosAtEcal.y()); - - // Process the tracks based on charge. - if(track.getCharge() > 0) { - // Increment the counters and populate the momentum plots. - posTrackList.add(track); - posMomentum[ANY_CLUSTER].fill(track.getMomentum().magnitude()); - - // Repeat for the "has clusters" plots if necessary. - if(track.getClusters().size() > 0) { - // Increment the counters and populate the - // momentum plot. - posClusterTrackList.add(track); - allClusterTrackList.add(track); - posMomentum[HAS_CLUSTER].fill(track.getMomentum().magnitude()); - - // Populate the cluster position plot. - //int ix = track.getClusters().get(0).getCalorimeterHits().get(0).getIdentifierFieldValue("ix"); - //int iy = track.getClusters().get(0).getCalorimeterHits().get(0).getIdentifierFieldValue("iy"); - position[HAS_CLUSTER].fill(trackPosAtEcal.x(), trackPosAtEcal.y()); - } - } else if(track.getCharge() < 0) { - // Increment the counters and populate the momentum plots. - negTrackList.add(track); - negMomentum[ANY_CLUSTER].fill(track.getMomentum().magnitude()); - - // Repeat for the "has clusters" plots if necessary. - if(track.getClusters().size() > 0) { - // Increment the counters and populate the - // momentum plot. - negClusterTrackList.add(track); - allClusterTrackList.add(track); - negMomentum[HAS_CLUSTER].fill(track.getMomentum().magnitude()); - - // Populate the cluster position plot. - //int ix = track.getClusters().get(0).getCalorimeterHits().get(0).getIdentifierFieldValue("ix"); - //int iy = track.getClusters().get(0).getCalorimeterHits().get(0).getIdentifierFieldValue("iy"); - position[HAS_CLUSTER].fill(trackPosAtEcal.x(), trackPosAtEcal.y()); - } - } else { - if(track.getClusters().size() > 0) { - // Increment the counter. - allClusterTrackList.add(track); - - // Populate the cluster position plot. - //int ix = track.getClusters().get(0).getCalorimeterHits().get(0).getIdentifierFieldValue("ix"); - //int iy = track.getClusters().get(0).getCalorimeterHits().get(0).getIdentifierFieldValue("iy"); - position[HAS_CLUSTER].fill(trackPosAtEcal.x(), trackPosAtEcal.y()); - } - } - } - - // Populate the tracks per event plots. - tracks[ANY_CLUSTER].fill(allTrackList.size()); - tracks[HAS_CLUSTER].fill(allClusterTrackList.size()); - posTracks[ANY_CLUSTER].fill(posTrackList.size()); - posTracks[HAS_CLUSTER].fill(posClusterTrackList.size()); - negTracks[ANY_CLUSTER].fill(negTrackList.size()); - negTracks[HAS_CLUSTER].fill(negClusterTrackList.size()); - - /// Store track pairs. - List<ReconstructedParticle[]> pairList = new ArrayList<ReconstructedParticle[]>(); - List<ReconstructedParticle[]> pairClusterList = new ArrayList<ReconstructedParticle[]>(); - - // Form track pairs for all tracks. - for(ReconstructedParticle posTrack : posTrackList) { - for(ReconstructedParticle negTrack : negTrackList) { - pairList.add(new ReconstructedParticle[] { posTrack, negTrack }); - } - } - - // Form track pairs for cluster tracks. - for(ReconstructedParticle posTrack : posClusterTrackList) { - for(ReconstructedParticle negTrack : negClusterTrackList) { - pairClusterList.add(new ReconstructedParticle[] { posTrack, negTrack }); - } - } - - // Populate the track pair plots. - for(ReconstructedParticle[] pair : pairList) { - Hep3Vector pSum = new BasicHep3Vector( - pair[0].getMomentum().x() + pair[1].getMomentum().x(), - pair[0].getMomentum().y() + pair[1].getMomentum().y(), - pair[0].getMomentum().z() + pair[1].getMomentum().z()); - - energySum[ANY_CLUSTER].fill(pair[0].getEnergy() + pair[1].getEnergy()); - momentumSum[ANY_CLUSTER].fill(pSum.magnitude()); - energySum2D[ANY_CLUSTER].fill(pair[0].getEnergy(), pair[1].getEnergy()); - momentumSum2D[ANY_CLUSTER].fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); - energyMomentumDiff[ANY_CLUSTER].fill(Math.abs((pair[0].getEnergy() + pair[1].getEnergy()) - pSum.magnitude())); - } - - // Populate the cluster track pair plots. - for(ReconstructedParticle[] pair : pairClusterList) { - Hep3Vector pSum = new BasicHep3Vector( - pair[0].getMomentum().x() + pair[1].getMomentum().x(), - pair[0].getMomentum().y() + pair[1].getMomentum().y(), - pair[0].getMomentum().z() + pair[1].getMomentum().z()); - - energySum[HAS_CLUSTER].fill(pair[0].getEnergy() + pair[1].getEnergy()); - momentumSum[HAS_CLUSTER].fill(pSum.magnitude()); - energySum2D[HAS_CLUSTER].fill(pair[0].getEnergy(), pair[1].getEnergy()); - momentumSum2D[HAS_CLUSTER].fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); - energyMomentumDiff[HAS_CLUSTER].fill(Math.abs((pair[0].getEnergy() + pair[1].getEnergy()) - pSum.magnitude())); - } - } - - // Check for V0 candidates. - if(event.hasCollection(ReconstructedParticle.class, candidateCollectionName)) { - // Get the candidate particles. - List<ReconstructedParticle> trackList = event.get(ReconstructedParticle.class, candidateCollectionName); - - // Increment the counter. - tracksCandidate += trackList.size(); - - // Increment the counter for cluster tracks. - for(ReconstructedParticle track : trackList) { - // Populate the invariant mass plot. - invariantMass[ANY_CLUSTER].fill(track.getMass()); - - // Check for a cluster track. - if(track.getClusters().size() > 0) { - tracksCandidateCluster++; - invariantMass[HAS_CLUSTER].fill(track.getMass()); - } - } - } - } + private String finalStateCollectionName = "FinalStateParticles"; + private String candidateCollectionName = "UnconstrainedV0Candidates"; + + private int tracksCandidate = 0; + private int tracksFinalState = 0; + private int tracksCandidateCluster = 0; + private int tracksFinalStateCluster = 0; + + private static final int ANY_CLUSTER = 0; + private static final int HAS_CLUSTER = 1; + + private AIDA aida = AIDA.defaultInstance(); + private IHistogram1D[] tracks = new IHistogram1D[2]; + private IHistogram1D[] posTracks = new IHistogram1D[2]; + private IHistogram1D[] negTracks = new IHistogram1D[2]; + private IHistogram1D[] posMomentum = new IHistogram1D[2]; + private IHistogram1D[] negMomentum = new IHistogram1D[2]; + private IHistogram1D[] energySum = new IHistogram1D[2]; + private IHistogram1D[] energyMomentumDiff = new IHistogram1D[2]; + private IHistogram1D[] momentumSum = new IHistogram1D[2]; + private IHistogram1D[] invariantMass = new IHistogram1D[2]; + private IHistogram2D[] energySum2D = new IHistogram2D[2]; + private IHistogram2D[] momentumSum2D = new IHistogram2D[2]; + private IHistogram2D[] position = new IHistogram2D[2]; + + @Override + public void startOfData() { + // Instantiate the "any cluster status" plots. + tracks[ANY_CLUSTER] = aida.histogram1D("Trident Analysis/All/Tracks in Event (All)", 7, -0.5, 6.5); + posTracks[ANY_CLUSTER] = aida.histogram1D("Trident Analysis/All/Tracks in Event (Positive)", 7, -0.5, 6.5); + negTracks[ANY_CLUSTER] = aida.histogram1D("Trident Analysis/All/Tracks in Event (Negative)", 7, -0.5, 6.5); + posMomentum[ANY_CLUSTER] = aida.histogram1D("Trident Analysis/All/Momentum (Positive)", 110, 0, 1.1); + negMomentum[ANY_CLUSTER] = aida.histogram1D("Trident Analysis/All/Momentum (Negative)", 110, 0, 1.1); + energySum[ANY_CLUSTER] = aida.histogram1D("Trident Analysis/All/Energy Sum", 55, 0, 2.2); + momentumSum[ANY_CLUSTER] = aida.histogram1D("Trident Analysis/All/Momentum Sum", 55, 0, 2.2); + energyMomentumDiff[ANY_CLUSTER] = aida.histogram1D("Trident Analysis/All/Energy-Momentum Difference", 55, 0, 2.2); + invariantMass[ANY_CLUSTER] = aida.histogram1D("Trident Analysis/All/Invariant Mass", 240, 0.000, 0.120); + energySum2D[ANY_CLUSTER] = aida.histogram2D("Trident Analysis/All/2D Energy Sum", 55, 0, 1.1, 55, 0, 1.1); + momentumSum2D[ANY_CLUSTER] = aida.histogram2D("Trident Analysis/All/2D Momentum Sum", 55, 0, 1.1, 55, 0, 1.1); + position[ANY_CLUSTER] = aida.histogram2D("Trident Analysis/All/Track Cluster Position", 46, -23, 23, 11, -5.5, 5.5); + + // Instantiate the "has a cluster" plots. + tracks[HAS_CLUSTER] = aida.histogram1D("Trident Analysis/Cluster/Tracks in Event (All)", 7, -0.5, 6.5); + posTracks[HAS_CLUSTER] = aida.histogram1D("Trident Analysis/Cluster/Tracks in Event (Positive)", 7, -0.5, 6.5); + negTracks[HAS_CLUSTER] = aida.histogram1D("Trident Analysis/Cluster/Tracks in Event (Negative)", 7, -0.5, 6.5); + posMomentum[HAS_CLUSTER] = aida.histogram1D("Trident Analysis/Cluster/Momentum (Positive)", 110, 0, 1.1); + negMomentum[HAS_CLUSTER] = aida.histogram1D("Trident Analysis/Cluster/Momentum (Negative)", 110, 0, 1.1); + energySum[HAS_CLUSTER] = aida.histogram1D("Trident Analysis/Cluster/Energy Sum", 55, 0, 2.2); + momentumSum[HAS_CLUSTER] = aida.histogram1D("Trident Analysis/Cluster/Momentum Sum", 55, 0, 2.2); + energyMomentumDiff[HAS_CLUSTER] = aida.histogram1D("Trident Analysis/Cluster/Energy-Momentum Difference", 55, 0, 2.2); + invariantMass[HAS_CLUSTER] = aida.histogram1D("Trident Analysis/Cluster/Invariant Mass", 240, 0.000, 0.120); + energySum2D[HAS_CLUSTER] = aida.histogram2D("Trident Analysis/Cluster/2D Energy Sum", 55, 0, 1.1, 55, 0, 1.1); + momentumSum2D[HAS_CLUSTER] = aida.histogram2D("Trident Analysis/Cluster/2D Momentum Sum", 55, 0, 1.1, 55, 0, 1.1); + position[HAS_CLUSTER] = aida.histogram2D("Trident Analysis/Cluster/Track Cluster Position", 46, -23, 23, 11, -5.5, 5.5); + } + + @Override + public void endOfData() { + System.out.printf("Tracks (Candidate) :: %d%n", tracksCandidate); + System.out.printf("Tracks (Final State) :: %d%n", tracksFinalState); + System.out.printf("Cluster Tracks (Candidate) :: %d%n", tracksCandidateCluster); + System.out.printf("Cluster Tracks (Final State) :: %d%n", tracksFinalStateCluster); + } + + @Override + public void process(EventHeader event) { + // Check for final state particles. + if(event.hasCollection(ReconstructedParticle.class, finalStateCollectionName)) { + // Get the final state particles. + List<ReconstructedParticle> trackList = event.get(ReconstructedParticle.class, finalStateCollectionName); + + // Store the positive and negative tracks. + List<ReconstructedParticle> allTrackList = new ArrayList<ReconstructedParticle>(); + List<ReconstructedParticle> posTrackList = new ArrayList<ReconstructedParticle>(); + List<ReconstructedParticle> negTrackList = new ArrayList<ReconstructedParticle>(); + + // Store the same tracks, but limited to those with clusters. + List<ReconstructedParticle> allClusterTrackList = new ArrayList<ReconstructedParticle>(); + List<ReconstructedParticle> posClusterTrackList = new ArrayList<ReconstructedParticle>(); + List<ReconstructedParticle> negClusterTrackList = new ArrayList<ReconstructedParticle>(); + + // Iterate over the tracks and populate the lists. + for(ReconstructedParticle track : trackList) { + // Skip instances with no raw tracks. + if(track.getTracks().size() == 0) { continue; } + + // Add the cluster to the all track list. + allTrackList.add(track); + + // Track the number of cluster tracks. + tracksFinalState++; + if(!track.getClusters().isEmpty()) { + tracksFinalStateCluster++; + } + + // Process the track position plots. + Hep3Vector trackPosAtEcal = TrackUtils.extrapolateTrack(track.getTracks().get(0), 1394.5); + position[ANY_CLUSTER].fill(trackPosAtEcal.x(), trackPosAtEcal.y()); + + // Process the tracks based on charge. + if(track.getCharge() > 0) { + // Increment the counters and populate the momentum plots. + posTrackList.add(track); + posMomentum[ANY_CLUSTER].fill(track.getMomentum().magnitude()); + + // Repeat for the "has clusters" plots if necessary. + if(track.getClusters().size() > 0) { + // Increment the counters and populate the + // momentum plot. + posClusterTrackList.add(track); + allClusterTrackList.add(track); + posMomentum[HAS_CLUSTER].fill(track.getMomentum().magnitude()); + + // Populate the cluster position plot. + //int ix = track.getClusters().get(0).getCalorimeterHits().get(0).getIdentifierFieldValue("ix"); + //int iy = track.getClusters().get(0).getCalorimeterHits().get(0).getIdentifierFieldValue("iy"); + position[HAS_CLUSTER].fill(trackPosAtEcal.x(), trackPosAtEcal.y()); + } + } else if(track.getCharge() < 0) { + // Increment the counters and populate the momentum plots. + negTrackList.add(track); + negMomentum[ANY_CLUSTER].fill(track.getMomentum().magnitude()); + + // Repeat for the "has clusters" plots if necessary. + if(track.getClusters().size() > 0) { + // Increment the counters and populate the + // momentum plot. + negClusterTrackList.add(track); + allClusterTrackList.add(track); + negMomentum[HAS_CLUSTER].fill(track.getMomentum().magnitude()); + + // Populate the cluster position plot. + //int ix = track.getClusters().get(0).getCalorimeterHits().get(0).getIdentifierFieldValue("ix"); + //int iy = track.getClusters().get(0).getCalorimeterHits().get(0).getIdentifierFieldValue("iy"); + position[HAS_CLUSTER].fill(trackPosAtEcal.x(), trackPosAtEcal.y()); + } + } else { + if(track.getClusters().size() > 0) { + // Increment the counter. + allClusterTrackList.add(track); + + // Populate the cluster position plot. + //int ix = track.getClusters().get(0).getCalorimeterHits().get(0).getIdentifierFieldValue("ix"); + //int iy = track.getClusters().get(0).getCalorimeterHits().get(0).getIdentifierFieldValue("iy"); + position[HAS_CLUSTER].fill(trackPosAtEcal.x(), trackPosAtEcal.y()); + } + } + } + + // Populate the tracks per event plots. + tracks[ANY_CLUSTER].fill(allTrackList.size()); + tracks[HAS_CLUSTER].fill(allClusterTrackList.size()); + posTracks[ANY_CLUSTER].fill(posTrackList.size()); + posTracks[HAS_CLUSTER].fill(posClusterTrackList.size()); + negTracks[ANY_CLUSTER].fill(negTrackList.size()); + negTracks[HAS_CLUSTER].fill(negClusterTrackList.size()); + + /// Store track pairs. + List<ReconstructedParticle[]> pairList = new ArrayList<ReconstructedParticle[]>(); + List<ReconstructedParticle[]> pairClusterList = new ArrayList<ReconstructedParticle[]>(); + + // Form track pairs for all tracks. + for(ReconstructedParticle posTrack : posTrackList) { + for(ReconstructedParticle negTrack : negTrackList) { + pairList.add(new ReconstructedParticle[] { posTrack, negTrack }); + } + } + + // Form track pairs for cluster tracks. + for(ReconstructedParticle posTrack : posClusterTrackList) { + for(ReconstructedParticle negTrack : negClusterTrackList) { + pairClusterList.add(new ReconstructedParticle[] { posTrack, negTrack }); + } + } + + // Populate the track pair plots. + for(ReconstructedParticle[] pair : pairList) { + Hep3Vector pSum = new BasicHep3Vector( + pair[0].getMomentum().x() + pair[1].getMomentum().x(), + pair[0].getMomentum().y() + pair[1].getMomentum().y(), + pair[0].getMomentum().z() + pair[1].getMomentum().z()); + + energySum[ANY_CLUSTER].fill(pair[0].getEnergy() + pair[1].getEnergy()); + momentumSum[ANY_CLUSTER].fill(pSum.magnitude()); + energySum2D[ANY_CLUSTER].fill(pair[0].getEnergy(), pair[1].getEnergy()); + momentumSum2D[ANY_CLUSTER].fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); + energyMomentumDiff[ANY_CLUSTER].fill(Math.abs((pair[0].getEnergy() + pair[1].getEnergy()) - pSum.magnitude())); + } + + // Populate the cluster track pair plots. + for(ReconstructedParticle[] pair : pairClusterList) { + Hep3Vector pSum = new BasicHep3Vector( + pair[0].getMomentum().x() + pair[1].getMomentum().x(), + pair[0].getMomentum().y() + pair[1].getMomentum().y(), + pair[0].getMomentum().z() + pair[1].getMomentum().z()); + + energySum[HAS_CLUSTER].fill(pair[0].getEnergy() + pair[1].getEnergy()); + momentumSum[HAS_CLUSTER].fill(pSum.magnitude()); + energySum2D[HAS_CLUSTER].fill(pair[0].getEnergy(), pair[1].getEnergy()); + momentumSum2D[HAS_CLUSTER].fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); + energyMomentumDiff[HAS_CLUSTER].fill(Math.abs((pair[0].getEnergy() + pair[1].getEnergy()) - pSum.magnitude())); + } + } + + // Check for V0 candidates. + if(event.hasCollection(ReconstructedParticle.class, candidateCollectionName)) { + // Get the candidate particles. + List<ReconstructedParticle> trackList = event.get(ReconstructedParticle.class, candidateCollectionName); + + // Increment the counter. + tracksCandidate += trackList.size(); + + // Increment the counter for cluster tracks. + for(ReconstructedParticle track : trackList) { + // Populate the invariant mass plot. + invariantMass[ANY_CLUSTER].fill(track.getMass()); + + // Check for a cluster track. + if(track.getClusters().size() > 0) { + tracksCandidateCluster++; + invariantMass[HAS_CLUSTER].fill(track.getMass()); + } + } + } + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/TriggerPlotsModule.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/TriggerPlotsModule.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/TriggerPlotsModule.java Wed Mar 9 11:43:24 2016 @@ -8,8 +8,8 @@ import org.lcsim.util.aida.AIDA; public class TriggerPlotsModule { - // Define plots. - private AIDA aida = AIDA.defaultInstance(); + // Define plots. + private AIDA aida = AIDA.defaultInstance(); private IHistogram1D singleSeedEnergy; private IHistogram1D singleHitCount; private IHistogram1D singleTotalEnergy; @@ -25,43 +25,43 @@ private IHistogram2D pairDistribution; private IHistogram2D pairEnergySum2D; - public TriggerPlotsModule(String moduleName) { - singleSeedEnergy = aida.histogram1D(moduleName + " Trigger Plots/Singles Plots/Cluster Seed Energy", 176, 0.0, 1.1); - singleHitCount = aida.histogram1D(moduleName + " Trigger Plots/Singles Plots/Cluster Hit Count", 9, 0.5, 9.5); - singleTotalEnergy = aida.histogram1D(moduleName + " Trigger Plots/Singles Plots/Cluster Total Energy", 176, 0.0, 1.1); - singleDistribution = aida.histogram2D(moduleName + " Trigger Plots/Singles Plots/Cluster Seed", 46, -23.0, 23.0, 11, -5.5, 5.5); - pairSeedEnergy = aida.histogram1D(moduleName + " Trigger Plots/Pair Plots/Cluster Seed Energy", 176, 0.0, 1.1); - pairHitCount = aida.histogram1D(moduleName + " Trigger Plots/Pair Plots/Cluster Hit Count", 9, 0.5, 9.5); - pairTotalEnergy = aida.histogram1D(moduleName + " Trigger Plots/Pair Plots/Cluster Total Energy", 176, 0.0, 1.1); - pairEnergySum = aida.histogram1D(moduleName + " Trigger Plots/Pair Plots/Pair Energy Sum", 176, 0.0, 2.2); - pairEnergyDifference = aida.histogram1D(moduleName + " Trigger Plots/Pair Plots/Pair Energy Difference", 176, 0.0, 1.1); - pairCoplanarity = aida.histogram1D(moduleName + " Trigger Plots/Pair Plots/Pair Coplanarity", 180, 0.0, 180.0); - pairEnergySlope = aida.histogram1D(moduleName + " Trigger Plots/Pair Plots/Pair Energy Slope", 200, 0.0, 3.0); - pairDistribution = aida.histogram2D(moduleName + " Trigger Plots/Pair Plots/Cluster Seed", 46, -23.0, 23.0, 11, -5.5, 5.5); - pairEnergySum2D = aida.histogram2D(moduleName + " Trigger Plots/Pair Plots/Pair Energy Sum 2D", 110, 0.0, 1.1, 110, 0.0, 1.1); - } - - public void addCluster(Cluster cluster) { - singleSeedEnergy.fill(TriggerModule.getValueClusterSeedEnergy(cluster)); - singleHitCount.fill(TriggerModule.getValueClusterHitCount(cluster)); - singleTotalEnergy.fill(TriggerModule.getValueClusterTotalEnergy(cluster)); - singleDistribution.fill(TriggerModule.getClusterXIndex(cluster), TriggerModule.getClusterYIndex(cluster)); - } - - public void addClusterPair(Cluster[] pair) { - // Populate the singles plots. - for(Cluster cluster : pair) { - pairSeedEnergy.fill(TriggerModule.getValueClusterSeedEnergy(cluster)); - pairHitCount.fill(TriggerModule.getValueClusterHitCount(cluster)); - pairTotalEnergy.fill(TriggerModule.getValueClusterTotalEnergy(cluster)); - pairDistribution.fill(TriggerModule.getClusterXIndex(cluster), TriggerModule.getClusterYIndex(cluster)); - } - - // Populate the pair plots. - pairEnergySum.fill(TriggerModule.getValueEnergySum(pair)); - pairEnergyDifference.fill(TriggerModule.getValueEnergyDifference(pair)); - pairCoplanarity.fill(TriggerModule.getValueCoplanarity(pair)); - pairEnergySlope.fill(TriggerModule.getValueEnergySlope(pair, 0.0055)); - pairEnergySum2D.fill(TriggerModule.getValueClusterTotalEnergy(pair[0]), TriggerModule.getValueClusterTotalEnergy(pair[1])); - } + public TriggerPlotsModule(String moduleName) { + singleSeedEnergy = aida.histogram1D(moduleName + " Trigger Plots/Singles Plots/Cluster Seed Energy", 176, 0.0, 1.1); + singleHitCount = aida.histogram1D(moduleName + " Trigger Plots/Singles Plots/Cluster Hit Count", 9, 0.5, 9.5); + singleTotalEnergy = aida.histogram1D(moduleName + " Trigger Plots/Singles Plots/Cluster Total Energy", 176, 0.0, 1.1); + singleDistribution = aida.histogram2D(moduleName + " Trigger Plots/Singles Plots/Cluster Seed", 46, -23.0, 23.0, 11, -5.5, 5.5); + pairSeedEnergy = aida.histogram1D(moduleName + " Trigger Plots/Pair Plots/Cluster Seed Energy", 176, 0.0, 1.1); + pairHitCount = aida.histogram1D(moduleName + " Trigger Plots/Pair Plots/Cluster Hit Count", 9, 0.5, 9.5); + pairTotalEnergy = aida.histogram1D(moduleName + " Trigger Plots/Pair Plots/Cluster Total Energy", 176, 0.0, 1.1); + pairEnergySum = aida.histogram1D(moduleName + " Trigger Plots/Pair Plots/Pair Energy Sum", 176, 0.0, 2.2); + pairEnergyDifference = aida.histogram1D(moduleName + " Trigger Plots/Pair Plots/Pair Energy Difference", 176, 0.0, 1.1); + pairCoplanarity = aida.histogram1D(moduleName + " Trigger Plots/Pair Plots/Pair Coplanarity", 180, 0.0, 180.0); + pairEnergySlope = aida.histogram1D(moduleName + " Trigger Plots/Pair Plots/Pair Energy Slope", 200, 0.0, 3.0); + pairDistribution = aida.histogram2D(moduleName + " Trigger Plots/Pair Plots/Cluster Seed", 46, -23.0, 23.0, 11, -5.5, 5.5); + pairEnergySum2D = aida.histogram2D(moduleName + " Trigger Plots/Pair Plots/Pair Energy Sum 2D", 110, 0.0, 1.1, 110, 0.0, 1.1); + } + + public void addCluster(Cluster cluster) { + singleSeedEnergy.fill(TriggerModule.getValueClusterSeedEnergy(cluster)); + singleHitCount.fill(TriggerModule.getValueClusterHitCount(cluster)); + singleTotalEnergy.fill(TriggerModule.getValueClusterTotalEnergy(cluster)); + singleDistribution.fill(TriggerModule.getClusterXIndex(cluster), TriggerModule.getClusterYIndex(cluster)); + } + + public void addClusterPair(Cluster[] pair) { + // Populate the singles plots. + for(Cluster cluster : pair) { + pairSeedEnergy.fill(TriggerModule.getValueClusterSeedEnergy(cluster)); + pairHitCount.fill(TriggerModule.getValueClusterHitCount(cluster)); + pairTotalEnergy.fill(TriggerModule.getValueClusterTotalEnergy(cluster)); + pairDistribution.fill(TriggerModule.getClusterXIndex(cluster), TriggerModule.getClusterYIndex(cluster)); + } + + // Populate the pair plots. + pairEnergySum.fill(TriggerModule.getValueEnergySum(pair)); + pairEnergyDifference.fill(TriggerModule.getValueEnergyDifference(pair)); + pairCoplanarity.fill(TriggerModule.getValueCoplanarity(pair)); + pairEnergySlope.fill(TriggerModule.getValueEnergySlope(pair, 0.0055)); + pairEnergySum2D.fill(TriggerModule.getValueClusterTotalEnergy(pair[0]), TriggerModule.getValueClusterTotalEnergy(pair[1])); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/TriggerProcessAnalysisDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/TriggerProcessAnalysisDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/TriggerProcessAnalysisDriver.java Wed Mar 9 11:43:24 2016 @@ -21,768 +21,768 @@ import org.lcsim.util.aida.AIDA; public class TriggerProcessAnalysisDriver extends Driver { - private int eventsProcessed = 0; - private int møllersProcessed = 0; - private boolean checkSVT = false; - private int tridentsProcessed = 0; - private int gblMøllersProcessed = 0; - private int gblTridentsProcessed = 0; - private double timeCoincidence = 2.5; - private double elasticThreshold = 0.800; - private double møllerLowerRange = 0.900; - private double møllerUpperRange = 1.200; - private AIDA aida = AIDA.defaultInstance(); - private boolean checkTriggerTimeWindow = false; - private String clusterCollectionName = "EcalClustersCorr"; - private String particleCollectionName = "FinalStateParticles"; - - // Define trident cluster-track matched condition plots. - private IHistogram1D trctmInvariantMass = aida.histogram1D("Tridents CTMatched/Invariant Mass", 140, 0.0, 0.070); - private IHistogram1D trctmInstancesInEvent = aida.histogram1D("Tridents CTMatched/Instances in Event", 9, 0.5, 9.5); - private IHistogram1D trctmEnergySum1D = aida.histogram1D("Tridents CTMatched/Cluster Energy Sum", 150, 0.000, 1.500); - private IHistogram1D trctmMomentumSum1D = aida.histogram1D("Tridents CTMatched/Track Momentum Sum", 150, 0.000, 1.500); - private IHistogram1D trctmElectronEnergy = aida.histogram1D("Tridents CTMatched/Electron Cluster Energy", 150, 0.000, 1.500); - private IHistogram1D trctmElectronMomentum = aida.histogram1D("Tridents CTMatched/Electron Track Momentum", 150, 0.000, 1.500); - private IHistogram1D trctmPositronEnergy = aida.histogram1D("Tridents CTMatched/Positron Cluster Energy", 150, 0.000, 1.500); - private IHistogram1D trctmPositronMomentum = aida.histogram1D("Tridents CTMatched/Positron Track Momentum", 150, 0.000, 1.500); - private IHistogram1D trctmTimeCoincidence = aida.histogram1D("Tridents CTMatched/Time Coincidence", 100, -4, 4); - private IHistogram2D trctmClusterPosition = aida.histogram2D("Tridents CTMatched/Cluster Seed Position", 46, -23, 23, 11, -5.5, 5.5); - private IHistogram2D trctmEnergySum2D = aida.histogram2D("Tridents CTMatched/Cluster Energy Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); - private IHistogram2D trctmTrackPosition = aida.histogram2D("Tridents CTMatched/Extrapolated Track Position", 200, -400, 400, 55, -110, 110); - private IHistogram2D trctmMomentumSum2D = aida.histogram2D("Tridents CTMatched/Track Momentum Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); - private IHistogram2D trctmESumCoplanarity = aida.histogram2D("Tridents CTMatched/Cluster Energy Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); - private IHistogram2D trctmPSumCoplanarity = aida.histogram2D("Tridents CTMatched/Track Momentum Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); - - // Define the Møller cluster-track matched condition plots. - private IHistogram1D møctmInvariantMass = aida.histogram1D("Møller CTMatched/Invariant Mass", 140, 0.0, 0.070); - private IHistogram1D møctmInstancesInEvent = aida.histogram1D("Møller CTMatched/Instances in Event", 9, 0.5, 9.5); - private IHistogram1D møctmEnergySum1D = aida.histogram1D("Møller CTMatched/Cluster Energy Sum", 150, 0.000, 1.500); - private IHistogram1D møctmMomentumSum1D = aida.histogram1D("Møller CTMatched/Track Momentum Sum", 150, 0.000, 1.500); - private IHistogram1D møctmElectronEnergy = aida.histogram1D("Møller CTMatched/Electron Cluster Energy", 150, 0.000, 1.500); - private IHistogram1D møctmElectronMomentum = aida.histogram1D("Møller CTMatched/Electron Track Momentum", 150, 0.000, 1.500); - private IHistogram1D møctmTimeCoincidence = aida.histogram1D("Møller CTMatched/Time Coincidence", 100, -4, 4); - private IHistogram2D møctmClusterPosition = aida.histogram2D("Møller CTMatched/Cluster Seed Position", 46, -23, 23, 11, -5.5, 5.5); - private IHistogram2D møctmEnergySum2D = aida.histogram2D("Møller CTMatched/Cluster Energy Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); - private IHistogram2D møctmTrackPosition = aida.histogram2D("Møller CTMatched/Extrapolated Track Position", 200, -400, 400, 55, -110, 110); - private IHistogram2D møctmMomentumSum2D = aida.histogram2D("Møller CTMatched/Track Momentum Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); - private IHistogram2D møctmESumCoplanarity = aida.histogram2D("Møller CTMatched/Cluster Energy Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); - private IHistogram2D møctmPSumCoplanarity = aida.histogram2D("Møller CTMatched/Track Momentum Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); - - // Define the Møller track-only condition plots. - private IHistogram1D møgblTimeCoincidence = aida.histogram1D("Møller Track-Only/Time Coincidence", 100, -4, 4); - private IHistogram1D møgblInvariantMass = aida.histogram1D("Møller Track-Only/Invariant Mass", 140, 0.0, 0.070); - private IHistogram1D møgblInstancesInEvent = aida.histogram1D("Møller Track-Only/Instances in Event", 9, 0.5, 9.5); - private IHistogram1D møgblMomentumSum1D = aida.histogram1D("Møller Track-Only/Track Momentum Sum", 150, 0.000, 1.500); - private IHistogram1D møgblElectronMomentum = aida.histogram1D("Møller Track-Only/Electron Track Momentum", 150, 0.000, 1.500); - private IHistogram2D møgblTrackPosition = aida.histogram2D("Møller Track-Only/Extrapolated Track Position", 200, -400, 400, 55, -110, 110); - private IHistogram2D møgblMomentumSum2D = aida.histogram2D("Møller Track-Only/Track Momentum Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); - private IHistogram2D møgblPSumCoplanarity = aida.histogram2D("Møller Track-Only/Track Momentum Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); - - // Define the GBL trident condition plots. - private IHistogram1D trgblInvariantMass = aida.histogram1D("Tridents Track-Only/Invariant Mass", 140, 0.0, 0.070); - private IHistogram1D trgblInstancesInEvent = aida.histogram1D("Tridents Track-Only/Instances in Event", 9, 0.5, 9.5); - private IHistogram1D trgblMomentumSum1D = aida.histogram1D("Tridents Track-Only/Track Momentum Sum", 150, 0.000, 1.500); - private IHistogram1D trgblElectronMomentum = aida.histogram1D("Tridents Track-Only/Electron Track Momentum", 150, 0.000, 1.500); - private IHistogram1D trgblPositronMomentum = aida.histogram1D("Tridents Track-Only/Positron Track Momentum", 150, 0.000, 1.500); - private IHistogram1D trgblTimeCoincidence = aida.histogram1D("Tridents Track-Only/Time Coincidence", 100, -4, 4); - private IHistogram2D trgblTrackPosition = aida.histogram2D("Tridents Track-Only/Extrapolated Track Position", 200, -400, 400, 55, -110, 110); - private IHistogram2D trgblMomentumSum2D = aida.histogram2D("Tridents Track-Only/Track Momentum Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); - private IHistogram2D trgblPSumCoplanarity = aida.histogram2D("Tridents Track-Only/Track Momentum Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); - - @Override - public void endOfData() { - // Calculate the scaling factor for Hertz. - double scale = 19000.0 / eventsProcessed; - - System.out.println("Processed " + eventsProcessed + " events."); - System.out.println("Processed " + møllersProcessed + " Møller events"); - System.out.println("\tAcceptance :: " + (100.0 * møllersProcessed / eventsProcessed) + "%"); - System.out.println("\tRate :: " + (møllersProcessed * scale) + " Hz"); - - System.out.println("Processed " + tridentsProcessed + " trident events"); - System.out.println("\tAcceptance :: " + (100.0 * tridentsProcessed / eventsProcessed) + "%"); - System.out.println("\tRate :: " + (tridentsProcessed * scale) + " Hz"); - - System.out.println("Processed " + gblMøllersProcessed + " track-only Møller events"); - System.out.println("\tAcceptance :: " + (100.0 * gblMøllersProcessed / eventsProcessed) + "%"); - System.out.println("\tRate :: " + (gblMøllersProcessed * scale) + " Hz"); - - System.out.println("Processed " + gblTridentsProcessed + " Rafo trident events"); - System.out.println("\tAcceptance :: " + (100.0 * gblTridentsProcessed / eventsProcessed) + "%"); - System.out.println("\tRate :: " + (gblTridentsProcessed * scale) + " Hz"); - } - - @Override - public void process(EventHeader event) { - // Check whether the SVT was active in this event and, if so, - // skip it. This can be disabled through the steering file for - // Monte Carlo data, where the "SVT" is always active. - if(checkSVT) { - final String[] flagNames = { "svt_bias_good", "svt_burstmode_noise_good", "svt_position_good" }; - boolean svtGood = true; - for(int i = 0; i < flagNames.length; i++) { - int[] flag = event.getIntegerParameters().get(flagNames[i]); - if(flag == null || flag[0] == 0) { - svtGood = false; - } - } - if(!svtGood) { return; } - } + private int eventsProcessed = 0; + private int møllersProcessed = 0; + private boolean checkSVT = false; + private int tridentsProcessed = 0; + private int gblMøllersProcessed = 0; + private int gblTridentsProcessed = 0; + private double timeCoincidence = 2.5; + private double elasticThreshold = 0.800; + private double møllerLowerRange = 0.900; + private double møllerUpperRange = 1.200; + private AIDA aida = AIDA.defaultInstance(); + private boolean checkTriggerTimeWindow = false; + private String clusterCollectionName = "EcalClustersCorr"; + private String particleCollectionName = "FinalStateParticles"; + + // Define trident cluster-track matched condition plots. + private IHistogram1D trctmInvariantMass = aida.histogram1D("Tridents CTMatched/Invariant Mass", 140, 0.0, 0.070); + private IHistogram1D trctmInstancesInEvent = aida.histogram1D("Tridents CTMatched/Instances in Event", 9, 0.5, 9.5); + private IHistogram1D trctmEnergySum1D = aida.histogram1D("Tridents CTMatched/Cluster Energy Sum", 150, 0.000, 1.500); + private IHistogram1D trctmMomentumSum1D = aida.histogram1D("Tridents CTMatched/Track Momentum Sum", 150, 0.000, 1.500); + private IHistogram1D trctmElectronEnergy = aida.histogram1D("Tridents CTMatched/Electron Cluster Energy", 150, 0.000, 1.500); + private IHistogram1D trctmElectronMomentum = aida.histogram1D("Tridents CTMatched/Electron Track Momentum", 150, 0.000, 1.500); + private IHistogram1D trctmPositronEnergy = aida.histogram1D("Tridents CTMatched/Positron Cluster Energy", 150, 0.000, 1.500); + private IHistogram1D trctmPositronMomentum = aida.histogram1D("Tridents CTMatched/Positron Track Momentum", 150, 0.000, 1.500); + private IHistogram1D trctmTimeCoincidence = aida.histogram1D("Tridents CTMatched/Time Coincidence", 100, -4, 4); + private IHistogram2D trctmClusterPosition = aida.histogram2D("Tridents CTMatched/Cluster Seed Position", 46, -23, 23, 11, -5.5, 5.5); + private IHistogram2D trctmEnergySum2D = aida.histogram2D("Tridents CTMatched/Cluster Energy Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); + private IHistogram2D trctmTrackPosition = aida.histogram2D("Tridents CTMatched/Extrapolated Track Position", 200, -400, 400, 55, -110, 110); + private IHistogram2D trctmMomentumSum2D = aida.histogram2D("Tridents CTMatched/Track Momentum Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); + private IHistogram2D trctmESumCoplanarity = aida.histogram2D("Tridents CTMatched/Cluster Energy Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); + private IHistogram2D trctmPSumCoplanarity = aida.histogram2D("Tridents CTMatched/Track Momentum Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); + + // Define the Møller cluster-track matched condition plots. + private IHistogram1D møctmInvariantMass = aida.histogram1D("Møller CTMatched/Invariant Mass", 140, 0.0, 0.070); + private IHistogram1D møctmInstancesInEvent = aida.histogram1D("Møller CTMatched/Instances in Event", 9, 0.5, 9.5); + private IHistogram1D møctmEnergySum1D = aida.histogram1D("Møller CTMatched/Cluster Energy Sum", 150, 0.000, 1.500); + private IHistogram1D møctmMomentumSum1D = aida.histogram1D("Møller CTMatched/Track Momentum Sum", 150, 0.000, 1.500); + private IHistogram1D møctmElectronEnergy = aida.histogram1D("Møller CTMatched/Electron Cluster Energy", 150, 0.000, 1.500); + private IHistogram1D møctmElectronMomentum = aida.histogram1D("Møller CTMatched/Electron Track Momentum", 150, 0.000, 1.500); + private IHistogram1D møctmTimeCoincidence = aida.histogram1D("Møller CTMatched/Time Coincidence", 100, -4, 4); + private IHistogram2D møctmClusterPosition = aida.histogram2D("Møller CTMatched/Cluster Seed Position", 46, -23, 23, 11, -5.5, 5.5); + private IHistogram2D møctmEnergySum2D = aida.histogram2D("Møller CTMatched/Cluster Energy Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); + private IHistogram2D møctmTrackPosition = aida.histogram2D("Møller CTMatched/Extrapolated Track Position", 200, -400, 400, 55, -110, 110); + private IHistogram2D møctmMomentumSum2D = aida.histogram2D("Møller CTMatched/Track Momentum Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); + private IHistogram2D møctmESumCoplanarity = aida.histogram2D("Møller CTMatched/Cluster Energy Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); + private IHistogram2D møctmPSumCoplanarity = aida.histogram2D("Møller CTMatched/Track Momentum Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); + + // Define the Møller track-only condition plots. + private IHistogram1D møgblTimeCoincidence = aida.histogram1D("Møller Track-Only/Time Coincidence", 100, -4, 4); + private IHistogram1D møgblInvariantMass = aida.histogram1D("Møller Track-Only/Invariant Mass", 140, 0.0, 0.070); + private IHistogram1D møgblInstancesInEvent = aida.histogram1D("Møller Track-Only/Instances in Event", 9, 0.5, 9.5); + private IHistogram1D møgblMomentumSum1D = aida.histogram1D("Møller Track-Only/Track Momentum Sum", 150, 0.000, 1.500); + private IHistogram1D møgblElectronMomentum = aida.histogram1D("Møller Track-Only/Electron Track Momentum", 150, 0.000, 1.500); + private IHistogram2D møgblTrackPosition = aida.histogram2D("Møller Track-Only/Extrapolated Track Position", 200, -400, 400, 55, -110, 110); + private IHistogram2D møgblMomentumSum2D = aida.histogram2D("Møller Track-Only/Track Momentum Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); + private IHistogram2D møgblPSumCoplanarity = aida.histogram2D("Møller Track-Only/Track Momentum Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); + + // Define the GBL trident condition plots. + private IHistogram1D trgblInvariantMass = aida.histogram1D("Tridents Track-Only/Invariant Mass", 140, 0.0, 0.070); + private IHistogram1D trgblInstancesInEvent = aida.histogram1D("Tridents Track-Only/Instances in Event", 9, 0.5, 9.5); + private IHistogram1D trgblMomentumSum1D = aida.histogram1D("Tridents Track-Only/Track Momentum Sum", 150, 0.000, 1.500); + private IHistogram1D trgblElectronMomentum = aida.histogram1D("Tridents Track-Only/Electron Track Momentum", 150, 0.000, 1.500); + private IHistogram1D trgblPositronMomentum = aida.histogram1D("Tridents Track-Only/Positron Track Momentum", 150, 0.000, 1.500); + private IHistogram1D trgblTimeCoincidence = aida.histogram1D("Tridents Track-Only/Time Coincidence", 100, -4, 4); + private IHistogram2D trgblTrackPosition = aida.histogram2D("Tridents Track-Only/Extrapolated Track Position", 200, -400, 400, 55, -110, 110); + private IHistogram2D trgblMomentumSum2D = aida.histogram2D("Tridents Track-Only/Track Momentum Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); + private IHistogram2D trgblPSumCoplanarity = aida.histogram2D("Tridents Track-Only/Track Momentum Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); + + @Override + public void endOfData() { + // Calculate the scaling factor for Hertz. + double scale = 19000.0 / eventsProcessed; + + System.out.println("Processed " + eventsProcessed + " events."); + System.out.println("Processed " + møllersProcessed + " Møller events"); + System.out.println("\tAcceptance :: " + (100.0 * møllersProcessed / eventsProcessed) + "%"); + System.out.println("\tRate :: " + (møllersProcessed * scale) + " Hz"); + + System.out.println("Processed " + tridentsProcessed + " trident events"); + System.out.println("\tAcceptance :: " + (100.0 * tridentsProcessed / eventsProcessed) + "%"); + System.out.println("\tRate :: " + (tridentsProcessed * scale) + " Hz"); + + System.out.println("Processed " + gblMøllersProcessed + " track-only Møller events"); + System.out.println("\tAcceptance :: " + (100.0 * gblMøllersProcessed / eventsProcessed) + "%"); + System.out.println("\tRate :: " + (gblMøllersProcessed * scale) + " Hz"); + + System.out.println("Processed " + gblTridentsProcessed + " Rafo trident events"); + System.out.println("\tAcceptance :: " + (100.0 * gblTridentsProcessed / eventsProcessed) + "%"); + System.out.println("\tRate :: " + (gblTridentsProcessed * scale) + " Hz"); + } + + @Override + public void process(EventHeader event) { + // Check whether the SVT was active in this event and, if so, + // skip it. This can be disabled through the steering file for + // Monte Carlo data, where the "SVT" is always active. + if(checkSVT) { + final String[] flagNames = { "svt_bias_good", "svt_burstmode_noise_good", "svt_position_good" }; + boolean svtGood = true; + for(int i = 0; i < flagNames.length; i++) { + int[] flag = event.getIntegerParameters().get(flagNames[i]); + if(flag == null || flag[0] == 0) { + svtGood = false; + } + } + if(!svtGood) { return; } + } // Track the number of events with good SVT. eventsProcessed++; - // Check if the event has a collection of tracks. If it exists, + // Check if the event has a collection of tracks. If it exists, // extract it. Otherwise, skip the event. - if(!event.hasCollection(ReconstructedParticle.class, particleCollectionName)) { - return; - } - List<ReconstructedParticle> trackList = event.get(ReconstructedParticle.class, particleCollectionName); - - // Check if the event has a collection of clusters. If it - // exists, extract it. Otherwise, skip the event. - if(!event.hasCollection(Cluster.class, clusterCollectionName)) { - return; - } - List<Cluster> clusterList = event.get(Cluster.class, clusterCollectionName); - - // Get cluster-track matched top/bottom pairs. - List<ReconstructedParticle[]> gblMatchedPairs = getTopBottomTracksGBL(trackList); - List<ReconstructedParticle[]> ctMatchedPairs = getTopBottomTracksCTMatched(trackList); - - System.out.println("CTM Pairs :: " + ctMatchedPairs.size()); - System.out.println("GBL Pairs :: " + gblMatchedPairs.size()); - - // Get the trident and Møller tracks for the matched track - // and cluster pair condition sets. - List<ReconstructedParticle[]> møllers = getMøllerTracksCTMatched(ctMatchedPairs); - List<ReconstructedParticle[]> møllersGBL = getMøllerTracksGBL(gblMatchedPairs, event); - List<ReconstructedParticle[]> tridents = getTridentTracksCTMatched(ctMatchedPairs); - List<ReconstructedParticle[]> tridentsGBL = getTridentClustersGBL(gblMatchedPairs, TriggerModule.getTopBottomPairs(clusterList, Cluster.class), event); - - // Track how many events had tridents and Møllers. - if(!møllers.isEmpty()) { møllersProcessed++; } - if(!tridents.isEmpty()) { tridentsProcessed++; } - if(!møllersGBL.isEmpty()) { gblMøllersProcessed++; } - if(!tridentsGBL.isEmpty()) { gblTridentsProcessed++; } - - // Produce Møller cluster-track matched plots. - møctmInstancesInEvent.fill(møllers.size()); - for(ReconstructedParticle[] pair : møllers) { - // Get the track clusters. - Track[] tracks = { pair[0].getTracks().get(0), pair[1].getTracks().get(0) }; - Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; - - // Populate the cluster plots. - møctmElectronEnergy.fill(trackClusters[0].getEnergy()); - møctmElectronEnergy.fill(trackClusters[1].getEnergy()); - møctmEnergySum1D.fill(TriggerModule.getValueEnergySum(trackClusters)); - møctmEnergySum2D.fill(trackClusters[0].getEnergy(), trackClusters[1].getEnergy()); - møctmESumCoplanarity.fill(TriggerModule.getValueEnergySum(trackClusters), getCalculatedCoplanarity(trackClusters)); - møctmTimeCoincidence.fill(TriggerModule.getClusterTime(trackClusters[0]) - TriggerModule.getClusterTime(trackClusters[1])); - møctmClusterPosition.fill(TriggerModule.getClusterXIndex(trackClusters[0]), TriggerModule.getClusterYIndex(trackClusters[0])); - møctmClusterPosition.fill(TriggerModule.getClusterXIndex(trackClusters[1]), TriggerModule.getClusterYIndex(trackClusters[1])); - - // Populate the momentum plots. - møctmInvariantMass.fill(getInvariantMass(pair)); - møctmElectronMomentum.fill(pair[0].getMomentum().magnitude()); - møctmElectronMomentum.fill(pair[1].getMomentum().magnitude()); - møctmMomentumSum1D.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude()); - møctmMomentumSum2D.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); - møctmTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[0]).x(), TrackUtils.getTrackPositionAtEcal(tracks[0]).y()); - møctmTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[1]).x(), TrackUtils.getTrackPositionAtEcal(tracks[1]).y()); - møctmPSumCoplanarity.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(), - getCalculatedCoplanarity(new Track[] { pair[0].getTracks().get(0), pair[1].getTracks().get(0) })); - } - - // Produce trident cluster-track matched plots. - trctmInstancesInEvent.fill(tridents.size()); - for(ReconstructedParticle[] pair : tridents) { - // Get the electron and positron tracks. - ReconstructedParticle electronTrack = pair[pair[0].getCharge() < 0 ? 0 : 1]; - ReconstructedParticle positronTrack = pair[pair[0].getCharge() > 0 ? 0 : 1]; - - // Get the track clusters. - Cluster electronCluster = electronTrack.getClusters().get(0); - Cluster positronCluster = positronTrack.getClusters().get(0); - Track[] tracks = { pair[0].getTracks().get(0), pair[1].getTracks().get(0) }; - Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; - - // Populate the cluster plots. - trctmElectronEnergy.fill(electronCluster.getEnergy()); - trctmPositronEnergy.fill(positronCluster.getEnergy()); - trctmEnergySum2D.fill(pair[0].getEnergy(), pair[1].getEnergy()); - trctmEnergySum1D.fill(TriggerModule.getValueEnergySum(trackClusters)); - trctmESumCoplanarity.fill(TriggerModule.getValueEnergySum(trackClusters), getCalculatedCoplanarity(trackClusters)); - trctmTimeCoincidence.fill(TriggerModule.getClusterTime(trackClusters[0]) - TriggerModule.getClusterTime(trackClusters[1])); - trctmClusterPosition.fill(TriggerModule.getClusterXIndex(trackClusters[0]), TriggerModule.getClusterYIndex(trackClusters[0])); - trctmClusterPosition.fill(TriggerModule.getClusterXIndex(trackClusters[1]), TriggerModule.getClusterYIndex(trackClusters[1])); - - // Populate the momentum plots. - trctmInvariantMass.fill(getInvariantMass(pair)); - trctmElectronMomentum.fill(electronTrack.getMomentum().magnitude()); - trctmPositronMomentum.fill(positronTrack.getMomentum().magnitude()); - trctmMomentumSum1D.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude()); - trctmMomentumSum2D.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); - trctmTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[0]).x(), TrackUtils.getTrackPositionAtEcal(tracks[0]).y()); - trctmTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[1]).x(), TrackUtils.getTrackPositionAtEcal(tracks[1]).y()); - trctmPSumCoplanarity.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(), - getCalculatedCoplanarity(new Track[] { pair[0].getTracks().get(0), pair[1].getTracks().get(0) })); - } - - // Produce the Møller track-only plots. - møgblInstancesInEvent.fill(møllersGBL.size()); - RelationalTable<?, ?> hitToStrips = TrackUtils.getHitToStripsTable(event); - RelationalTable<?, ?> hitToRotated = TrackUtils.getHitToRotatedTable(event); - for(ReconstructedParticle pair[] : møllersGBL) { - // Get the tracks and track times. - Track[] tracks = { pair[0].getTracks().get(0), pair[1].getTracks().get(0) }; - double times[] = { - TrackUtils.getTrackTime(tracks[0], hitToStrips, hitToRotated), - TrackUtils.getTrackTime(tracks[1], hitToStrips, hitToRotated) - }; - - // Fill the plots. - møgblTimeCoincidence.fill(times[0] - times[1]); - møgblInvariantMass.fill(getInvariantMass(pair)); - møgblElectronMomentum.fill(pair[0].getMomentum().magnitude()); - møgblElectronMomentum.fill(pair[1].getMomentum().magnitude()); - møgblMomentumSum1D.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude()); - møgblMomentumSum2D.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); - møgblTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[0]).x(), TrackUtils.getTrackPositionAtEcal(tracks[0]).y()); - møgblTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[1]).x(), TrackUtils.getTrackPositionAtEcal(tracks[1]).y()); - møgblPSumCoplanarity.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(), - getCalculatedCoplanarity(new Track[] { pair[0].getTracks().get(0), pair[1].getTracks().get(0) })); - } - - // Produce track-only trident plots. - trgblInstancesInEvent.fill(tridentsGBL.size()); - for(ReconstructedParticle[] pair : tridentsGBL) { - // Get the tracks and track times. - Track[] tracks = { pair[0].getTracks().get(0), pair[1].getTracks().get(0) }; - double times[] = { - TrackUtils.getTrackTime(tracks[0], hitToStrips, hitToRotated), - TrackUtils.getTrackTime(tracks[1], hitToStrips, hitToRotated) - }; - - // Get the positron and the electron. - ReconstructedParticle positron = pair[0].getCharge() > 0 ? pair[0] : pair[1]; - ReconstructedParticle electron = pair[0].getCharge() < 0 ? pair[0] : pair[1]; - - // Fill the plots. - trgblTimeCoincidence.fill(times[0] - times[1]); - trgblInvariantMass.fill(getInvariantMass(pair)); - trgblElectronMomentum.fill(electron.getMomentum().magnitude()); - trgblPositronMomentum.fill(positron.getMomentum().magnitude()); - trgblMomentumSum1D.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude()); - trgblMomentumSum2D.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); - trgblTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[0]).x(), TrackUtils.getTrackPositionAtEcal(tracks[0]).y()); - trgblTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[1]).x(), TrackUtils.getTrackPositionAtEcal(tracks[1]).y()); - trgblPSumCoplanarity.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(), - getCalculatedCoplanarity(new Track[] { pair[0].getTracks().get(0), pair[1].getTracks().get(0) })); - } - } - - public void setCheckSVT(boolean state) { - checkSVT = state; - } - - public void setCheckTriggerTimeWindow(boolean state) { - checkTriggerTimeWindow = state; - } - - /** - * Gets a list of all possible GBL top/bottom track pairs. These - * tracks are not guaranteed to have a matched cluster. - * @param trackList - A list of all possible tracks. - * @return Returns a list of track pairs. - */ - private static final List<ReconstructedParticle[]> getTopBottomTracksGBL(List<ReconstructedParticle> trackList) { - // Separate the tracks into top and bottom tracks based on - // the value of tan(Î). Use only GBL tracks to avoid track - // duplication. - List<ReconstructedParticle> topTracks = new ArrayList<ReconstructedParticle>(); - List<ReconstructedParticle> botTracks = new ArrayList<ReconstructedParticle>(); - trackLoop: - for(ReconstructedParticle track : trackList) { - // Require that the ReconstructedParticle contain an actual - // Track object. - if(track.getTracks().isEmpty()) { - continue trackLoop; - } - - // Ignore tracks that are not GBL tracks. - if(!TrackType.isGBL(track.getType())) { - continue trackLoop; - } - - // If the above tests pass, the ReconstructedParticle has - // a track and is also a GBL track. Separate it into either - // a top or a bottom track based on its tan(Î) value. - if(track.getTracks().get(0).getTrackStates().get(0).getTanLambda() > 0) { - topTracks.add(track); - } else { - botTracks.add(track); - } - } - - // Form all top/bottom pairs with the unique tracks. - List<ReconstructedParticle[]> pairList = new ArrayList<ReconstructedParticle[]>(); - for(ReconstructedParticle topTrack : topTracks) { - for(ReconstructedParticle botTrack : botTracks) { - pairList.add(new ReconstructedParticle[] { topTrack, botTrack }); - } - } - - // Return the result. - return pairList; - } - - /** - * Produces pairs of tracks. The track pairs are required to be - * matched to a cluster and the associated clusters must form a - * top/bottom pair. If more than one track points to the same - * cluster, only the first track is retained. - * @param trackList - A list of all tracks. - * @return Returns a list of track pairs meeting the aforementioned - * conditions. - */ - private static final List<ReconstructedParticle[]> getTopBottomTracksCTMatched(List<ReconstructedParticle> trackList) { - // Track clusters that have already been seen to prevent clusters - // that have duplicate tracks from reappearing. - Set<Cluster> clusterSet = new HashSet<Cluster>(); - - // Separate the tracks into top and bottom tracks based on - // the track cluster. Filter out tracks with no clusters. - List<ReconstructedParticle> topTracks = new ArrayList<ReconstructedParticle>(); - List<ReconstructedParticle> botTracks = new ArrayList<ReconstructedParticle>(); - trackLoop: - for(ReconstructedParticle track : trackList) { - // Check if the track has a cluster. If not, skip it. - if(track.getClusters().isEmpty()) { - continue trackLoop; - } - - // If the track doesn't have actual tracks, skip it. - if(track.getTracks().isEmpty()) { - continue trackLoop; - } - - // Check if the track cluster has already seen. - Cluster trackCluster = track.getClusters().get(0); - if(clusterSet.contains(trackCluster)) { - continue trackLoop; - } - - // If the track has a unique cluster, add it to the proper - // list based on the cluster y-index. - clusterSet.add(trackCluster); - if(TriggerModule.getClusterYIndex(trackCluster) > 0) { - topTracks.add(track); - } else { - botTracks.add(track); - } - } - - // Form all top/bottom pairs with the unique tracks. - List<ReconstructedParticle[]> pairList = new ArrayList<ReconstructedParticle[]>(); - for(ReconstructedParticle topTrack : topTracks) { - for(ReconstructedParticle botTrack : botTracks) { - pairList.add(new ReconstructedParticle[] { topTrack, botTrack }); - } - } - - // Return the result. - return pairList; - } - - private final List<ReconstructedParticle[]> getTridentClustersGBL(List<ReconstructedParticle[]> pairList, List<Cluster[]> clusterList, EventHeader event) { - // Store the set of track pairs that meet the trident condition. - List<ReconstructedParticle[]> tridentTracks = new ArrayList<ReconstructedParticle[]>(); - - // Extract track relational tables from the event object. - RelationalTable<?, ?> hitToStrips = TrackUtils.getHitToStripsTable(event); - RelationalTable<?, ?> hitToRotated = TrackUtils.getHitToRotatedTable(event); - - // Tracks will not be considered for trident analysis unless there - // is at least one top/bottom cluster pair within the time window. - boolean passesClusterCondition = false; - tridentClusterLoop: - for(Cluster[] pair : clusterList) { - // Ignore clusters that are too far apart temporally. - if(TriggerModule.getValueTimeCoincidence(pair) > timeCoincidence) { - continue tridentClusterLoop; - } - - // Require that the cluster pair be top/bottom. - boolean hasTop = TriggerModule.getClusterYIndex(pair[0]) > 0 || TriggerModule.getClusterYIndex(pair[1]) > 0; - boolean hasBot = TriggerModule.getClusterYIndex(pair[0]) < 0 || TriggerModule.getClusterYIndex(pair[1]) < 0; - if(!hasTop || !hasBot) { - continue tridentClusterLoop; - } - - // If the cluster passes, mark that it has done so and skip - // the rest. Only one pair need pass. - passesClusterCondition = true; - break tridentClusterLoop; - } - - // If no cluster pair passed the cluster condition, no tracks - // are allowed to pass either. - if(!passesClusterCondition) { - return tridentTracks; - } - - // Next, check the track pair list. A track pair must have a - // positive and a negative track and must also be within the - // time coincidence window. - tridentTrackLoop: - for(ReconstructedParticle[] pair : pairList) { - // Check that there is at least one positive and one negative - // track in the pair. - boolean hasPositive = pair[0].getCharge() > 0 || pair[1].getCharge() > 0; - boolean hasNegative = pair[0].getCharge() < 0 || pair[1].getCharge() < 0; - if(!hasPositive || !hasNegative) { - break tridentTrackLoop; - } - - // Check that the track pair passes the time cut. - double times[] = { - TrackUtils.getTrackTime(pair[0].getTracks().get(0), hitToStrips, hitToRotated), - TrackUtils.getTrackTime(pair[1].getTracks().get(0), hitToStrips, hitToRotated) - }; - - if(Math.abs(times[0] - times[1]) > timeCoincidence) { - continue tridentTrackLoop; - } - - // Require that the negative track have less than the - // elastic threshold momentum to exclude elastic electrons. - if(pair[0].getCharge() < 0 && pair[0].getMomentum().magnitude() > elasticThreshold - || pair[1].getCharge() < 0 && pair[1].getMomentum().magnitude() > elasticThreshold) { - continue tridentTrackLoop; - } - - // If the track passes both, it is considered a trident pair. - tridentTracks.add(pair); - } - - // Return the resultant pairs. - return tridentTracks; - } - - /** - * Gets a list track pairs that meet the trident condition defined - * using tracks with matched calorimeter clusters. A pair meets the - * cluster/track matched trident condition is it meets the following: - * <ul><li>Both tracks have matched clusters.</li> - * <li>Has one positive track.</li> - * <li>Has one negative track.</li> - * <li>Clusters have a time coincidence of 2.5 ns or less.</li> - * <li>The electron momentum is below 900 MeV.</li></ul> - * @param pairList - A <code>List</code> collection of parameterized - * type <code>ReconstructedParticle[]</code> containing all valid - * top/bottom pairs of tracks with matched clusters. These will be - * tested to see if they meet the process criteria. - * @return Returns a list containing pairs of tracks that meet the - * trident condition. - */ - private final List<ReconstructedParticle[]> getTridentTracksCTMatched(List<ReconstructedParticle[]> pairList) { - // Store the set of track pairs that meet the trident condition. - List<ReconstructedParticle[]> tridentTracks = new ArrayList<ReconstructedParticle[]>(); - - // Loop over the filtered pair list and apply the trident - // condition test. - tridentLoop: - for(ReconstructedParticle[] pair : pairList) { - // There must be one positive and one negative track. - ReconstructedParticle electron = null; - ReconstructedParticle positron = null; - if(pair[0].getCharge() > 0) { positron = pair[0]; } - else if(pair[1].getCharge() > 0) { positron = pair[1]; } - if(pair[0].getCharge() < 0) { electron = pair[0]; } - else if(pair[1].getCharge() < 0) { electron = pair[1]; } - if(electron == null || positron == null) { - continue tridentLoop; - } - - // Make sure that the clusters are not the same. This should - // not actually ever be possible... - if(pair[0].getClusters().get(0) == pair[1].getClusters().get(0)) { - continue tridentLoop; - } - - // The clusters must within a limited time window. - /* - Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; - if(TriggerModule.getValueTimeCoincidence(trackClusters) > timeCoincidence) { - continue tridentLoop; - } - */ - - // The clusters must be coincidental within an energy - // dependent coincidence window. - Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; - if(!isCoincidental(trackClusters)) { - continue tridentLoop; - } - - // Require that the electron in the pair have an energy - // below the elastic threshold to exclude elastic electrons. - if(electron.getMomentum().magnitude() >= elasticThreshold) { - continue tridentLoop; - } - - // Require that all clusters occur within the trigger time - // window to exclude accidentals. - if(checkTriggerTimeWindow) { - if(!inTriggerWindow(trackClusters[0]) || !inTriggerWindow(trackClusters[1])) { - continue tridentLoop; - } - } - - // If all the above conditions are met, the pair is to be - // considered a trident pair. Add it to the list. - tridentTracks.add(pair); - } - - // Return the list of pairs that passed the condition. - return tridentTracks; - } - - private final List<ReconstructedParticle[]> getMøllerTracksGBL(List<ReconstructedParticle[]> pairList, EventHeader event) { - // Store the set of track pairs that meet the Møller condition. - List<ReconstructedParticle[]> møllerTracks = new ArrayList<ReconstructedParticle[]>(); - - // Extract track relational tables from the event object. - RelationalTable<?, ?> hitToStrips = TrackUtils.getHitToStripsTable(event); - RelationalTable<?, ?> hitToRotated = TrackUtils.getHitToRotatedTable(event); - - // Loop over the filtered pair list and apply the Møller - // condition test. - møllerLoop: - for(ReconstructedParticle[] pair : pairList) { - // Both tracks must be negatively charged. - if(pair[0].getCharge() > 0 || pair[1].getCharge() > 0) { - continue møllerLoop; - } - - // The clusters must within a limited time window. - double times[] = { - TrackUtils.getTrackTime(pair[0].getTracks().get(0), hitToStrips, hitToRotated), - TrackUtils.getTrackTime(pair[1].getTracks().get(0), hitToStrips, hitToRotated) - }; - - if(Math.abs(times[0] - times[1]) > timeCoincidence) { - continue møllerLoop; - } - - // Require that the electrons in the pair have energies - // below the elastic threshold to exclude said electrons. - if(pair[0].getMomentum().magnitude() > elasticThreshold || pair[1].getMomentum().magnitude() > elasticThreshold) { - continue møllerLoop; - } - - // Require that the energy of the pair be within a range - // that is sufficiently "Møller-like." - double momentumSum = VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(); - if(momentumSum < møllerLowerRange || momentumSum > møllerUpperRange) { - continue møllerLoop; - } - - // If all the above conditions are met, the pair is to be - // considered a trident pair. Add it to the list. - møllerTracks.add(pair); - } - - // Return the list of pairs that passed the condition. - return møllerTracks; - } - - /** - * Gets a list track pairs that meet the Møller condition defined - * using tracks with matched calorimeter clusters. A pair meets the - * cluster/track matched Møller condition is it meets the following: - * <ul><li>Both tracks have matched clusters.</li> - * <li>Both tracks are negative.</li> - * <li>Clusters have a time coincidence of 2.5 ns or less.</li> - * <li>The electron momenta are below 900 MeV.</li> - * <li>The momentum sum of the tracks is in the range <code>800 MeV - * ⤠p1 + p2 ⤠1500 MeV</li></ul> - * @param pairList - A <code>List</code> collection of parameterized - * type <code>ReconstructedParticle[]</code> containing all valid - * top/bottom pairs of tracks with matched clusters. These will be - * tested to see if they meet the process criteria. - * @return Returns a list containing pairs of tracks that meet the - * Møller condition. - */ - private final List<ReconstructedParticle[]> getMøllerTracksCTMatched(List<ReconstructedParticle[]> pairList) { - // Store the set of track pairs that meet the Møller condition. - List<ReconstructedParticle[]> møllerTracks = new ArrayList<ReconstructedParticle[]>(); - - // Loop over the filtered pair list and apply the Møller - // condition test. - møllerLoop: - for(ReconstructedParticle[] pair : pairList) { - // Both tracks must be negatively charged. - if(pair[0].getCharge() > 0 || pair[1].getCharge() > 0) { - continue møllerLoop; - } - - // The clusters must within a limited time window. - /* - Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; - if(TriggerModule.getValueTimeCoincidence(trackClusters) > timeCoincidence) { - continue møllerLoop; - } - */ - - // The clusters must be coincidental within an energy - // dependent coincidence window. - Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; - if(!isCoincidental(trackClusters)) { - continue møllerLoop; - } - - // Require that the electrons in the pair have energies - // below the elastic threshold to exclude said electrons. - if(pair[0].getMomentum().magnitude() > elasticThreshold || pair[1].getMomentum().magnitude() > elasticThreshold) { - continue møllerLoop; - } - - // Require that the energy of the pair be within a range - // that is sufficiently "Møller-like." - double momentumSum = VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(); - if(momentumSum < møllerLowerRange || momentumSum > møllerUpperRange) { - continue møllerLoop; - } - - // Require that all clusters occur within the trigger time - // window to exclude accidentals. - if(checkTriggerTimeWindow) { - if(!inTriggerWindow(trackClusters[0]) || !inTriggerWindow(trackClusters[1])) { - continue møllerLoop; - } - } - - // If all the above conditions are met, the pair is to be - // considered a trident pair. Add it to the list. - møllerTracks.add(pair); - } - - // Return the list of pairs that passed the condition. - return møllerTracks; - } - - /** - * Calculates the approximate invariant mass for a pair of tracks - * from their momentum. This assumes that the particles are either - * electrons or positrons, and thusly have a sufficiently small - * mass term that it can be safely excluded. - * @param pair - The track pair for which to calculate the invariant - * mass. - * @return Returns the approximate invariant mass in units of GeV. - */ - private static final double getInvariantMass(ReconstructedParticle[] pair) { - // Get the momentum squared. - double p2 = Math.pow(pair[0].getMomentum().magnitude() + pair[1].getMomentum().magnitude(), 2); - - // Get the remaining terms. - double xPro = pair[0].getMomentum().x() + pair[1].getMomentum().x(); - double yPro = pair[0].getMomentum().y() + pair[1].getMomentum().y(); - double zPro = pair[0].getMomentum().z() + pair[1].getMomentum().z(); - - // Calculate the invariant mass. - return Math.sqrt(p2 - Math.pow(xPro, 2) - Math.pow(yPro, 2) - Math.pow(zPro, 2)); - } - - /** - * Calculates the coplanarity angle between two points, specified - * by a double array. The array must be of the format (x, y, z). - * @param position - The first position array. - * @param otherPosition - The second position array. - * @return Returns the coplanarity angle between the points in units - * of degrees. - */ - private static final double getCalculatedCoplanarity(double[] position, double[] otherPosition) { - // Define the x- and y-coordinates of the clusters as well as - // calorimeter center. - final double ORIGIN_X = 42.52; - double x[] = { position[0], otherPosition[0] }; - double y[] = { position[1], otherPosition[1] }; - + if(!event.hasCollection(ReconstructedParticle.class, particleCollectionName)) { + return; + } + List<ReconstructedParticle> trackList = event.get(ReconstructedParticle.class, particleCollectionName); + + // Check if the event has a collection of clusters. If it + // exists, extract it. Otherwise, skip the event. + if(!event.hasCollection(Cluster.class, clusterCollectionName)) { + return; + } + List<Cluster> clusterList = event.get(Cluster.class, clusterCollectionName); + + // Get cluster-track matched top/bottom pairs. + List<ReconstructedParticle[]> gblMatchedPairs = getTopBottomTracksGBL(trackList); + List<ReconstructedParticle[]> ctMatchedPairs = getTopBottomTracksCTMatched(trackList); + + System.out.println("CTM Pairs :: " + ctMatchedPairs.size()); + System.out.println("GBL Pairs :: " + gblMatchedPairs.size()); + + // Get the trident and Møller tracks for the matched track + // and cluster pair condition sets. + List<ReconstructedParticle[]> møllers = getMøllerTracksCTMatched(ctMatchedPairs); + List<ReconstructedParticle[]> møllersGBL = getMøllerTracksGBL(gblMatchedPairs, event); + List<ReconstructedParticle[]> tridents = getTridentTracksCTMatched(ctMatchedPairs); + List<ReconstructedParticle[]> tridentsGBL = getTridentClustersGBL(gblMatchedPairs, TriggerModule.getTopBottomPairs(clusterList, Cluster.class), event); + + // Track how many events had tridents and Møllers. + if(!møllers.isEmpty()) { møllersProcessed++; } + if(!tridents.isEmpty()) { tridentsProcessed++; } + if(!møllersGBL.isEmpty()) { gblMøllersProcessed++; } + if(!tridentsGBL.isEmpty()) { gblTridentsProcessed++; } + + // Produce Møller cluster-track matched plots. + møctmInstancesInEvent.fill(møllers.size()); + for(ReconstructedParticle[] pair : møllers) { + // Get the track clusters. + Track[] tracks = { pair[0].getTracks().get(0), pair[1].getTracks().get(0) }; + Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; + + // Populate the cluster plots. + møctmElectronEnergy.fill(trackClusters[0].getEnergy()); + møctmElectronEnergy.fill(trackClusters[1].getEnergy()); + møctmEnergySum1D.fill(TriggerModule.getValueEnergySum(trackClusters)); + møctmEnergySum2D.fill(trackClusters[0].getEnergy(), trackClusters[1].getEnergy()); + møctmESumCoplanarity.fill(TriggerModule.getValueEnergySum(trackClusters), getCalculatedCoplanarity(trackClusters)); + møctmTimeCoincidence.fill(TriggerModule.getClusterTime(trackClusters[0]) - TriggerModule.getClusterTime(trackClusters[1])); + møctmClusterPosition.fill(TriggerModule.getClusterXIndex(trackClusters[0]), TriggerModule.getClusterYIndex(trackClusters[0])); + møctmClusterPosition.fill(TriggerModule.getClusterXIndex(trackClusters[1]), TriggerModule.getClusterYIndex(trackClusters[1])); + + // Populate the momentum plots. + møctmInvariantMass.fill(getInvariantMass(pair)); + møctmElectronMomentum.fill(pair[0].getMomentum().magnitude()); + møctmElectronMomentum.fill(pair[1].getMomentum().magnitude()); + møctmMomentumSum1D.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude()); + møctmMomentumSum2D.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); + møctmTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[0]).x(), TrackUtils.getTrackPositionAtEcal(tracks[0]).y()); + møctmTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[1]).x(), TrackUtils.getTrackPositionAtEcal(tracks[1]).y()); + møctmPSumCoplanarity.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(), + getCalculatedCoplanarity(new Track[] { pair[0].getTracks().get(0), pair[1].getTracks().get(0) })); + } + + // Produce trident cluster-track matched plots. + trctmInstancesInEvent.fill(tridents.size()); + for(ReconstructedParticle[] pair : tridents) { + // Get the electron and positron tracks. + ReconstructedParticle electronTrack = pair[pair[0].getCharge() < 0 ? 0 : 1]; + ReconstructedParticle positronTrack = pair[pair[0].getCharge() > 0 ? 0 : 1]; + + // Get the track clusters. + Cluster electronCluster = electronTrack.getClusters().get(0); + Cluster positronCluster = positronTrack.getClusters().get(0); + Track[] tracks = { pair[0].getTracks().get(0), pair[1].getTracks().get(0) }; + Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; + + // Populate the cluster plots. + trctmElectronEnergy.fill(electronCluster.getEnergy()); + trctmPositronEnergy.fill(positronCluster.getEnergy()); + trctmEnergySum2D.fill(pair[0].getEnergy(), pair[1].getEnergy()); + trctmEnergySum1D.fill(TriggerModule.getValueEnergySum(trackClusters)); + trctmESumCoplanarity.fill(TriggerModule.getValueEnergySum(trackClusters), getCalculatedCoplanarity(trackClusters)); + trctmTimeCoincidence.fill(TriggerModule.getClusterTime(trackClusters[0]) - TriggerModule.getClusterTime(trackClusters[1])); + trctmClusterPosition.fill(TriggerModule.getClusterXIndex(trackClusters[0]), TriggerModule.getClusterYIndex(trackClusters[0])); + trctmClusterPosition.fill(TriggerModule.getClusterXIndex(trackClusters[1]), TriggerModule.getClusterYIndex(trackClusters[1])); + + // Populate the momentum plots. + trctmInvariantMass.fill(getInvariantMass(pair)); + trctmElectronMomentum.fill(electronTrack.getMomentum().magnitude()); + trctmPositronMomentum.fill(positronTrack.getMomentum().magnitude()); + trctmMomentumSum1D.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude()); + trctmMomentumSum2D.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); + trctmTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[0]).x(), TrackUtils.getTrackPositionAtEcal(tracks[0]).y()); + trctmTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[1]).x(), TrackUtils.getTrackPositionAtEcal(tracks[1]).y()); + trctmPSumCoplanarity.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(), + getCalculatedCoplanarity(new Track[] { pair[0].getTracks().get(0), pair[1].getTracks().get(0) })); + } + + // Produce the Møller track-only plots. + møgblInstancesInEvent.fill(møllersGBL.size()); + RelationalTable<?, ?> hitToStrips = TrackUtils.getHitToStripsTable(event); + RelationalTable<?, ?> hitToRotated = TrackUtils.getHitToRotatedTable(event); + for(ReconstructedParticle pair[] : møllersGBL) { + // Get the tracks and track times. + Track[] tracks = { pair[0].getTracks().get(0), pair[1].getTracks().get(0) }; + double times[] = { + TrackUtils.getTrackTime(tracks[0], hitToStrips, hitToRotated), + TrackUtils.getTrackTime(tracks[1], hitToStrips, hitToRotated) + }; + + // Fill the plots. + møgblTimeCoincidence.fill(times[0] - times[1]); + møgblInvariantMass.fill(getInvariantMass(pair)); + møgblElectronMomentum.fill(pair[0].getMomentum().magnitude()); + møgblElectronMomentum.fill(pair[1].getMomentum().magnitude()); + møgblMomentumSum1D.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude()); + møgblMomentumSum2D.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); + møgblTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[0]).x(), TrackUtils.getTrackPositionAtEcal(tracks[0]).y()); + møgblTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[1]).x(), TrackUtils.getTrackPositionAtEcal(tracks[1]).y()); + møgblPSumCoplanarity.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(), + getCalculatedCoplanarity(new Track[] { pair[0].getTracks().get(0), pair[1].getTracks().get(0) })); + } + + // Produce track-only trident plots. + trgblInstancesInEvent.fill(tridentsGBL.size()); + for(ReconstructedParticle[] pair : tridentsGBL) { + // Get the tracks and track times. + Track[] tracks = { pair[0].getTracks().get(0), pair[1].getTracks().get(0) }; + double times[] = { + TrackUtils.getTrackTime(tracks[0], hitToStrips, hitToRotated), + TrackUtils.getTrackTime(tracks[1], hitToStrips, hitToRotated) + }; + + // Get the positron and the electron. + ReconstructedParticle positron = pair[0].getCharge() > 0 ? pair[0] : pair[1]; + ReconstructedParticle electron = pair[0].getCharge() < 0 ? pair[0] : pair[1]; + + // Fill the plots. + trgblTimeCoincidence.fill(times[0] - times[1]); + trgblInvariantMass.fill(getInvariantMass(pair)); + trgblElectronMomentum.fill(electron.getMomentum().magnitude()); + trgblPositronMomentum.fill(positron.getMomentum().magnitude()); + trgblMomentumSum1D.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude()); + trgblMomentumSum2D.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); + trgblTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[0]).x(), TrackUtils.getTrackPositionAtEcal(tracks[0]).y()); + trgblTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[1]).x(), TrackUtils.getTrackPositionAtEcal(tracks[1]).y()); + trgblPSumCoplanarity.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(), + getCalculatedCoplanarity(new Track[] { pair[0].getTracks().get(0), pair[1].getTracks().get(0) })); + } + } + + public void setCheckSVT(boolean state) { + checkSVT = state; + } + + public void setCheckTriggerTimeWindow(boolean state) { + checkTriggerTimeWindow = state; + } + + /** + * Gets a list of all possible GBL top/bottom track pairs. These + * tracks are not guaranteed to have a matched cluster. + * @param trackList - A list of all possible tracks. + * @return Returns a list of track pairs. + */ + private static final List<ReconstructedParticle[]> getTopBottomTracksGBL(List<ReconstructedParticle> trackList) { + // Separate the tracks into top and bottom tracks based on + // the value of tan(Î). Use only GBL tracks to avoid track + // duplication. + List<ReconstructedParticle> topTracks = new ArrayList<ReconstructedParticle>(); + List<ReconstructedParticle> botTracks = new ArrayList<ReconstructedParticle>(); + trackLoop: + for(ReconstructedParticle track : trackList) { + // Require that the ReconstructedParticle contain an actual + // Track object. + if(track.getTracks().isEmpty()) { + continue trackLoop; + } + + // Ignore tracks that are not GBL tracks. + if(!TrackType.isGBL(track.getType())) { + continue trackLoop; + } + + // If the above tests pass, the ReconstructedParticle has + // a track and is also a GBL track. Separate it into either + // a top or a bottom track based on its tan(Î) value. + if(track.getTracks().get(0).getTrackStates().get(0).getTanLambda() > 0) { + topTracks.add(track); + } else { + botTracks.add(track); + } + } + + // Form all top/bottom pairs with the unique tracks. + List<ReconstructedParticle[]> pairList = new ArrayList<ReconstructedParticle[]>(); + for(ReconstructedParticle topTrack : topTracks) { + for(ReconstructedParticle botTrack : botTracks) { + pairList.add(new ReconstructedParticle[] { topTrack, botTrack }); + } + } + + // Return the result. + return pairList; + } + + /** + * Produces pairs of tracks. The track pairs are required to be + * matched to a cluster and the associated clusters must form a + * top/bottom pair. If more than one track points to the same + * cluster, only the first track is retained. + * @param trackList - A list of all tracks. + * @return Returns a list of track pairs meeting the aforementioned + * conditions. + */ + private static final List<ReconstructedParticle[]> getTopBottomTracksCTMatched(List<ReconstructedParticle> trackList) { + // Track clusters that have already been seen to prevent clusters + // that have duplicate tracks from reappearing. + Set<Cluster> clusterSet = new HashSet<Cluster>(); + + // Separate the tracks into top and bottom tracks based on + // the track cluster. Filter out tracks with no clusters. + List<ReconstructedParticle> topTracks = new ArrayList<ReconstructedParticle>(); + List<ReconstructedParticle> botTracks = new ArrayList<ReconstructedParticle>(); + trackLoop: + for(ReconstructedParticle track : trackList) { + // Check if the track has a cluster. If not, skip it. + if(track.getClusters().isEmpty()) { + continue trackLoop; + } + + // If the track doesn't have actual tracks, skip it. + if(track.getTracks().isEmpty()) { + continue trackLoop; + } + + // Check if the track cluster has already seen. + Cluster trackCluster = track.getClusters().get(0); + if(clusterSet.contains(trackCluster)) { + continue trackLoop; + } + + // If the track has a unique cluster, add it to the proper + // list based on the cluster y-index. + clusterSet.add(trackCluster); + if(TriggerModule.getClusterYIndex(trackCluster) > 0) { + topTracks.add(track); + } else { + botTracks.add(track); + } + } + + // Form all top/bottom pairs with the unique tracks. + List<ReconstructedParticle[]> pairList = new ArrayList<ReconstructedParticle[]>(); + for(ReconstructedParticle topTrack : topTracks) { + for(ReconstructedParticle botTrack : botTracks) { + pairList.add(new ReconstructedParticle[] { topTrack, botTrack }); + } + } + + // Return the result. + return pairList; + } + + private final List<ReconstructedParticle[]> getTridentClustersGBL(List<ReconstructedParticle[]> pairList, List<Cluster[]> clusterList, EventHeader event) { + // Store the set of track pairs that meet the trident condition. + List<ReconstructedParticle[]> tridentTracks = new ArrayList<ReconstructedParticle[]>(); + + // Extract track relational tables from the event object. + RelationalTable<?, ?> hitToStrips = TrackUtils.getHitToStripsTable(event); + RelationalTable<?, ?> hitToRotated = TrackUtils.getHitToRotatedTable(event); + + // Tracks will not be considered for trident analysis unless there + // is at least one top/bottom cluster pair within the time window. + boolean passesClusterCondition = false; + tridentClusterLoop: + for(Cluster[] pair : clusterList) { + // Ignore clusters that are too far apart temporally. + if(TriggerModule.getValueTimeCoincidence(pair) > timeCoincidence) { + continue tridentClusterLoop; + } + + // Require that the cluster pair be top/bottom. + boolean hasTop = TriggerModule.getClusterYIndex(pair[0]) > 0 || TriggerModule.getClusterYIndex(pair[1]) > 0; + boolean hasBot = TriggerModule.getClusterYIndex(pair[0]) < 0 || TriggerModule.getClusterYIndex(pair[1]) < 0; + if(!hasTop || !hasBot) { + continue tridentClusterLoop; + } + + // If the cluster passes, mark that it has done so and skip + // the rest. Only one pair need pass. + passesClusterCondition = true; + break tridentClusterLoop; + } + + // If no cluster pair passed the cluster condition, no tracks + // are allowed to pass either. + if(!passesClusterCondition) { + return tridentTracks; + } + + // Next, check the track pair list. A track pair must have a + // positive and a negative track and must also be within the + // time coincidence window. + tridentTrackLoop: + for(ReconstructedParticle[] pair : pairList) { + // Check that there is at least one positive and one negative + // track in the pair. + boolean hasPositive = pair[0].getCharge() > 0 || pair[1].getCharge() > 0; + boolean hasNegative = pair[0].getCharge() < 0 || pair[1].getCharge() < 0; + if(!hasPositive || !hasNegative) { + break tridentTrackLoop; + } + + // Check that the track pair passes the time cut. + double times[] = { + TrackUtils.getTrackTime(pair[0].getTracks().get(0), hitToStrips, hitToRotated), + TrackUtils.getTrackTime(pair[1].getTracks().get(0), hitToStrips, hitToRotated) + }; + + if(Math.abs(times[0] - times[1]) > timeCoincidence) { + continue tridentTrackLoop; + } + + // Require that the negative track have less than the + // elastic threshold momentum to exclude elastic electrons. + if(pair[0].getCharge() < 0 && pair[0].getMomentum().magnitude() > elasticThreshold + || pair[1].getCharge() < 0 && pair[1].getMomentum().magnitude() > elasticThreshold) { + continue tridentTrackLoop; + } + + // If the track passes both, it is considered a trident pair. + tridentTracks.add(pair); + } + + // Return the resultant pairs. + return tridentTracks; + } + + /** + * Gets a list track pairs that meet the trident condition defined + * using tracks with matched calorimeter clusters. A pair meets the + * cluster/track matched trident condition is it meets the following: + * <ul><li>Both tracks have matched clusters.</li> + * <li>Has one positive track.</li> + * <li>Has one negative track.</li> + * <li>Clusters have a time coincidence of 2.5 ns or less.</li> + * <li>The electron momentum is below 900 MeV.</li></ul> + * @param pairList - A <code>List</code> collection of parameterized + * type <code>ReconstructedParticle[]</code> containing all valid + * top/bottom pairs of tracks with matched clusters. These will be + * tested to see if they meet the process criteria. + * @return Returns a list containing pairs of tracks that meet the + * trident condition. + */ + private final List<ReconstructedParticle[]> getTridentTracksCTMatched(List<ReconstructedParticle[]> pairList) { + // Store the set of track pairs that meet the trident condition. + List<ReconstructedParticle[]> tridentTracks = new ArrayList<ReconstructedParticle[]>(); + + // Loop over the filtered pair list and apply the trident + // condition test. + tridentLoop: + for(ReconstructedParticle[] pair : pairList) { + // There must be one positive and one negative track. + ReconstructedParticle electron = null; + ReconstructedParticle positron = null; + if(pair[0].getCharge() > 0) { positron = pair[0]; } + else if(pair[1].getCharge() > 0) { positron = pair[1]; } + if(pair[0].getCharge() < 0) { electron = pair[0]; } + else if(pair[1].getCharge() < 0) { electron = pair[1]; } + if(electron == null || positron == null) { + continue tridentLoop; + } + + // Make sure that the clusters are not the same. This should + // not actually ever be possible... + if(pair[0].getClusters().get(0) == pair[1].getClusters().get(0)) { + continue tridentLoop; + } + + // The clusters must within a limited time window. + /* + Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; + if(TriggerModule.getValueTimeCoincidence(trackClusters) > timeCoincidence) { + continue tridentLoop; + } + */ + + // The clusters must be coincidental within an energy + // dependent coincidence window. + Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; + if(!isCoincidental(trackClusters)) { + continue tridentLoop; + } + + // Require that the electron in the pair have an energy + // below the elastic threshold to exclude elastic electrons. + if(electron.getMomentum().magnitude() >= elasticThreshold) { + continue tridentLoop; + } + + // Require that all clusters occur within the trigger time + // window to exclude accidentals. + if(checkTriggerTimeWindow) { + if(!inTriggerWindow(trackClusters[0]) || !inTriggerWindow(trackClusters[1])) { + continue tridentLoop; + } + } + + // If all the above conditions are met, the pair is to be + // considered a trident pair. Add it to the list. + tridentTracks.add(pair); + } + + // Return the list of pairs that passed the condition. + return tridentTracks; + } + + private final List<ReconstructedParticle[]> getMøllerTracksGBL(List<ReconstructedParticle[]> pairList, EventHeader event) { + // Store the set of track pairs that meet the Møller condition. + List<ReconstructedParticle[]> møllerTracks = new ArrayList<ReconstructedParticle[]>(); + + // Extract track relational tables from the event object. + RelationalTable<?, ?> hitToStrips = TrackUtils.getHitToStripsTable(event); + RelationalTable<?, ?> hitToRotated = TrackUtils.getHitToRotatedTable(event); + + // Loop over the filtered pair list and apply the Møller + // condition test. + møllerLoop: + for(ReconstructedParticle[] pair : pairList) { + // Both tracks must be negatively charged. + if(pair[0].getCharge() > 0 || pair[1].getCharge() > 0) { + continue møllerLoop; + } + + // The clusters must within a limited time window. + double times[] = { + TrackUtils.getTrackTime(pair[0].getTracks().get(0), hitToStrips, hitToRotated), + TrackUtils.getTrackTime(pair[1].getTracks().get(0), hitToStrips, hitToRotated) + }; + + if(Math.abs(times[0] - times[1]) > timeCoincidence) { + continue møllerLoop; + } + + // Require that the electrons in the pair have energies + // below the elastic threshold to exclude said electrons. + if(pair[0].getMomentum().magnitude() > elasticThreshold || pair[1].getMomentum().magnitude() > elasticThreshold) { + continue møllerLoop; + } + + // Require that the energy of the pair be within a range + // that is sufficiently "Møller-like." + double momentumSum = VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(); + if(momentumSum < møllerLowerRange || momentumSum > møllerUpperRange) { + continue møllerLoop; + } + + // If all the above conditions are met, the pair is to be + // considered a trident pair. Add it to the list. + møllerTracks.add(pair); + } + + // Return the list of pairs that passed the condition. + return møllerTracks; + } + + /** + * Gets a list track pairs that meet the Møller condition defined + * using tracks with matched calorimeter clusters. A pair meets the + * cluster/track matched Møller condition is it meets the following: + * <ul><li>Both tracks have matched clusters.</li> + * <li>Both tracks are negative.</li> + * <li>Clusters have a time coincidence of 2.5 ns or less.</li> + * <li>The electron momenta are below 900 MeV.</li> + * <li>The momentum sum of the tracks is in the range <code>800 MeV + * ⤠p1 + p2 ⤠1500 MeV</li></ul> + * @param pairList - A <code>List</code> collection of parameterized + * type <code>ReconstructedParticle[]</code> containing all valid + * top/bottom pairs of tracks with matched clusters. These will be + * tested to see if they meet the process criteria. + * @return Returns a list containing pairs of tracks that meet the + * Møller condition. + */ + private final List<ReconstructedParticle[]> getMøllerTracksCTMatched(List<ReconstructedParticle[]> pairList) { + // Store the set of track pairs that meet the Møller condition. + List<ReconstructedParticle[]> møllerTracks = new ArrayList<ReconstructedParticle[]>(); + + // Loop over the filtered pair list and apply the Møller + // condition test. + møllerLoop: + for(ReconstructedParticle[] pair : pairList) { + // Both tracks must be negatively charged. + if(pair[0].getCharge() > 0 || pair[1].getCharge() > 0) { + continue møllerLoop; + } + + // The clusters must within a limited time window. + /* + Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; + if(TriggerModule.getValueTimeCoincidence(trackClusters) > timeCoincidence) { + continue møllerLoop; + } + */ + + // The clusters must be coincidental within an energy + // dependent coincidence window. + Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; + if(!isCoincidental(trackClusters)) { + continue møllerLoop; + } + + // Require that the electrons in the pair have energies + // below the elastic threshold to exclude said electrons. + if(pair[0].getMomentum().magnitude() > elasticThreshold || pair[1].getMomentum().magnitude() > elasticThreshold) { + continue møllerLoop; + } + + // Require that the energy of the pair be within a range + // that is sufficiently "Møller-like." + double momentumSum = VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(); + if(momentumSum < møllerLowerRange || momentumSum > møllerUpperRange) { + continue møllerLoop; + } + + // Require that all clusters occur within the trigger time + // window to exclude accidentals. + if(checkTriggerTimeWindow) { + if(!inTriggerWindow(trackClusters[0]) || !inTriggerWindow(trackClusters[1])) { + continue møllerLoop; + } + } + + // If all the above conditions are met, the pair is to be + // considered a trident pair. Add it to the list. + møllerTracks.add(pair); + } + + // Return the list of pairs that passed the condition. + return møllerTracks; + } + + /** + * Calculates the approximate invariant mass for a pair of tracks + * from their momentum. This assumes that the particles are either + * electrons or positrons, and thusly have a sufficiently small + * mass term that it can be safely excluded. + * @param pair - The track pair for which to calculate the invariant + * mass. + * @return Returns the approximate invariant mass in units of GeV. + */ + private static final double getInvariantMass(ReconstructedParticle[] pair) { + // Get the momentum squared. + double p2 = Math.pow(pair[0].getMomentum().magnitude() + pair[1].getMomentum().magnitude(), 2); + + // Get the remaining terms. + double xPro = pair[0].getMomentum().x() + pair[1].getMomentum().x(); + double yPro = pair[0].getMomentum().y() + pair[1].getMomentum().y(); + double zPro = pair[0].getMomentum().z() + pair[1].getMomentum().z(); + + // Calculate the invariant mass. + return Math.sqrt(p2 - Math.pow(xPro, 2) - Math.pow(yPro, 2) - Math.pow(zPro, 2)); + } + + /** + * Calculates the coplanarity angle between two points, specified + * by a double array. The array must be of the format (x, y, z). + * @param position - The first position array. + * @param otherPosition - The second position array. + * @return Returns the coplanarity angle between the points in units + * of degrees. + */ + private static final double getCalculatedCoplanarity(double[] position, double[] otherPosition) { + // Define the x- and y-coordinates of the clusters as well as + // calorimeter center. + final double ORIGIN_X = 42.52; + double x[] = { position[0], otherPosition[0] }; + double y[] = { position[1], otherPosition[1] }; + // Get the cluster angles. double[] clusterAngle = new double[2]; for(int i = 0; i < 2; i++) { - clusterAngle[i] = Math.atan2(y[i], x[i] - ORIGIN_X) * 180 / Math.PI; - if(clusterAngle[i] <= 0) { clusterAngle[i] += 360; } + clusterAngle[i] = Math.atan2(y[i], x[i] - ORIGIN_X) * 180 / Math.PI; + if(clusterAngle[i] <= 0) { clusterAngle[i] += 360; } } // Calculate the coplanarity cut value. double clusterDiff = clusterAngle[0] - clusterAngle[1]; return clusterDiff > 0 ? clusterDiff : clusterDiff + 360; - } - - /** - * Calculates the coplanarity angle of a pair of clusters. - * @param pair - The pair of clusters for which to calculate the - * coplanarity angle. - * @return Returns the coplanarity angle between the two clusters - * in degrees. - */ - private static final double getCalculatedCoplanarity(Cluster[] pair) { - return getCalculatedCoplanarity(pair[0].getPosition(), pair[1].getPosition()); - } - - /** - * Calculates the coplanarity angle of a pair of tracks. The track - * is extrapolated to the calorimeter face and its position there - * used for the arguments in the calculation. - * @param pair - The pair of tracks for which to calculate the - * coplanarity angle. - * @return Returns the coplanarity angle between the two tracks - * in degrees. - */ - private static final double getCalculatedCoplanarity(Track[] pair) { - return getCalculatedCoplanarity(TrackUtils.getTrackPositionAtEcal(pair[0]).v(), TrackUtils.getTrackPositionAtEcal(pair[1]).v()); - } - - private static final boolean inTriggerWindow(Cluster cluster) { - // Get the cluster time. - double clusterTime = TriggerModule.getClusterTime(cluster); - - // Check that it is within the allowed bounds. - return (35 <= clusterTime && clusterTime <= 50); - } - - private static final boolean isCoincidental(Cluster[] pair) { - // Get the energy sum and the time coincidence. - double energySum = pair[0].getEnergy() + pair[1].getEnergy(); - double timeCoincidence = TriggerModule.getValueTimeCoincidence(pair); - - // Get the upper and lower bounds of the allowed range. - double mean = getTimeDependenceMean(energySum); - double threeSigma = 3.0 * getTimeDependenceSigma(energySum); - double lowerBound = mean - threeSigma; - double upperBound = mean + threeSigma; - - // Perform the time coincidence check. - return (lowerBound <= timeCoincidence && timeCoincidence <= upperBound); - } - - private static final double getTimeDependenceMean(double energySum) { - // Define the fit parameters. - double[] param = { 0.289337, -2.81998, 9.03475, -12.93, 8.71476, -2.26969 }; - - // Calculate the mean. - return param[0] + energySum * (param[1] + energySum * (param[2] + energySum * (param[3] + energySum * (param[4] + energySum * (param[5]))))); - } - - private static final double getTimeDependenceSigma(double energySum) { - // Define the fit parameters. - double[] param = { 4.3987, -24.2371, 68.9567, -98.2586, 67.562, -17.8987 }; - - // Calculate the standard deviation. - return param[0] + energySum * (param[1] + energySum * (param[2] + energySum * (param[3] + energySum * (param[4] + energySum * (param[5]))))); - } + } + + /** + * Calculates the coplanarity angle of a pair of clusters. + * @param pair - The pair of clusters for which to calculate the + * coplanarity angle. + * @return Returns the coplanarity angle between the two clusters + * in degrees. + */ + private static final double getCalculatedCoplanarity(Cluster[] pair) { + return getCalculatedCoplanarity(pair[0].getPosition(), pair[1].getPosition()); + } + + /** + * Calculates the coplanarity angle of a pair of tracks. The track + * is extrapolated to the calorimeter face and its position there + * used for the arguments in the calculation. + * @param pair - The pair of tracks for which to calculate the + * coplanarity angle. + * @return Returns the coplanarity angle between the two tracks + * in degrees. + */ + private static final double getCalculatedCoplanarity(Track[] pair) { + return getCalculatedCoplanarity(TrackUtils.getTrackPositionAtEcal(pair[0]).v(), TrackUtils.getTrackPositionAtEcal(pair[1]).v()); + } + + private static final boolean inTriggerWindow(Cluster cluster) { + // Get the cluster time. + double clusterTime = TriggerModule.getClusterTime(cluster); + + // Check that it is within the allowed bounds. + return (35 <= clusterTime && clusterTime <= 50); + } + + private static final boolean isCoincidental(Cluster[] pair) { + // Get the energy sum and the time coincidence. + double energySum = pair[0].getEnergy() + pair[1].getEnergy(); + double timeCoincidence = TriggerModule.getValueTimeCoincidence(pair); + + // Get the upper and lower bounds of the allowed range. + double mean = getTimeDependenceMean(energySum); + double threeSigma = 3.0 * getTimeDependenceSigma(energySum); + double lowerBound = mean - threeSigma; + double upperBound = mean + threeSigma; + + // Perform the time coincidence check. + return (lowerBound <= timeCoincidence && timeCoincidence <= upperBound); + } + + private static final double getTimeDependenceMean(double energySum) { + // Define the fit parameters. + double[] param = { 0.289337, -2.81998, 9.03475, -12.93, 8.71476, -2.26969 }; + + // Calculate the mean. + return param[0] + energySum * (param[1] + energySum * (param[2] + energySum * (param[3] + energySum * (param[4] + energySum * (param[5]))))); + } + + private static final double getTimeDependenceSigma(double energySum) { + // Define the fit parameters. + double[] param = { 4.3987, -24.2371, 68.9567, -98.2586, 67.562, -17.8987 }; + + // Calculate the standard deviation. + return param[0] + energySum * (param[1] + energySum * (param[2] + energySum * (param[3] + energySum * (param[4] + energySum * (param[5]))))); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/AddPlots.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/AddPlots.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/AddPlots.java Wed Mar 9 11:43:24 2016 @@ -14,241 +14,241 @@ import hep.aida.ITree; public class AddPlots { - - public static void main(String[] args) throws IllegalArgumentException, IOException { - // Define the root directory for the plots. - String rootDir = null; - - // Get the option identifier from the command arguments. - boolean isHelp = false; - boolean isFileList = false; - boolean isDirectory = false; - if(args.length > 0) { - if(args[0].compareTo("-h") == 0) { isHelp = true; } - else if(args[0].compareTo("-f") == 0) { isFileList = true; } - else if(args[0].compareTo("-d") == 0) { isDirectory = true; } - } else { - System.err.println("Insufficient arguments. See \"AddPlots -h\""); - System.exit(1); - } - - // Process the command line argument. - List<File> plotFiles = new ArrayList<File>(); - if(isHelp) { - System.out.println("Usage:"); - System.out.println("\tAddPlots -d [PLOT_DIRECTORY]"); - System.out.println("\tAddPlots -f [PLOT_FILE] [PLOT_FILE] ..."); - System.exit(0); - } else if(isDirectory) { - // Make sure that a directory is specified. - if(args.length < 2) { - System.err.println("Insufficient arguments. Must specify at least two files."); - System.exit(1); - } - - // Get the plot directory from the second argument. - File plotDirectory = new File(args[1]); - - // Verify that it exists and is a directory. - if(!plotDirectory.exists()) { - System.err.println("File path does not exist."); - System.exit(1); - } if(!plotDirectory.isDirectory()) { - System.err.println("Indicated path must be a directory."); - System.exit(1); - } - - // Store the root directory. - rootDir = plotDirectory.getAbsolutePath() + "/"; - - // Extract the AIDA files from the directory. - for(File file : plotDirectory.listFiles()) { - System.out.println(file.getName()); - int indexOfExtension = file.getName().lastIndexOf('.'); - if(indexOfExtension == -1) { continue; } - if(file.getName().substring(indexOfExtension).compareToIgnoreCase(".aida") == 0) { - plotFiles.add(file); - } - } - - // Debug status print. - System.out.println("Processing plots in directory \"" + plotDirectory.getAbsolutePath() + "\""); - } else if(isFileList) { - // Make sure that at least one file was specified. - if(args.length < 3) { - System.err.println("Insufficient arguments. Must specify at least two files."); - System.exit(1); - } - - // Get the root directory. - rootDir = System.getProperty("user.dir") + "/"; - - // Create and verify the specified files. - for(int i = 1; i < args.length; i++) { - // Create the file object and make sure that it exists. - File file = new File(args[i]); - if(!file.exists()) { - System.err.println("Specified file does not exist: " + args[i]); - System.exit(1); - } - - // Add it to the file list. - plotFiles.add(file); - } - } else { - System.err.println("Option \"" + args[0] + "\" is not recognized."); - System.exit(1); - } - - // Make sure that there are actually files. - if(plotFiles.isEmpty()) { - System.err.println("No AIDA files found!"); - System.exit(1); - } - - // Get the plots file and open it. - IAnalysisFactory af = IAnalysisFactory.create(); - ITree tree = af.createTreeFactory().create(plotFiles.get(0).getAbsolutePath()); - if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } - - // Get the histograms names. - List<String> objectNameList = getTreeFiles(tree); - - // Separate the plots into 1D and 2D plots and extract their - // bin sizes and other properties. - List<Integer> xBins1D = new ArrayList<Integer>(); - List<Double> xBins1DMin = new ArrayList<Double>(); - List<Double> xBins1DMax = new ArrayList<Double>(); - List<Integer> xBins2D = new ArrayList<Integer>(); - List<Double> xBins2DMin = new ArrayList<Double>(); - List<Double> xBins2DMax = new ArrayList<Double>(); - List<Integer> yBins2D = new ArrayList<Integer>(); - List<Double> yBins2DMin = new ArrayList<Double>(); - List<Double> yBins2DMax = new ArrayList<Double>(); - List<String> histogramNames1D = new ArrayList<String>(); - List<String> histogramNames2D = new ArrayList<String>(); - for(String objectName : objectNameList) { - // Get the object. - IManagedObject object = tree.find(objectName); - - // If it is a 1D histogram, process it. - if(object instanceof IHistogram1D) { - // Add the object to the 1D histogram list. - histogramNames1D.add(objectName); - - // Get the bin size. - IHistogram1D plot = (IHistogram1D) object; - xBins1D.add(plot.axis().bins()); - xBins1DMin.add(plot.axis().lowerEdge()); - xBins1DMax.add(plot.axis().upperEdge()); - } - - // If it is a 1D histogram, process it. - else if(object instanceof IHistogram2D) { - // Add the object to the 2D histogram list. - histogramNames2D.add(objectName); - - // Get the bin size. - IHistogram2D plot = (IHistogram2D) object; - xBins2D.add(plot.xAxis().bins()); - xBins2DMin.add(plot.xAxis().lowerEdge()); - xBins2DMax.add(plot.xAxis().upperEdge()); - yBins2D.add(plot.yAxis().bins()); - yBins2DMin.add(plot.yAxis().lowerEdge()); - yBins2DMax.add(plot.yAxis().upperEdge()); - } - } - - // Create plots corresponding to each of the plot objects. - AIDA aida = AIDA.defaultInstance(); - List<IHistogram1D> histograms1D = new ArrayList<IHistogram1D>(histogramNames1D.size()); - List<IHistogram2D> histograms2D = new ArrayList<IHistogram2D>(histogramNames2D.size()); - for(int i = 0; i < histogramNames1D.size(); i++) { - IHistogram1D histogram = aida.histogram1D(histogramNames1D.get(i), xBins1D.get(i), xBins1DMin.get(i), xBins1DMax.get(i)); - histograms1D.add(histogram); - } - for(int i = 0; i < histogramNames2D.size(); i++) { - IHistogram2D histogram = aida.histogram2D(histogramNames2D.get(i), xBins2D.get(i), xBins2DMin.get(i), xBins2DMax.get(i), yBins2D.get(i), yBins2DMin.get(i), yBins2DMax.get(i)); - histograms2D.add(histogram); - } - - // Iterate over each file and add their entries to the compiled - // plots. - for(File file : plotFiles) { - // Open the file. - ITree fileTree = af.createTreeFactory().create(file.getAbsolutePath()); - - // For each plot, get the equivalent plot from the file - // and add each bin entry to the compiled plot. - for(int i = 0; i < histogramNames1D.size(); i++) { - // Get the histogram object. - IHistogram1D histogram = (IHistogram1D) fileTree.find(histogramNames1D.get(i)); - - // Iterate over the bins. - for(int x = 0; x < xBins1D.get(i); x++) { - // Get the entries in this bin and the bin average. - int entries = histogram.binEntries(x); - double average = histogram.binMean(x); - - // Add the entries to the compiled plot. - for(int j = 0; j < entries; j++) { - histograms1D.get(i).fill(average); - } - } - } - for(int i = 0; i < histogramNames2D.size(); i++) { - // Get the histogram object. - IHistogram2D histogram = (IHistogram2D) fileTree.find(histogramNames2D.get(i)); - - // Iterate over the bins. - for(int x = 0; x < xBins2D.get(i); x++) { - for(int y = 0; y < yBins2D.get(i); y++) { - // Get the entries in this bin and the bin average. - int entries = histogram.binEntries(x, y); - double averageX = histogram.binMeanX(x, y); - double averageY = histogram.binMeanY(x, y); - - // Add the entries to the compiled plot. - for(int j = 0; j < entries; j++) { - histograms2D.get(i).fill(averageX, averageY); - } - } - } - } - } - - // Save the compiled plots to a new file. - aida.saveAs(rootDir + "compiled-plots.aida"); - System.out.println("Plots written to path " + rootDir + "compiled-plots.aida"); - } - - private static final List<String> getTreeFiles(ITree tree) { - return getTreeFiles(tree, "/"); - } - - private static final List<String> getTreeFiles(ITree tree, String rootDir) { - // Make a list to contain the plot names. - List<String> list = new ArrayList<String>(); - - // Iterate over the objects at the indicated directory of the tree. - String objectNames[] = tree.listObjectNames(rootDir); - for(String objectName : objectNames) { - // Convert the object name to a char array and check the - // last character. Directories end in '/'. - char[] plotChars = objectName.toCharArray(); - - // If the object is a directory, process any objects inside - // of it as well. - if(plotChars[plotChars.length - 1] == '/') { - List<String> dirList = getTreeFiles(tree, objectName); - list.addAll(dirList); - } - - // Otherwise, just add the object to the list. - else { list.add(objectName); } - } - - // Return the compiled list. - return list; - } + + public static void main(String[] args) throws IllegalArgumentException, IOException { + // Define the root directory for the plots. + String rootDir = null; + + // Get the option identifier from the command arguments. + boolean isHelp = false; + boolean isFileList = false; + boolean isDirectory = false; + if(args.length > 0) { + if(args[0].compareTo("-h") == 0) { isHelp = true; } + else if(args[0].compareTo("-f") == 0) { isFileList = true; } + else if(args[0].compareTo("-d") == 0) { isDirectory = true; } + } else { + System.err.println("Insufficient arguments. See \"AddPlots -h\""); + System.exit(1); + } + + // Process the command line argument. + List<File> plotFiles = new ArrayList<File>(); + if(isHelp) { + System.out.println("Usage:"); + System.out.println("\tAddPlots -d [PLOT_DIRECTORY]"); + System.out.println("\tAddPlots -f [PLOT_FILE] [PLOT_FILE] ..."); + System.exit(0); + } else if(isDirectory) { + // Make sure that a directory is specified. + if(args.length < 2) { + System.err.println("Insufficient arguments. Must specify at least two files."); + System.exit(1); + } + + // Get the plot directory from the second argument. + File plotDirectory = new File(args[1]); + + // Verify that it exists and is a directory. + if(!plotDirectory.exists()) { + System.err.println("File path does not exist."); + System.exit(1); + } if(!plotDirectory.isDirectory()) { + System.err.println("Indicated path must be a directory."); + System.exit(1); + } + + // Store the root directory. + rootDir = plotDirectory.getAbsolutePath() + "/"; + + // Extract the AIDA files from the directory. + for(File file : plotDirectory.listFiles()) { + System.out.println(file.getName()); + int indexOfExtension = file.getName().lastIndexOf('.'); + if(indexOfExtension == -1) { continue; } + if(file.getName().substring(indexOfExtension).compareToIgnoreCase(".aida") == 0) { + plotFiles.add(file); + } + } + + // Debug status print. + System.out.println("Processing plots in directory \"" + plotDirectory.getAbsolutePath() + "\""); + } else if(isFileList) { + // Make sure that at least one file was specified. + if(args.length < 3) { + System.err.println("Insufficient arguments. Must specify at least two files."); + System.exit(1); + } + + // Get the root directory. + rootDir = System.getProperty("user.dir") + "/"; + + // Create and verify the specified files. + for(int i = 1; i < args.length; i++) { + // Create the file object and make sure that it exists. + File file = new File(args[i]); + if(!file.exists()) { + System.err.println("Specified file does not exist: " + args[i]); + System.exit(1); + } + + // Add it to the file list. + plotFiles.add(file); + } + } else { + System.err.println("Option \"" + args[0] + "\" is not recognized."); + System.exit(1); + } + + // Make sure that there are actually files. + if(plotFiles.isEmpty()) { + System.err.println("No AIDA files found!"); + System.exit(1); + } + + // Get the plots file and open it. + IAnalysisFactory af = IAnalysisFactory.create(); + ITree tree = af.createTreeFactory().create(plotFiles.get(0).getAbsolutePath()); + if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } + + // Get the histograms names. + List<String> objectNameList = getTreeFiles(tree); + + // Separate the plots into 1D and 2D plots and extract their + // bin sizes and other properties. + List<Integer> xBins1D = new ArrayList<Integer>(); + List<Double> xBins1DMin = new ArrayList<Double>(); + List<Double> xBins1DMax = new ArrayList<Double>(); + List<Integer> xBins2D = new ArrayList<Integer>(); + List<Double> xBins2DMin = new ArrayList<Double>(); + List<Double> xBins2DMax = new ArrayList<Double>(); + List<Integer> yBins2D = new ArrayList<Integer>(); + List<Double> yBins2DMin = new ArrayList<Double>(); + List<Double> yBins2DMax = new ArrayList<Double>(); + List<String> histogramNames1D = new ArrayList<String>(); + List<String> histogramNames2D = new ArrayList<String>(); + for(String objectName : objectNameList) { + // Get the object. + IManagedObject object = tree.find(objectName); + + // If it is a 1D histogram, process it. + if(object instanceof IHistogram1D) { + // Add the object to the 1D histogram list. + histogramNames1D.add(objectName); + + // Get the bin size. + IHistogram1D plot = (IHistogram1D) object; + xBins1D.add(plot.axis().bins()); + xBins1DMin.add(plot.axis().lowerEdge()); + xBins1DMax.add(plot.axis().upperEdge()); + } + + // If it is a 1D histogram, process it. + else if(object instanceof IHistogram2D) { + // Add the object to the 2D histogram list. + histogramNames2D.add(objectName); + + // Get the bin size. + IHistogram2D plot = (IHistogram2D) object; + xBins2D.add(plot.xAxis().bins()); + xBins2DMin.add(plot.xAxis().lowerEdge()); + xBins2DMax.add(plot.xAxis().upperEdge()); + yBins2D.add(plot.yAxis().bins()); + yBins2DMin.add(plot.yAxis().lowerEdge()); + yBins2DMax.add(plot.yAxis().upperEdge()); + } + } + + // Create plots corresponding to each of the plot objects. + AIDA aida = AIDA.defaultInstance(); + List<IHistogram1D> histograms1D = new ArrayList<IHistogram1D>(histogramNames1D.size()); + List<IHistogram2D> histograms2D = new ArrayList<IHistogram2D>(histogramNames2D.size()); + for(int i = 0; i < histogramNames1D.size(); i++) { + IHistogram1D histogram = aida.histogram1D(histogramNames1D.get(i), xBins1D.get(i), xBins1DMin.get(i), xBins1DMax.get(i)); + histograms1D.add(histogram); + } + for(int i = 0; i < histogramNames2D.size(); i++) { + IHistogram2D histogram = aida.histogram2D(histogramNames2D.get(i), xBins2D.get(i), xBins2DMin.get(i), xBins2DMax.get(i), yBins2D.get(i), yBins2DMin.get(i), yBins2DMax.get(i)); + histograms2D.add(histogram); + } + + // Iterate over each file and add their entries to the compiled + // plots. + for(File file : plotFiles) { + // Open the file. + ITree fileTree = af.createTreeFactory().create(file.getAbsolutePath()); + + // For each plot, get the equivalent plot from the file + // and add each bin entry to the compiled plot. + for(int i = 0; i < histogramNames1D.size(); i++) { + // Get the histogram object. + IHistogram1D histogram = (IHistogram1D) fileTree.find(histogramNames1D.get(i)); + + // Iterate over the bins. + for(int x = 0; x < xBins1D.get(i); x++) { + // Get the entries in this bin and the bin average. + int entries = histogram.binEntries(x); + double average = histogram.binMean(x); + + // Add the entries to the compiled plot. + for(int j = 0; j < entries; j++) { + histograms1D.get(i).fill(average); + } + } + } + for(int i = 0; i < histogramNames2D.size(); i++) { + // Get the histogram object. + IHistogram2D histogram = (IHistogram2D) fileTree.find(histogramNames2D.get(i)); + + // Iterate over the bins. + for(int x = 0; x < xBins2D.get(i); x++) { + for(int y = 0; y < yBins2D.get(i); y++) { + // Get the entries in this bin and the bin average. + int entries = histogram.binEntries(x, y); + double averageX = histogram.binMeanX(x, y); + double averageY = histogram.binMeanY(x, y); + + // Add the entries to the compiled plot. + for(int j = 0; j < entries; j++) { + histograms2D.get(i).fill(averageX, averageY); + } + } + } + } + } + + // Save the compiled plots to a new file. + aida.saveAs(rootDir + "compiled-plots.aida"); + System.out.println("Plots written to path " + rootDir + "compiled-plots.aida"); + } + + private static final List<String> getTreeFiles(ITree tree) { + return getTreeFiles(tree, "/"); + } + + private static final List<String> getTreeFiles(ITree tree, String rootDir) { + // Make a list to contain the plot names. + List<String> list = new ArrayList<String>(); + + // Iterate over the objects at the indicated directory of the tree. + String objectNames[] = tree.listObjectNames(rootDir); + for(String objectName : objectNames) { + // Convert the object name to a char array and check the + // last character. Directories end in '/'. + char[] plotChars = objectName.toCharArray(); + + // If the object is a directory, process any objects inside + // of it as well. + if(plotChars[plotChars.length - 1] == '/') { + List<String> dirList = getTreeFiles(tree, objectName); + list.addAll(dirList); + } + + // Otherwise, just add the object to the list. + else { list.add(objectName); } + } + + // Return the compiled list. + return list; + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot.java Wed Mar 9 11:43:24 2016 @@ -1,25 +1,25 @@ package org.hps.users.kmccarty.plots; public abstract class FormattedPlot { - private final String xAxis; - private final String yAxis; - private final String plotName; - - public FormattedPlot(String xAxis, String yAxis, String plotName) { - this.xAxis = xAxis; - this.yAxis = yAxis; - this.plotName = plotName; - } - - public String getPlotName() { - return plotName; - } - - public String getXAxisName() { - return xAxis; - } - - public String getYAxisName() { - return yAxis; - } + private final String xAxis; + private final String yAxis; + private final String plotName; + + public FormattedPlot(String xAxis, String yAxis, String plotName) { + this.xAxis = xAxis; + this.yAxis = yAxis; + this.plotName = plotName; + } + + public String getPlotName() { + return plotName; + } + + public String getXAxisName() { + return xAxis; + } + + public String getYAxisName() { + return yAxis; + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot1D.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot1D.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot1D.java Wed Mar 9 11:43:24 2016 @@ -5,37 +5,37 @@ import hep.aida.IHistogram1D; public class FormattedPlot1D extends FormattedPlot { - private final ColorStyle style; - private final IHistogram1D plot; - private final double axisRange; - - public FormattedPlot1D(IHistogram1D plot, ColorStyle style, String xAxis, String yAxis, String plotName) { - super(xAxis, yAxis, plotName); - this.plot = plot; - this.style = style; - this.axisRange = -1; - } - - public FormattedPlot1D(IHistogram1D plot, ColorStyle style, String xAxis, String yAxis, String plotName, double axisRange) { - super(xAxis, yAxis, plotName); - this.plot = plot; - this.style = style; - this.axisRange = axisRange; - } - - public IHistogram1D getPlot() { - return plot; - } - - public ColorStyle getColorStyle() { - return style; - } - - public boolean definesAxisRange() { - return axisRange != -1; - } - - public double getAxisRange() { - return axisRange; - } + private final ColorStyle style; + private final IHistogram1D plot; + private final double axisRange; + + public FormattedPlot1D(IHistogram1D plot, ColorStyle style, String xAxis, String yAxis, String plotName) { + super(xAxis, yAxis, plotName); + this.plot = plot; + this.style = style; + this.axisRange = -1; + } + + public FormattedPlot1D(IHistogram1D plot, ColorStyle style, String xAxis, String yAxis, String plotName, double axisRange) { + super(xAxis, yAxis, plotName); + this.plot = plot; + this.style = style; + this.axisRange = axisRange; + } + + public IHistogram1D getPlot() { + return plot; + } + + public ColorStyle getColorStyle() { + return style; + } + + public boolean definesAxisRange() { + return axisRange != -1; + } + + public double getAxisRange() { + return axisRange; + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot2D.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot2D.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot2D.java Wed Mar 9 11:43:24 2016 @@ -3,48 +3,48 @@ import hep.aida.IHistogram2D; public class FormattedPlot2D extends FormattedPlot { - private final IHistogram2D plot; - private final boolean logarithmic; - private final double xAxisRange; - private final double yAxisRange; - - public FormattedPlot2D(IHistogram2D plot, boolean logarithmic, String xAxis, String yAxis, String plotName) { - super(xAxis, yAxis, plotName); - this.plot = plot; - this.xAxisRange = -1; - this.yAxisRange = -1; - this.logarithmic = logarithmic; - } - - public FormattedPlot2D(IHistogram2D plot, boolean logarithmic, String xAxis, String yAxis, String plotName, double xAxisRange, double yAxisRange) { - super(xAxis, yAxis, plotName); - this.plot = plot; - this.xAxisRange = xAxisRange; - this.yAxisRange = yAxisRange; - this.logarithmic = logarithmic; - } - - public IHistogram2D getPlot() { - return plot; - } - - public boolean isLogarithmic() { - return logarithmic; - } - - public boolean definesXAxisRange() { - return xAxisRange != -1; - } - - public boolean definesYAxisRange() { - return yAxisRange != -1; - } - - public double getXAxisRange() { - return xAxisRange; - } - - public double getYAxisRange() { - return yAxisRange; - } + private final IHistogram2D plot; + private final boolean logarithmic; + private final double xAxisRange; + private final double yAxisRange; + + public FormattedPlot2D(IHistogram2D plot, boolean logarithmic, String xAxis, String yAxis, String plotName) { + super(xAxis, yAxis, plotName); + this.plot = plot; + this.xAxisRange = -1; + this.yAxisRange = -1; + this.logarithmic = logarithmic; + } + + public FormattedPlot2D(IHistogram2D plot, boolean logarithmic, String xAxis, String yAxis, String plotName, double xAxisRange, double yAxisRange) { + super(xAxis, yAxis, plotName); + this.plot = plot; + this.xAxisRange = xAxisRange; + this.yAxisRange = yAxisRange; + this.logarithmic = logarithmic; + } + + public IHistogram2D getPlot() { + return plot; + } + + public boolean isLogarithmic() { + return logarithmic; + } + + public boolean definesXAxisRange() { + return xAxisRange != -1; + } + + public boolean definesYAxisRange() { + return yAxisRange != -1; + } + + public double getXAxisRange() { + return xAxisRange; + } + + public double getYAxisRange() { + return yAxisRange; + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/PlotFormatModule.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/PlotFormatModule.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/PlotFormatModule.java Wed Mar 9 11:43:24 2016 @@ -17,189 +17,189 @@ import java.util.List; public class PlotFormatModule { - private String width = "2000"; - private String height = "1200"; - private List<FormattedPlot1D> formattedPlots1D = new ArrayList<FormattedPlot1D>(); - private List<FormattedPlot2D> formattedPlots2D = new ArrayList<FormattedPlot2D>(); - - public void addPlot1D(FormattedPlot1D plot) { - formattedPlots1D.add(plot); - } - - public void addPlot2D(FormattedPlot2D plot) { - formattedPlots2D.add(plot); - } - - public void setDisplayHeight(int height) { - this.height = "" + height; - } - - public void setDisplayWidth(int width) { - this.width = "" + width; - } - - public void displayPlots() { - try { processPlots(null); } - catch (IOException e) { e.printStackTrace(); } - } - - public void savePlots(String filePath) throws IOException { - processPlots(filePath); - } - - private void processPlots(String filePath) throws IOException { - // Create a plotter factory. - IAnalysisFactory af = IAnalysisFactory.create(); - IPlotterFactory plotterFactory = af.createPlotterFactory(); - - // Format and display the 1D plots. - for(FormattedPlot1D formattedPlot : formattedPlots1D) { - // Get the plot. - IHistogram1D plot = formattedPlot.getPlot(); - - // Create a plotter and plotting region for the plot. - IPlotter plotter = plotterFactory.create(plot.title()); - plotter.createRegions(1); - plotter.region(0).plot(plot); - - // Set the axis range. - PlotterRegion region = (PlotterRegion) plotter.region(0); - if(formattedPlot.definesAxisRange()) { - region.getPlot().getXAxis().setMax(formattedPlot.getAxisRange()); - } - - // Format the axis labels. - region.getPlot().setTitle(formattedPlot.getPlotName()); - region.getPlot().getXAxis().setLabel(formattedPlot.getXAxisName()); - region.getPlot().getYAxis().setLabel(formattedPlot.getYAxisName()); - - // Format the fonts and general plot presentation. - PlotsFormatter.setDefault1DStyle(region, new ColorStyle[] { formattedPlot.getColorStyle() }); - - // Set the plotter dimensions. - plotter.setParameter("plotterWidth", width); - plotter.setParameter("plotterHeight", height); - - // If the file path is null, display the plots. Otherwise, - // save them to the destination folder. - if(filePath == null) { plotter.show(); } - else { - File plotFile = new File(filePath + formattedPlot.getPlotName() + ".png"); - if(plotFile.exists()) { plotFile.delete(); } - plotter.writeToFile(filePath + formattedPlot.getPlotName() + ".png"); - System.out.printf("Saved plot \"%s\" to path: %s%n", formattedPlot.getPlotName(), filePath + formattedPlot.getPlotName() + ".png"); - } - } - - // Format and display the 2D plots. - for(FormattedPlot2D formattedPlot : formattedPlots2D) { - // Get the plot. - IHistogram2D plot = formattedPlot.getPlot(); - - // Create a plotter and plotting region for the plot. - IPlotter plotter = plotterFactory.create(formattedPlot.getPlotName()); - plotter.createRegions(1); - plotter.region(0).plot(plot); - - // Set the axis range. - PlotterRegion region = (PlotterRegion) plotter.region(0); - if(formattedPlot.definesXAxisRange()) { - region.getPlot().getXAxis().setMax(formattedPlot.getXAxisRange()); - } if(formattedPlot.definesYAxisRange()) { - region.getPlot().getYAxis().setMax(formattedPlot.getYAxisRange()); - } - - // Format the axis labels. - region.getPlot().setTitle(formattedPlot.getPlotName()); - region.getPlot().getXAxis().setLabel(formattedPlot.getXAxisName()); - region.getPlot().getYAxis().setLabel(formattedPlot.getYAxisName()); - - // Format the fonts and general plot presentation. - PlotsFormatter.setDefault2DStyle(region, formattedPlot.isLogarithmic()); - - // Set the plotter dimensions. - plotter.setParameter("plotterWidth", width); - plotter.setParameter("plotterHeight", height); - - // If the file path is null, display the plots. Otherwise, - // save them to the destination folder. - if(filePath == null) { plotter.show(); } - else { - File plotFile = new File(filePath + formattedPlot.getPlotName() + ".png"); - if(plotFile.exists()) { plotFile.delete(); } - plotter.writeToFile(filePath + formattedPlot.getPlotName() + ".png"); - System.out.printf("Saved plot \"%s\" to path: %s%n", formattedPlot.getPlotName(), filePath + formattedPlot.getPlotName() + ".png"); - } - } - } - - public void exportPlots(String filePath) throws IOException { - // Export the 1D plots in a text format. - for(FormattedPlot1D plot : formattedPlots1D) { - exportPlot(filePath, plot); - } - - // Export the 2D plots in a text format. - for(FormattedPlot2D plot : formattedPlots2D) { - exportPlot(filePath, plot); - } - } - - private static final void exportPlot(String filePath, FormattedPlot plot) throws IOException { - // Check if this is a one or two dimensional plot. - boolean is1D = plot instanceof FormattedPlot1D; - - // Create a file object for the plot. - String plotPath = filePath + plot.getPlotName() + (is1D ? ".aida1D" : ".aida2D"); - File datFile = new File(plotPath); - - // If the plot file already exists, delete it. - if(datFile.exists()) { datFile.delete(); } - - // Create a new file for the plot to occupy. - datFile.createNewFile(); - - // Get the textual form of the plot. - String plotText = null; - if(is1D) { plotText = toTextFormat(((FormattedPlot1D) plot).getPlot()); } - else { plotText = toTextFormat(((FormattedPlot2D) plot).getPlot()); } - - // Write the plot text to the file. - BufferedWriter writer = new BufferedWriter(new FileWriter(datFile)); - writer.write(plotText); - writer.close(); - - // Note that the file was written. - System.out.printf("Plot \"%s\" was exported to path: %s%n", plot.getPlotName(), plotPath); - } - - private static final String toTextFormat(IHistogram1D plot) { - // Create a buffer to hold the converted plot. - StringBuffer buffer = new StringBuffer(); - - // Iterate over the bins and output the plot in the format of - // "[BIN_MEAN] [BIN_VALUE]" with a tab delimiter. - for(int bin = 0; bin < plot.axis().bins(); bin++) { - buffer.append(String.format("%f\t%f%n", plot.binMean(bin), plot.binHeight(bin))); - } - - // Return the converted file. - return buffer.toString(); - } - - private static final String toTextFormat(IHistogram2D plot) { - // Create a buffer to hold the converted plot. - StringBuffer buffer = new StringBuffer(); - - // Iterate over the bins and output the plot in the format of - // "[X_BIN_MEAN] [Y_BIN_MEAN] [BIN_VALUE]" with a tab delimiter. - for(int xBin = 0; xBin < plot.xAxis().bins(); xBin++) { - for(int yBin = 0; yBin < plot.yAxis().bins(); yBin++) { - buffer.append(String.format("%f\t%f\t%f%n", plot.binMeanX(xBin, yBin), plot.binMeanY(xBin, yBin), plot.binHeight(xBin, yBin))); - } - } - - // Return the converted file. - return buffer.toString(); - } + private String width = "2000"; + private String height = "1200"; + private List<FormattedPlot1D> formattedPlots1D = new ArrayList<FormattedPlot1D>(); + private List<FormattedPlot2D> formattedPlots2D = new ArrayList<FormattedPlot2D>(); + + public void addPlot1D(FormattedPlot1D plot) { + formattedPlots1D.add(plot); + } + + public void addPlot2D(FormattedPlot2D plot) { + formattedPlots2D.add(plot); + } + + public void setDisplayHeight(int height) { + this.height = "" + height; + } + + public void setDisplayWidth(int width) { + this.width = "" + width; + } + + public void displayPlots() { + try { processPlots(null); } + catch (IOException e) { e.printStackTrace(); } + } + + public void savePlots(String filePath) throws IOException { + processPlots(filePath); + } + + private void processPlots(String filePath) throws IOException { + // Create a plotter factory. + IAnalysisFactory af = IAnalysisFactory.create(); + IPlotterFactory plotterFactory = af.createPlotterFactory(); + + // Format and display the 1D plots. + for(FormattedPlot1D formattedPlot : formattedPlots1D) { + // Get the plot. + IHistogram1D plot = formattedPlot.getPlot(); + + // Create a plotter and plotting region for the plot. + IPlotter plotter = plotterFactory.create(plot.title()); + plotter.createRegions(1); + plotter.region(0).plot(plot); + + // Set the axis range. + PlotterRegion region = (PlotterRegion) plotter.region(0); + if(formattedPlot.definesAxisRange()) { + region.getPlot().getXAxis().setMax(formattedPlot.getAxisRange()); + } + + // Format the axis labels. + region.getPlot().setTitle(formattedPlot.getPlotName()); + region.getPlot().getXAxis().setLabel(formattedPlot.getXAxisName()); + region.getPlot().getYAxis().setLabel(formattedPlot.getYAxisName()); + + // Format the fonts and general plot presentation. + PlotsFormatter.setDefault1DStyle(region, new ColorStyle[] { formattedPlot.getColorStyle() }); + + // Set the plotter dimensions. + plotter.setParameter("plotterWidth", width); + plotter.setParameter("plotterHeight", height); + + // If the file path is null, display the plots. Otherwise, + // save them to the destination folder. + if(filePath == null) { plotter.show(); } + else { + File plotFile = new File(filePath + formattedPlot.getPlotName() + ".png"); + if(plotFile.exists()) { plotFile.delete(); } + plotter.writeToFile(filePath + formattedPlot.getPlotName() + ".png"); + System.out.printf("Saved plot \"%s\" to path: %s%n", formattedPlot.getPlotName(), filePath + formattedPlot.getPlotName() + ".png"); + } + } + + // Format and display the 2D plots. + for(FormattedPlot2D formattedPlot : formattedPlots2D) { + // Get the plot. + IHistogram2D plot = formattedPlot.getPlot(); + + // Create a plotter and plotting region for the plot. + IPlotter plotter = plotterFactory.create(formattedPlot.getPlotName()); + plotter.createRegions(1); + plotter.region(0).plot(plot); + + // Set the axis range. + PlotterRegion region = (PlotterRegion) plotter.region(0); + if(formattedPlot.definesXAxisRange()) { + region.getPlot().getXAxis().setMax(formattedPlot.getXAxisRange()); + } if(formattedPlot.definesYAxisRange()) { + region.getPlot().getYAxis().setMax(formattedPlot.getYAxisRange()); + } + + // Format the axis labels. + region.getPlot().setTitle(formattedPlot.getPlotName()); + region.getPlot().getXAxis().setLabel(formattedPlot.getXAxisName()); + region.getPlot().getYAxis().setLabel(formattedPlot.getYAxisName()); + + // Format the fonts and general plot presentation. + PlotsFormatter.setDefault2DStyle(region, formattedPlot.isLogarithmic()); + + // Set the plotter dimensions. + plotter.setParameter("plotterWidth", width); + plotter.setParameter("plotterHeight", height); + + // If the file path is null, display the plots. Otherwise, + // save them to the destination folder. + if(filePath == null) { plotter.show(); } + else { + File plotFile = new File(filePath + formattedPlot.getPlotName() + ".png"); + if(plotFile.exists()) { plotFile.delete(); } + plotter.writeToFile(filePath + formattedPlot.getPlotName() + ".png"); + System.out.printf("Saved plot \"%s\" to path: %s%n", formattedPlot.getPlotName(), filePath + formattedPlot.getPlotName() + ".png"); + } + } + } + + public void exportPlots(String filePath) throws IOException { + // Export the 1D plots in a text format. + for(FormattedPlot1D plot : formattedPlots1D) { + exportPlot(filePath, plot); + } + + // Export the 2D plots in a text format. + for(FormattedPlot2D plot : formattedPlots2D) { + exportPlot(filePath, plot); + } + } + + private static final void exportPlot(String filePath, FormattedPlot plot) throws IOException { + // Check if this is a one or two dimensional plot. + boolean is1D = plot instanceof FormattedPlot1D; + + // Create a file object for the plot. + String plotPath = filePath + plot.getPlotName() + (is1D ? ".aida1D" : ".aida2D"); + File datFile = new File(plotPath); + + // If the plot file already exists, delete it. + if(datFile.exists()) { datFile.delete(); } + + // Create a new file for the plot to occupy. + datFile.createNewFile(); + + // Get the textual form of the plot. + String plotText = null; + if(is1D) { plotText = toTextFormat(((FormattedPlot1D) plot).getPlot()); } + else { plotText = toTextFormat(((FormattedPlot2D) plot).getPlot()); } + + // Write the plot text to the file. + BufferedWriter writer = new BufferedWriter(new FileWriter(datFile)); + writer.write(plotText); + writer.close(); + + // Note that the file was written. + System.out.printf("Plot \"%s\" was exported to path: %s%n", plot.getPlotName(), plotPath); + } + + private static final String toTextFormat(IHistogram1D plot) { + // Create a buffer to hold the converted plot. + StringBuffer buffer = new StringBuffer(); + + // Iterate over the bins and output the plot in the format of + // "[BIN_MEAN] [BIN_VALUE]" with a tab delimiter. + for(int bin = 0; bin < plot.axis().bins(); bin++) { + buffer.append(String.format("%f\t%f%n", plot.binMean(bin), plot.binHeight(bin))); + } + + // Return the converted file. + return buffer.toString(); + } + + private static final String toTextFormat(IHistogram2D plot) { + // Create a buffer to hold the converted plot. + StringBuffer buffer = new StringBuffer(); + + // Iterate over the bins and output the plot in the format of + // "[X_BIN_MEAN] [Y_BIN_MEAN] [BIN_VALUE]" with a tab delimiter. + for(int xBin = 0; xBin < plot.xAxis().bins(); xBin++) { + for(int yBin = 0; yBin < plot.yAxis().bins(); yBin++) { + buffer.append(String.format("%f\t%f\t%f%n", plot.binMeanX(xBin, yBin), plot.binMeanY(xBin, yBin), plot.binHeight(xBin, yBin))); + } + } + + // Return the converted file. + return buffer.toString(); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/PlotsFormatter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/PlotsFormatter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/PlotsFormatter.java Wed Mar 9 11:43:24 2016 @@ -8,120 +8,120 @@ import java.awt.Font; public class PlotsFormatter { - // Define plot fonts. - public static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 30); - public static final Font AXIS_FONT = new Font("Calibri", Font.BOLD, 35); - public static final Font TITLE_FONT = new Font("Calibri", Font.BOLD, 45); - - // Defines the color style options for plot data. - public static enum ColorStyle { - MS_BLUE(new Color( 79, 129, 189), new Color( 36, 64, 97)), MS_ORANGE(new Color(247, 150, 70), new Color(152, 72, 6)), - MS_RED(new Color(192, 80, 77), new Color( 99, 36, 35)), GREY(new Color(166, 166, 166), new Color( 89, 89, 89)), - MS_GREEN(new Color(155, 187, 89), new Color( 79, 98, 40)), CRIMSON(new Color(161, 0, 0), new Color(104, 0, 0)), - RUST(new Color(161, 80, 0), new Color(105, 80, 0)), YELLOW(new Color(161, 161, 0), new Color(122, 109, 8)), - FOREST(new Color( 65, 102, 0), new Color( 37, 79, 0)), GREEN(new Color( 7, 132, 70), new Color( 7, 82, 30)), - TEAL(new Color( 0, 130, 130), new Color( 0, 90, 100)), CERULEAN(new Color( 0, 86, 130), new Color( 0, 28, 83)), - BLUE(new Color( 0, 33, 203), new Color( 0, 0, 137)), INDIGO(new Color( 68, 10, 127), new Color( 0, 0, 61)), - PURPLE(new Color(106, 0, 106), new Color( 63, 0, 56)), FUSCHIA(new Color(119, 0, 60), new Color( 60, 0, 60)); - - private final Color fillColor; - private final Color lineColor; - - private ColorStyle(Color fillColor, Color lineColor) { - this.fillColor = fillColor; - this.lineColor = lineColor; - } - - public Color getFillColor() { return fillColor; } - - public Color getLineColor() { return lineColor; } - }; - - /** - * Sets the plot display formatting for 1D plots. - * @param region - The plotter region to format. - * @param color - The data color settings to use. - */ - public static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) { - // Get the names of each plot on in the region. - String[] dataNames = region.getAllDataNames(); - - // Check whether this is an overlay plot. Overlay plots contain - // more than one data name. - boolean overlay = (dataNames.length > 1 ? true : false); - - // Iterate over each plot in the region. - for(int i = 0; i < dataNames.length; i++) { - // Set the overlay style if needed. - if(overlay) { - // Get the fill style for the current data type. - JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); - - // Set the histogram style to display thick-lined bars - // with no fill. The color is set by the "color" argument. - fillStyle.setHistogramFill(false); - fillStyle.setHistogramBarLineWidth(3); - fillStyle.setHistogramBarLineColor(color[i].getFillColor()); - - // Set the legend text style. - region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20)); - } - - // Otherwise, set the fill style for a single plot. - else { - // Get the fill style for the current data type. - JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); - - // Set the histogram style to display thick-lined bars - // with a fill color. The colors are defined by the - // "color" argument. - fillStyle.setHistogramBarLineWidth(3); - fillStyle.setHistogramBarColor(color[i].getFillColor()); - fillStyle.setHistogramBarLineColor(color[i].getLineColor()); - } - - // Set the statistics box style. - region.getPlot().getStats().setVisible(true); - region.getPlot().getStats().setFont(BASIC_FONT); - - // Set the title font. - region.getPlot().getTitleObject().setFont(TITLE_FONT); - - // Set the axis tick-mark fonts. - region.getPlot().getXAxis().setFont(BASIC_FONT); - region.getPlot().getYAxis().setFont(BASIC_FONT); - region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); - region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); - } - } - - /** - * Sets the plot display formatting for 1D plots. - * @param region - The plotter region to format. - */ - public static final void setDefault2DStyle(PlotterRegion region, boolean logarithmic) { - // Get the fill style object. 2D plots should never be overlay - // plots, so there should only ever be one data name. - JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); - - // Set the fill style for a two-dimensional plot. - if(logarithmic) { fillStyle.setLogZ(true); } - fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP); - fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW); - - // Make the statistics box invisible. - region.getPlot().getStats().setVisible(false); - - // Set the general plot font (which is also the z-axis font). - region.getPlot().setFont(BASIC_FONT); - - // Set the title font. - region.getPlot().getTitleObject().setFont(TITLE_FONT); - - // Set the axis tick-mark fonts. - region.getPlot().getXAxis().setFont(BASIC_FONT); - region.getPlot().getYAxis().setFont(BASIC_FONT); - region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); - region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); - } + // Define plot fonts. + public static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 30); + public static final Font AXIS_FONT = new Font("Calibri", Font.BOLD, 35); + public static final Font TITLE_FONT = new Font("Calibri", Font.BOLD, 45); + + // Defines the color style options for plot data. + public static enum ColorStyle { + MS_BLUE(new Color( 79, 129, 189), new Color( 36, 64, 97)), MS_ORANGE(new Color(247, 150, 70), new Color(152, 72, 6)), + MS_RED(new Color(192, 80, 77), new Color( 99, 36, 35)), GREY(new Color(166, 166, 166), new Color( 89, 89, 89)), + MS_GREEN(new Color(155, 187, 89), new Color( 79, 98, 40)), CRIMSON(new Color(161, 0, 0), new Color(104, 0, 0)), + RUST(new Color(161, 80, 0), new Color(105, 80, 0)), YELLOW(new Color(161, 161, 0), new Color(122, 109, 8)), + FOREST(new Color( 65, 102, 0), new Color( 37, 79, 0)), GREEN(new Color( 7, 132, 70), new Color( 7, 82, 30)), + TEAL(new Color( 0, 130, 130), new Color( 0, 90, 100)), CERULEAN(new Color( 0, 86, 130), new Color( 0, 28, 83)), + BLUE(new Color( 0, 33, 203), new Color( 0, 0, 137)), INDIGO(new Color( 68, 10, 127), new Color( 0, 0, 61)), + PURPLE(new Color(106, 0, 106), new Color( 63, 0, 56)), FUSCHIA(new Color(119, 0, 60), new Color( 60, 0, 60)); + + private final Color fillColor; + private final Color lineColor; + + private ColorStyle(Color fillColor, Color lineColor) { + this.fillColor = fillColor; + this.lineColor = lineColor; + } + + public Color getFillColor() { return fillColor; } + + public Color getLineColor() { return lineColor; } + }; + + /** + * Sets the plot display formatting for 1D plots. + * @param region - The plotter region to format. + * @param color - The data color settings to use. + */ + public static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) { + // Get the names of each plot on in the region. + String[] dataNames = region.getAllDataNames(); + + // Check whether this is an overlay plot. Overlay plots contain + // more than one data name. + boolean overlay = (dataNames.length > 1 ? true : false); + + // Iterate over each plot in the region. + for(int i = 0; i < dataNames.length; i++) { + // Set the overlay style if needed. + if(overlay) { + // Get the fill style for the current data type. + JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); + + // Set the histogram style to display thick-lined bars + // with no fill. The color is set by the "color" argument. + fillStyle.setHistogramFill(false); + fillStyle.setHistogramBarLineWidth(3); + fillStyle.setHistogramBarLineColor(color[i].getFillColor()); + + // Set the legend text style. + region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20)); + } + + // Otherwise, set the fill style for a single plot. + else { + // Get the fill style for the current data type. + JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); + + // Set the histogram style to display thick-lined bars + // with a fill color. The colors are defined by the + // "color" argument. + fillStyle.setHistogramBarLineWidth(3); + fillStyle.setHistogramBarColor(color[i].getFillColor()); + fillStyle.setHistogramBarLineColor(color[i].getLineColor()); + } + + // Set the statistics box style. + region.getPlot().getStats().setVisible(true); + region.getPlot().getStats().setFont(BASIC_FONT); + + // Set the title font. + region.getPlot().getTitleObject().setFont(TITLE_FONT); + + // Set the axis tick-mark fonts. + region.getPlot().getXAxis().setFont(BASIC_FONT); + region.getPlot().getYAxis().setFont(BASIC_FONT); + region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); + region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); + } + } + + /** + * Sets the plot display formatting for 1D plots. + * @param region - The plotter region to format. + */ + public static final void setDefault2DStyle(PlotterRegion region, boolean logarithmic) { + // Get the fill style object. 2D plots should never be overlay + // plots, so there should only ever be one data name. + JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); + + // Set the fill style for a two-dimensional plot. + if(logarithmic) { fillStyle.setLogZ(true); } + fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP); + fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW); + + // Make the statistics box invisible. + region.getPlot().getStats().setVisible(false); + + // Set the general plot font (which is also the z-axis font). + region.getPlot().setFont(BASIC_FONT); + + // Set the title font. + region.getPlot().getTitleObject().setFont(TITLE_FONT); + + // Set the axis tick-mark fonts. + region.getPlot().getXAxis().setFont(BASIC_FONT); + region.getPlot().getYAxis().setFont(BASIC_FONT); + region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); + region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/InvariantMassPlotsFormatter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/InvariantMassPlotsFormatter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/InvariantMassPlotsFormatter.java Wed Mar 9 11:43:24 2016 @@ -19,317 +19,317 @@ import hep.aida.ref.plotter.PlotterRegion; public class InvariantMassPlotsFormatter { - // Define plot fonts. - private static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 20); - private static final Font AXIS_FONT = new Font("Calibri", Font.BOLD, 25); - private static final Font TITLE_FONT = new Font("Calibri", Font.BOLD, 35); - - // Defines the color style options for plot data. - private enum ColorStyle { - MS_BLUE(new Color( 79, 129, 189), new Color( 36, 64, 97)), MS_ORANGE(new Color(247, 150, 70), new Color(152, 72, 6)), - MS_RED(new Color(192, 80, 77), new Color( 99, 36, 35)), GREY(new Color(166, 166, 166), new Color( 89, 89, 89)), - MS_GREEN(new Color(155, 187, 89), new Color( 79, 98, 40)), CRIMSON(new Color(161, 0, 0), new Color(104, 0, 0)), - RUST(new Color(161, 80, 0), new Color(105, 80, 0)), YELLOW(new Color(161, 161, 0), new Color(122, 109, 8)), - FOREST(new Color( 65, 102, 0), new Color( 37, 79, 0)), GREEN(new Color( 7, 132, 70), new Color( 7, 82, 30)), - TEAL(new Color( 0, 130, 130), new Color( 0, 90, 100)), CERULEAN(new Color( 0, 86, 130), new Color( 0, 28, 83)), - BLUE(new Color( 0, 33, 203), new Color( 0, 0, 137)), INDIGO(new Color( 68, 10, 127), new Color( 0, 0, 61)), - PURPLE(new Color(106, 0, 106), new Color( 63, 0, 56)), FUSCHIA(new Color(119, 0, 60), new Color( 60, 0, 60)); - - private final Color fillColor; - private final Color lineColor; - - private ColorStyle(Color fillColor, Color lineColor) { - this.fillColor = fillColor; - this.lineColor = lineColor; - } - - public Color getFillColor() { return fillColor; } - - public Color getLineColor() { return lineColor; } - }; - - /** - * Loads all plots in a file and formats them according to the - * indicated style. - * @param args - Unused default executable parameter. - * @throws IOException Occurs if there is an issue opening the file. - */ - public static void main(String[] args) throws IOException { - // Define the root directory for the plots. - String rootDir = "D:\\cygwin64\\home\\Kyle\\"; - - // Define the new name of the file containing the trigger plots. - String[] plotFile = { - rootDir + "temp.aida" - }; - - // Define the run numbers for each file. - String[] runNumber = { "1 Hits", "2 Hits" }; - - // Define the scaling factors for each plot. - double scaleFactor = 13.254; - - // Get the plots file and open it. - IAnalysisFactory af = IAnalysisFactory.create(); - ITree[] tree = new ITree[plotFile.length]; - for(int i = 0; i < plotFile.length; i++) { - tree[i] = af.createTreeFactory().create(plotFile[i]); - if(tree[i] == null) { throw new IllegalArgumentException("Unable to load plot file."); } - } - - // Get the histograms. - IHistogram1D[] invariantMassPlots = new IHistogram1D[3]; - invariantMassPlots[0] = (IHistogram1D) tree[0].find("Trident Analysis/Particle Invariant Mass (1 Hit)"); - invariantMassPlots[1] = (IHistogram1D) tree[0].find("Trident Analysis/Particle Invariant Mass (2 Hit)"); - IHistogram1D electronEnergyPlot = (IHistogram1D) tree[0].find("Trident Analysis/Electron Energy"); - IHistogram1D positronEnergyPlot = (IHistogram1D) tree[0].find("Trident Analysis/Positron Energy"); - IHistogram1D energySumPlot = (IHistogram1D) tree[0].find("Trident Analysis/Energy Sum Distribution"); - IHistogram2D energySum2DPlot = (IHistogram2D) tree[0].find("Trident Analysis/2D Energy Distribution"); - IHistogram1D tridentElectronEnergyPlot = (IHistogram1D) tree[0].find("Trident Analysis/Trident Electron Energy"); - IHistogram1D tridentPositronEnergyPlot = (IHistogram1D) tree[0].find("Trident Analysis/Trident Positron Energy"); - - // Define the plot titles and arrays. - IHistogram[] plots = { electronEnergyPlot, positronEnergyPlot, energySumPlot, tridentElectronEnergyPlot, tridentPositronEnergyPlot }; - String[] titles = { "Electron Energy", "Positron Energy", "Energy Sum", "Trident Electron Energy", "Trident Positron Energy" }; - String[] xTitles = { "Energy (GeV)", "Energy (GeV)", "Energy Sum (GeV)", "Energy (GeV)", "Energy (GeV)" }; - - // Re-bin the histograms to have 5-times larger bins. First, - // get the bin count and upper and lower bounds of the plot. - int bins = invariantMassPlots[0].axis().bins(); - double low = invariantMassPlots[0].axis().binLowerEdge(0); - double high = invariantMassPlots[0].axis().binUpperEdge(invariantMassPlots[0].axis().bins() - 1); - - // Create new plots with the larger bin sizes. - AIDA aida = AIDA.defaultInstance(); - IHistogram1D[] newPlot = new IHistogram1D[2]; - newPlot[0] = aida.histogram1D("Particle Invariant Mass (1 Hit)", bins / 5, low, high); - newPlot[1] = aida.histogram1D("Particle Invariant Mass (2 Hit)", bins / 5, low, high); - - // Populate the new plots with the data from the old ones. - for(int j = 0; j < 2; j++) { - for(int i = 0; i < bins; i++) { - int entries = invariantMassPlots[j].binEntries(i); - double center = invariantMassPlots[j].axis().binCenter(i); - for(int k = 0; k < entries; k++) { - newPlot[j].fill(center); - } - } - } - - // Replace the old plots. - invariantMassPlots = newPlot; - - // Create a plotter factory. - IPlotterFactory plotterFactory = af.createPlotterFactory(); - - // Format and display the basic histograms. - for(int i = 0; i < plots.length; i++) { - // Scale the histogram by the appropriate scaling factor. - plots[i].scale(1.0 / scaleFactor); - - // Create a plotter and plotting region for the plot. - IPlotter plotter = plotterFactory.create(titles[i]); - plotter.createRegions(1); - plotter.region(0).plot(plots[i]); - - // Format the axis labels. - PlotterRegion region = (PlotterRegion) plotter.region(0); - region.getPlot().setTitle(titles[i]); - region.getPlot().getXAxis().setLabel(xTitles[i]); - region.getPlot().getYAxis().setLabel("Rate (Hz)"); - - // Format the fonts and general plot presentation. - setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); - - // Show the plot. - plotter.setParameter("plotterWidth", "2000"); - plotter.setParameter("plotterHeight", "1200"); - plotter.show(); - } - - // Format and display the 2D histogram. - energySum2DPlot.scale(1.0 / scaleFactor); - IPlotter plotter2D = plotterFactory.create("2D Energy Sum"); - plotter2D.createRegions(1); - plotter2D.region(0).plot(energySum2DPlot); - - // Format the axis labels. - PlotterRegion region2D = (PlotterRegion) plotter2D.region(0); - region2D.getPlot().setTitle("2D Energy Sum"); - region2D.getPlot().getXAxis().setLabel("Electron Energy (GeV)"); - region2D.getPlot().getYAxis().setLabel("Positron Energy (GeV)"); - - // Format the fonts and general plot presentation. - setDefault2DStyle(region2D, false); - - // Show the plot. - plotter2D.setParameter("plotterWidth", "2000"); - plotter2D.setParameter("plotterHeight", "1200"); - plotter2D.show(); - - // Format and display the histograms. - for(int i = 0; i < 2; i++) { - // Scale the histogram by the appropriate scaling factor. - invariantMassPlots[i].scale(1.0 / scaleFactor); - - // Create a plotter and plotting region for the plot. - IPlotter plotter = plotterFactory.create("Particle Invariant Mass (" + runNumber[i] + ")"); - plotter.createRegions(1); - plotter.region(0).plot(invariantMassPlots[i]); - - // Format the axis labels. - PlotterRegion region = (PlotterRegion) plotter.region(0); - region.getPlot().setTitle("Particle Invariant Mass (" + runNumber[i] + ")"); - region.getPlot().getXAxis().setLabel("Invariant Mass (GeV)"); - region.getPlot().getYAxis().setLabel("Rate (Hz)"); - - // Format the fonts and general plot presentation. - setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); - - // Show the plot. - plotter.setParameter("plotterWidth", "2000"); - plotter.setParameter("plotterHeight", "1200"); - plotter.show(); - } - - // Note which plot is the numerator and which is the denominator. - int numerator = 0; - int denominator = 1; - - // Create a new histogram to display the ratios of the rates. - IHistogram1D ratioPlot = AIDA.defaultInstance().histogram1D("Invariant Mass Ratio (" + runNumber[numerator] + " / " - + runNumber[denominator] + ")", invariantMassPlots[0].axis().bins(), - invariantMassPlots[0].axis().lowerEdge(), invariantMassPlots[0].axis().upperEdge()); - - // Iterate over each bin. - for(int bin = 0; bin < invariantMassPlots[0].axis().bins(); bin++) { - // Calculate the ratio. - double ratio = invariantMassPlots[numerator].binHeight(bin) / invariantMassPlots[denominator].binHeight(bin); - - // If the ratio is either not a number of infinite, skip - // this bin. - if(Double.isNaN(ratio) || Double.isInfinite(ratio)) { continue; } - - // Populate the ratio plot bin. - ratioPlot.fill(invariantMassPlots[0].axis().binCenter(bin), ratio); - } - - // Create a plotter and plotting region for the plot. - IPlotter plotter = plotterFactory.create("Invariant Mass Ratio (5411 / 5554)"); - plotter.createRegions(1); - plotter.region(0).plot(ratioPlot); - - // Format the axis labels. - PlotterRegion region = (PlotterRegion) plotter.region(0); - region.getPlot().setTitle("Invariant Mass Ratio (" + runNumber[numerator] + " / " + runNumber[denominator] + ")"); - region.getPlot().getXAxis().setLabel("Invariant Mass (GeV)"); - region.getPlot().getXAxis().setMin(0.010); - region.getPlot().getXAxis().setMax(0.060); - region.getPlot().getYAxis().setLabel("Ratio"); - - // Format the fonts and general plot presentation. - setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); - - // Disable the error bars. - JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); - fillStyle.setShowErrorBars(false); - - // Show the plot. - plotter.setParameter("plotterWidth", "2000"); - plotter.setParameter("plotterHeight", "1200"); - plotter.show(); - - // Close the trees. - for(int i = 0; i < plotFile.length; i++) { - tree[i].close(); - } - } - - /** - * Sets the plot display formatting for 1D plots. - * @param region - The plotter region to format. - * @param color - The data color settings to use. - */ - private static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) { - // Get the names of each plot on in the region. - String[] dataNames = region.getAllDataNames(); - - // Check whether this is an overlay plot. Overlay plots contain - // more than one data name. - boolean overlay = (dataNames.length > 1 ? true : false); - - // Iterate over each plot in the region. - for(int i = 0; i < dataNames.length; i++) { - // Set the overlay style if needed. - if(overlay) { - // Get the fill style for the current data type. - JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); - - // Set the histogram style to display thick-lined bars - // with no fill. The color is set by the "color" argument. - fillStyle.setHistogramFill(false); - fillStyle.setHistogramBarLineWidth(3); - fillStyle.setHistogramBarLineColor(color[i].getFillColor()); - - // Set the legend text style. - region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20)); - } - - // Otherwise, set the fill style for a single plot. - else { - // Get the fill style for the current data type. - JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); - - // Set the histogram style to display thick-lined bars - // with a fill color. The colors are defined by the - // "color" argument. - fillStyle.setHistogramBarLineWidth(3); - fillStyle.setHistogramBarColor(color[i].getFillColor()); - fillStyle.setHistogramBarLineColor(color[i].getLineColor()); - } - - // Set the statistics box style. - region.getPlot().getStats().setVisible(true); - region.getPlot().getStats().setFont(BASIC_FONT); - - // Set the title font. - region.getPlot().getTitleObject().setFont(TITLE_FONT); - - // Set the axis tick-mark fonts. - region.getPlot().getXAxis().setFont(BASIC_FONT); - region.getPlot().getYAxis().setFont(BASIC_FONT); - region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); - region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); - } - } - - /** - * Sets the plot display formatting for 1D plots. - * @param region - The plotter region to format. - */ - private static final void setDefault2DStyle(PlotterRegion region, boolean logarithmic) { - // Get the fill style object. 2D plots should never be overlay - // plots, so there should only ever be one data name. - JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); - - // Set the fill style for a two-dimensional plot. - if(logarithmic) { fillStyle.setLogZ(true); } - fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP); - fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW); - - // Make the statistics box invisible. - region.getPlot().getStats().setVisible(false); - - // Set the general plot font (which is also the z-axis font). - region.getPlot().setFont(BASIC_FONT); - - // Set the title font. - region.getPlot().getTitleObject().setFont(TITLE_FONT); - - // Set the axis tick-mark fonts. - region.getPlot().getXAxis().setFont(BASIC_FONT); - region.getPlot().getYAxis().setFont(BASIC_FONT); - region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); - region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); - } + // Define plot fonts. + private static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 20); + private static final Font AXIS_FONT = new Font("Calibri", Font.BOLD, 25); + private static final Font TITLE_FONT = new Font("Calibri", Font.BOLD, 35); + + // Defines the color style options for plot data. + private enum ColorStyle { + MS_BLUE(new Color( 79, 129, 189), new Color( 36, 64, 97)), MS_ORANGE(new Color(247, 150, 70), new Color(152, 72, 6)), + MS_RED(new Color(192, 80, 77), new Color( 99, 36, 35)), GREY(new Color(166, 166, 166), new Color( 89, 89, 89)), + MS_GREEN(new Color(155, 187, 89), new Color( 79, 98, 40)), CRIMSON(new Color(161, 0, 0), new Color(104, 0, 0)), + RUST(new Color(161, 80, 0), new Color(105, 80, 0)), YELLOW(new Color(161, 161, 0), new Color(122, 109, 8)), + FOREST(new Color( 65, 102, 0), new Color( 37, 79, 0)), GREEN(new Color( 7, 132, 70), new Color( 7, 82, 30)), + TEAL(new Color( 0, 130, 130), new Color( 0, 90, 100)), CERULEAN(new Color( 0, 86, 130), new Color( 0, 28, 83)), + BLUE(new Color( 0, 33, 203), new Color( 0, 0, 137)), INDIGO(new Color( 68, 10, 127), new Color( 0, 0, 61)), + PURPLE(new Color(106, 0, 106), new Color( 63, 0, 56)), FUSCHIA(new Color(119, 0, 60), new Color( 60, 0, 60)); + + private final Color fillColor; + private final Color lineColor; + + private ColorStyle(Color fillColor, Color lineColor) { + this.fillColor = fillColor; + this.lineColor = lineColor; + } + + public Color getFillColor() { return fillColor; } + + public Color getLineColor() { return lineColor; } + }; + + /** + * Loads all plots in a file and formats them according to the + * indicated style. + * @param args - Unused default executable parameter. + * @throws IOException Occurs if there is an issue opening the file. + */ + public static void main(String[] args) throws IOException { + // Define the root directory for the plots. + String rootDir = "D:\\cygwin64\\home\\Kyle\\"; + + // Define the new name of the file containing the trigger plots. + String[] plotFile = { + rootDir + "temp.aida" + }; + + // Define the run numbers for each file. + String[] runNumber = { "1 Hits", "2 Hits" }; + + // Define the scaling factors for each plot. + double scaleFactor = 13.254; + + // Get the plots file and open it. + IAnalysisFactory af = IAnalysisFactory.create(); + ITree[] tree = new ITree[plotFile.length]; + for(int i = 0; i < plotFile.length; i++) { + tree[i] = af.createTreeFactory().create(plotFile[i]); + if(tree[i] == null) { throw new IllegalArgumentException("Unable to load plot file."); } + } + + // Get the histograms. + IHistogram1D[] invariantMassPlots = new IHistogram1D[3]; + invariantMassPlots[0] = (IHistogram1D) tree[0].find("Trident Analysis/Particle Invariant Mass (1 Hit)"); + invariantMassPlots[1] = (IHistogram1D) tree[0].find("Trident Analysis/Particle Invariant Mass (2 Hit)"); + IHistogram1D electronEnergyPlot = (IHistogram1D) tree[0].find("Trident Analysis/Electron Energy"); + IHistogram1D positronEnergyPlot = (IHistogram1D) tree[0].find("Trident Analysis/Positron Energy"); + IHistogram1D energySumPlot = (IHistogram1D) tree[0].find("Trident Analysis/Energy Sum Distribution"); + IHistogram2D energySum2DPlot = (IHistogram2D) tree[0].find("Trident Analysis/2D Energy Distribution"); + IHistogram1D tridentElectronEnergyPlot = (IHistogram1D) tree[0].find("Trident Analysis/Trident Electron Energy"); + IHistogram1D tridentPositronEnergyPlot = (IHistogram1D) tree[0].find("Trident Analysis/Trident Positron Energy"); + + // Define the plot titles and arrays. + IHistogram[] plots = { electronEnergyPlot, positronEnergyPlot, energySumPlot, tridentElectronEnergyPlot, tridentPositronEnergyPlot }; + String[] titles = { "Electron Energy", "Positron Energy", "Energy Sum", "Trident Electron Energy", "Trident Positron Energy" }; + String[] xTitles = { "Energy (GeV)", "Energy (GeV)", "Energy Sum (GeV)", "Energy (GeV)", "Energy (GeV)" }; + + // Re-bin the histograms to have 5-times larger bins. First, + // get the bin count and upper and lower bounds of the plot. + int bins = invariantMassPlots[0].axis().bins(); + double low = invariantMassPlots[0].axis().binLowerEdge(0); + double high = invariantMassPlots[0].axis().binUpperEdge(invariantMassPlots[0].axis().bins() - 1); + + // Create new plots with the larger bin sizes. + AIDA aida = AIDA.defaultInstance(); + IHistogram1D[] newPlot = new IHistogram1D[2]; + newPlot[0] = aida.histogram1D("Particle Invariant Mass (1 Hit)", bins / 5, low, high); + newPlot[1] = aida.histogram1D("Particle Invariant Mass (2 Hit)", bins / 5, low, high); + + // Populate the new plots with the data from the old ones. + for(int j = 0; j < 2; j++) { + for(int i = 0; i < bins; i++) { + int entries = invariantMassPlots[j].binEntries(i); + double center = invariantMassPlots[j].axis().binCenter(i); + for(int k = 0; k < entries; k++) { + newPlot[j].fill(center); + } + } + } + + // Replace the old plots. + invariantMassPlots = newPlot; + + // Create a plotter factory. + IPlotterFactory plotterFactory = af.createPlotterFactory(); + + // Format and display the basic histograms. + for(int i = 0; i < plots.length; i++) { + // Scale the histogram by the appropriate scaling factor. + plots[i].scale(1.0 / scaleFactor); + + // Create a plotter and plotting region for the plot. + IPlotter plotter = plotterFactory.create(titles[i]); + plotter.createRegions(1); + plotter.region(0).plot(plots[i]); + + // Format the axis labels. + PlotterRegion region = (PlotterRegion) plotter.region(0); + region.getPlot().setTitle(titles[i]); + region.getPlot().getXAxis().setLabel(xTitles[i]); + region.getPlot().getYAxis().setLabel("Rate (Hz)"); + + // Format the fonts and general plot presentation. + setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); + + // Show the plot. + plotter.setParameter("plotterWidth", "2000"); + plotter.setParameter("plotterHeight", "1200"); + plotter.show(); + } + + // Format and display the 2D histogram. + energySum2DPlot.scale(1.0 / scaleFactor); + IPlotter plotter2D = plotterFactory.create("2D Energy Sum"); + plotter2D.createRegions(1); + plotter2D.region(0).plot(energySum2DPlot); + + // Format the axis labels. + PlotterRegion region2D = (PlotterRegion) plotter2D.region(0); + region2D.getPlot().setTitle("2D Energy Sum"); + region2D.getPlot().getXAxis().setLabel("Electron Energy (GeV)"); + region2D.getPlot().getYAxis().setLabel("Positron Energy (GeV)"); + + // Format the fonts and general plot presentation. + setDefault2DStyle(region2D, false); + + // Show the plot. + plotter2D.setParameter("plotterWidth", "2000"); + plotter2D.setParameter("plotterHeight", "1200"); + plotter2D.show(); + + // Format and display the histograms. + for(int i = 0; i < 2; i++) { + // Scale the histogram by the appropriate scaling factor. + invariantMassPlots[i].scale(1.0 / scaleFactor); + + // Create a plotter and plotting region for the plot. + IPlotter plotter = plotterFactory.create("Particle Invariant Mass (" + runNumber[i] + ")"); + plotter.createRegions(1); + plotter.region(0).plot(invariantMassPlots[i]); + + // Format the axis labels. + PlotterRegion region = (PlotterRegion) plotter.region(0); + region.getPlot().setTitle("Particle Invariant Mass (" + runNumber[i] + ")"); + region.getPlot().getXAxis().setLabel("Invariant Mass (GeV)"); + region.getPlot().getYAxis().setLabel("Rate (Hz)"); + + // Format the fonts and general plot presentation. + setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); + + // Show the plot. + plotter.setParameter("plotterWidth", "2000"); + plotter.setParameter("plotterHeight", "1200"); + plotter.show(); + } + + // Note which plot is the numerator and which is the denominator. + int numerator = 0; + int denominator = 1; + + // Create a new histogram to display the ratios of the rates. + IHistogram1D ratioPlot = AIDA.defaultInstance().histogram1D("Invariant Mass Ratio (" + runNumber[numerator] + " / " + + runNumber[denominator] + ")", invariantMassPlots[0].axis().bins(), + invariantMassPlots[0].axis().lowerEdge(), invariantMassPlots[0].axis().upperEdge()); + + // Iterate over each bin. + for(int bin = 0; bin < invariantMassPlots[0].axis().bins(); bin++) { + // Calculate the ratio. + double ratio = invariantMassPlots[numerator].binHeight(bin) / invariantMassPlots[denominator].binHeight(bin); + + // If the ratio is either not a number of infinite, skip + // this bin. + if(Double.isNaN(ratio) || Double.isInfinite(ratio)) { continue; } + + // Populate the ratio plot bin. + ratioPlot.fill(invariantMassPlots[0].axis().binCenter(bin), ratio); + } + + // Create a plotter and plotting region for the plot. + IPlotter plotter = plotterFactory.create("Invariant Mass Ratio (5411 / 5554)"); + plotter.createRegions(1); + plotter.region(0).plot(ratioPlot); + + // Format the axis labels. + PlotterRegion region = (PlotterRegion) plotter.region(0); + region.getPlot().setTitle("Invariant Mass Ratio (" + runNumber[numerator] + " / " + runNumber[denominator] + ")"); + region.getPlot().getXAxis().setLabel("Invariant Mass (GeV)"); + region.getPlot().getXAxis().setMin(0.010); + region.getPlot().getXAxis().setMax(0.060); + region.getPlot().getYAxis().setLabel("Ratio"); + + // Format the fonts and general plot presentation. + setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); + + // Disable the error bars. + JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); + fillStyle.setShowErrorBars(false); + + // Show the plot. + plotter.setParameter("plotterWidth", "2000"); + plotter.setParameter("plotterHeight", "1200"); + plotter.show(); + + // Close the trees. + for(int i = 0; i < plotFile.length; i++) { + tree[i].close(); + } + } + + /** + * Sets the plot display formatting for 1D plots. + * @param region - The plotter region to format. + * @param color - The data color settings to use. + */ + private static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) { + // Get the names of each plot on in the region. + String[] dataNames = region.getAllDataNames(); + + // Check whether this is an overlay plot. Overlay plots contain + // more than one data name. + boolean overlay = (dataNames.length > 1 ? true : false); + + // Iterate over each plot in the region. + for(int i = 0; i < dataNames.length; i++) { + // Set the overlay style if needed. + if(overlay) { + // Get the fill style for the current data type. + JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); + + // Set the histogram style to display thick-lined bars + // with no fill. The color is set by the "color" argument. + fillStyle.setHistogramFill(false); + fillStyle.setHistogramBarLineWidth(3); + fillStyle.setHistogramBarLineColor(color[i].getFillColor()); + + // Set the legend text style. + region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20)); + } + + // Otherwise, set the fill style for a single plot. + else { + // Get the fill style for the current data type. + JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); + + // Set the histogram style to display thick-lined bars + // with a fill color. The colors are defined by the + // "color" argument. + fillStyle.setHistogramBarLineWidth(3); + fillStyle.setHistogramBarColor(color[i].getFillColor()); + fillStyle.setHistogramBarLineColor(color[i].getLineColor()); + } + + // Set the statistics box style. + region.getPlot().getStats().setVisible(true); + region.getPlot().getStats().setFont(BASIC_FONT); + + // Set the title font. + region.getPlot().getTitleObject().setFont(TITLE_FONT); + + // Set the axis tick-mark fonts. + region.getPlot().getXAxis().setFont(BASIC_FONT); + region.getPlot().getYAxis().setFont(BASIC_FONT); + region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); + region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); + } + } + + /** + * Sets the plot display formatting for 1D plots. + * @param region - The plotter region to format. + */ + private static final void setDefault2DStyle(PlotterRegion region, boolean logarithmic) { + // Get the fill style object. 2D plots should never be overlay + // plots, so there should only ever be one data name. + JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); + + // Set the fill style for a two-dimensional plot. + if(logarithmic) { fillStyle.setLogZ(true); } + fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP); + fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW); + + // Make the statistics box invisible. + region.getPlot().getStats().setVisible(false); + + // Set the general plot font (which is also the z-axis font). + region.getPlot().setFont(BASIC_FONT); + + // Set the title font. + region.getPlot().getTitleObject().setFont(TITLE_FONT); + + // Set the axis tick-mark fonts. + region.getPlot().getXAxis().setFont(BASIC_FONT); + region.getPlot().getYAxis().setFont(BASIC_FONT); + region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); + region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTEPlotFormatter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTEPlotFormatter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTEPlotFormatter.java Wed Mar 9 11:43:24 2016 @@ -19,308 +19,308 @@ import hep.aida.ref.plotter.PlotterRegion; public class MTEPlotFormatter { - // Define plot fonts. - private static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 20); - private static final Font AXIS_FONT = new Font("Calibri", Font.BOLD, 25); - private static final Font TITLE_FONT = new Font("Calibri", Font.BOLD, 35); - - // Defines the color style options for plot data. - private enum ColorStyle { - MS_BLUE(new Color( 79, 129, 189), new Color( 36, 64, 97)), MS_ORANGE(new Color(247, 150, 70), new Color(152, 72, 6)), - MS_RED(new Color(192, 80, 77), new Color( 99, 36, 35)), GREY(new Color(166, 166, 166), new Color( 89, 89, 89)), - MS_GREEN(new Color(155, 187, 89), new Color( 79, 98, 40)), CRIMSON(new Color(161, 0, 0), new Color(104, 0, 0)), - RUST(new Color(161, 80, 0), new Color(105, 80, 0)), YELLOW(new Color(161, 161, 0), new Color(122, 109, 8)), - FOREST(new Color( 65, 102, 0), new Color( 37, 79, 0)), GREEN(new Color( 7, 132, 70), new Color( 7, 82, 30)), - TEAL(new Color( 0, 130, 130), new Color( 0, 90, 100)), CERULEAN(new Color( 0, 86, 130), new Color( 0, 28, 83)), - BLUE(new Color( 0, 33, 203), new Color( 0, 0, 137)), INDIGO(new Color( 68, 10, 127), new Color( 0, 0, 61)), - PURPLE(new Color(106, 0, 106), new Color( 63, 0, 56)), FUSCHIA(new Color(119, 0, 60), new Color( 60, 0, 60)); - - private final Color fillColor; - private final Color lineColor; - - private ColorStyle(Color fillColor, Color lineColor) { - this.fillColor = fillColor; - this.lineColor = lineColor; - } - - public Color getFillColor() { return fillColor; } - - public Color getLineColor() { return lineColor; } - }; - - /** - * Loads all plots in a file and formats them according to the - * indicated style. - * @param args - Unused default executable parameter. - * @throws IOException Occurs if there is an issue opening the file. - */ - public static void main(String[] args) throws IOException { - // Define the root directory for the plots. - String rootDir = "D:\\cygwin64\\home\\Kyle\\"; - - // Define the new name of the file containing the trigger plots. - String plotFile = rootDir + "temp.aida"; - - // Define the scaling factors for each plot. - double scaleFactor = 1; - - // Get the plots file and open it. - IAnalysisFactory af = IAnalysisFactory.create(); - ITree tree = af.createTreeFactory().create(plotFile); - if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } - - // Define index references for each event type. - int MOLLER = 0; - int TRIDENT = 1; - int ELASTIC = 2; - - // Get the histograms. - IHistogram1D[] trackCountPlots = new IHistogram1D[3]; - trackCountPlots[MOLLER] = (IHistogram1D) tree.find("MTE Analysis/Møller Event Tracks"); - trackCountPlots[TRIDENT] = (IHistogram1D) tree.find("MTE Analysis/Trident Event Tracks"); - trackCountPlots[ELASTIC] = (IHistogram1D) tree.find("MTE Analysis/Elastic Event Tracks"); - - IHistogram1D[] energyPlots = new IHistogram1D[3]; - energyPlots[MOLLER] = (IHistogram1D) tree.find("MTE Analysis/Møller Electron Energy Distribution"); - energyPlots[TRIDENT] = (IHistogram1D) tree.find("MTE Analysis/Trident Electron Energy Distribution"); - energyPlots[ELASTIC] = (IHistogram1D) tree.find("MTE Analysis/Elastic Energy Distribution"); - - IHistogram1D[] energySumPlots = new IHistogram1D[2]; - energySumPlots[MOLLER] = (IHistogram1D) tree.find("MTE Analysis/Møller Energy Sum Distribution"); - energySumPlots[TRIDENT] = (IHistogram1D) tree.find("MTE Analysis/Trident Energy Sum Distribution"); - - IHistogram2D[] energy2DPlots = new IHistogram2D[2]; - energy2DPlots[MOLLER] = (IHistogram2D) tree.find("MTE Analysis/Møller 2D Energy Distribution"); - energy2DPlots[TRIDENT] = (IHistogram2D) tree.find("MTE Analysis/Trident 2D Energy Distribution"); - - // Create a plotter factory. - IPlotterFactory plotterFactory = af.createPlotterFactory(); - - // Format the track count plots. - for(IHistogram1D trackCountPlot : trackCountPlots) { - // Create a plotter and plotting region for the plot. - IPlotter plotter = plotterFactory.create(trackCountPlot.title()); - plotter.createRegions(1); - plotter.region(0).plot(trackCountPlot); - - // Format the axis labels. - PlotterRegion region = (PlotterRegion) plotter.region(0); - region.getPlot().setTitle(trackCountPlot.title()); - region.getPlot().getXAxis().setLabel("Number of Tracks"); - region.getPlot().getYAxis().setLabel("Count"); - - // Format the fonts and general plot presentation. - setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); - - // Show the plot. - plotter.setParameter("plotterWidth", "2000"); - plotter.setParameter("plotterHeight", "1200"); - plotter.show(); - } - - // Format the electron energy plots. - for(IHistogram1D energyPlot : energyPlots) { - // Create a plotter and plotting region for the plot. - IPlotter plotter = plotterFactory.create(energyPlot.title()); - plotter.createRegions(1); - plotter.region(0).plot(energyPlot); - - // Format the axis labels. - PlotterRegion region = (PlotterRegion) plotter.region(0); - region.getPlot().setTitle(energyPlot.title()); - region.getPlot().getXAxis().setLabel("Track Energy (GeV)"); - region.getPlot().getYAxis().setLabel("Count"); - - // Format the fonts and general plot presentation. - setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); - - // Show the plot. - plotter.setParameter("plotterWidth", "2000"); - plotter.setParameter("plotterHeight", "1200"); - plotter.show(); - } - - // Format the energy sum plots. - for(IHistogram1D energySumPlot : energySumPlots) { - // Create a plotter and plotting region for the plot. - IPlotter plotter = plotterFactory.create(energySumPlot.title()); - plotter.createRegions(1); - plotter.region(0).plot(energySumPlot); - - // Format the axis labels. - PlotterRegion region = (PlotterRegion) plotter.region(0); - region.getPlot().setTitle(energySumPlot.title()); - region.getPlot().getXAxis().setLabel("Track Energy (GeV)"); - region.getPlot().getYAxis().setLabel("Count"); - - // Format the fonts and general plot presentation. - setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); - - // Show the plot. - plotter.setParameter("plotterWidth", "2000"); - plotter.setParameter("plotterHeight", "1200"); - plotter.show(); - } - - // Format the 2D energy sum plots. - for(IHistogram2D energy2DPlot : energy2DPlots) { - // Create a plotter and plotting region for the plot. - IPlotter plotter = plotterFactory.create(energy2DPlot.title()); - plotter.createRegions(1); - plotter.region(0).plot(energy2DPlot); - - // Format the axis labels. - PlotterRegion region = (PlotterRegion) plotter.region(0); - region.getPlot().setTitle(energy2DPlot.title()); - region.getPlot().getXAxis().setLabel("First Track Energy (GeV)"); - region.getPlot().getYAxis().setLabel("Second Track Energy (GeV)"); - - - // Format the fonts and general plot presentation. - setDefault2DStyle(region, false); - - // Show the plot. - plotter.setParameter("plotterWidth", "2000"); - plotter.setParameter("plotterHeight", "1200"); - plotter.show(); - } - - // Disable the error bars. - //JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); - //fillStyle.setShowErrorBars(false); - - // Close the tree. - tree.close(); - } - - /** - * Sets the plot display formatting for 1D plots. - * @param region - The plotter region to format. - * @param color - The data color settings to use. - */ - private static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) { - // Get the names of each plot on in the region. - String[] dataNames = region.getAllDataNames(); - - // Check whether this is an overlay plot. Overlay plots contain - // more than one data name. - boolean overlay = (dataNames.length > 1 ? true : false); - - // Iterate over each plot in the region. - for(int i = 0; i < dataNames.length; i++) { - // Set the overlay style if needed. - if(overlay) { - // Get the fill style for the current data type. - JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); - - // Set the histogram style to display thick-lined bars - // with no fill. The color is set by the "color" argument. - fillStyle.setHistogramFill(false); - fillStyle.setHistogramBarLineWidth(3); - fillStyle.setHistogramBarLineColor(color[i].getFillColor()); - - // Set the legend text style. - region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20)); - } - - // Otherwise, set the fill style for a single plot. - else { - // Get the fill style for the current data type. - JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); - - // Set the histogram style to display thick-lined bars - // with a fill color. The colors are defined by the - // "color" argument. - fillStyle.setHistogramBarLineWidth(3); - fillStyle.setHistogramBarColor(color[i].getFillColor()); - fillStyle.setHistogramBarLineColor(color[i].getLineColor()); - } - - // Set the statistics box style. - region.getPlot().getStats().setVisible(true); - region.getPlot().getStats().setFont(BASIC_FONT); - - // Set the title font. - region.getPlot().getTitleObject().setFont(TITLE_FONT); - - // Set the axis tick-mark fonts. - region.getPlot().getXAxis().setFont(BASIC_FONT); - region.getPlot().getYAxis().setFont(BASIC_FONT); - region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); - region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); - } - } - - /** - * Sets the plot display formatting for 1D plots. - * @param region - The plotter region to format. - */ - private static final void setDefault2DStyle(PlotterRegion region, boolean logarithmic) { - // Get the fill style object. 2D plots should never be overlay - // plots, so there should only ever be one data name. - JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); - - // Set the fill style for a two-dimensional plot. - if(logarithmic) { fillStyle.setLogZ(true); } - fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP); - fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW); - - // Make the statistics box invisible. - region.getPlot().getStats().setVisible(false); - - // Set the general plot font (which is also the z-axis font). - region.getPlot().setFont(BASIC_FONT); - - // Set the title font. - region.getPlot().getTitleObject().setFont(TITLE_FONT); - - // Set the axis tick-mark fonts. - region.getPlot().getXAxis().setFont(BASIC_FONT); - region.getPlot().getYAxis().setFont(BASIC_FONT); - region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); - region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); - } - - /** - * Recursive method that gets all object names from a tree that - * are not directories. Method should not be called directly, but - * rather called only through the <code>getHistograms(ITree)</code> - * method. - * @param tree - The tree from which to obtain the object names. - * @param directory - The directory in which to search for objects. - * @param list - The list in which to place the objects. - * @return Returns the <code>List</code> collection that was given - * as an argument. - */ - private static final List<String> getHistograms(ITree tree, String directory, List<String> list) { - // Get the list of objects in the directory. - String[] treeObjects = tree.listObjectNames(directory); - - // Print the objects. - for(String objectName : treeObjects) { - // Check if the object is a directory. - boolean isDirectory = isDirectory(objectName); - - // If the object is a directory, get the histograms from it. - if(isDirectory) { - getHistograms(tree, objectName, list); - } - - // If the object is a plot, add it to the list. - else { list.add(objectName); } - } - - // Return the list. - return list; - } - - /** - * Checks whether a tree object is a directory. - * @param object - The object to check. - * @return Returns <code>true</code> if the object is a directory - * and <code>false</code> otherwise. - */ - private static final boolean isDirectory(String object) { - return (object.toCharArray()[object.length() - 1] == '/'); - } + // Define plot fonts. + private static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 20); + private static final Font AXIS_FONT = new Font("Calibri", Font.BOLD, 25); + private static final Font TITLE_FONT = new Font("Calibri", Font.BOLD, 35); + + // Defines the color style options for plot data. + private enum ColorStyle { + MS_BLUE(new Color( 79, 129, 189), new Color( 36, 64, 97)), MS_ORANGE(new Color(247, 150, 70), new Color(152, 72, 6)), + MS_RED(new Color(192, 80, 77), new Color( 99, 36, 35)), GREY(new Color(166, 166, 166), new Color( 89, 89, 89)), + MS_GREEN(new Color(155, 187, 89), new Color( 79, 98, 40)), CRIMSON(new Color(161, 0, 0), new Color(104, 0, 0)), + RUST(new Color(161, 80, 0), new Color(105, 80, 0)), YELLOW(new Color(161, 161, 0), new Color(122, 109, 8)), + FOREST(new Color( 65, 102, 0), new Color( 37, 79, 0)), GREEN(new Color( 7, 132, 70), new Color( 7, 82, 30)), + TEAL(new Color( 0, 130, 130), new Color( 0, 90, 100)), CERULEAN(new Color( 0, 86, 130), new Color( 0, 28, 83)), + BLUE(new Color( 0, 33, 203), new Color( 0, 0, 137)), INDIGO(new Color( 68, 10, 127), new Color( 0, 0, 61)), + PURPLE(new Color(106, 0, 106), new Color( 63, 0, 56)), FUSCHIA(new Color(119, 0, 60), new Color( 60, 0, 60)); + + private final Color fillColor; + private final Color lineColor; + + private ColorStyle(Color fillColor, Color lineColor) { + this.fillColor = fillColor; + this.lineColor = lineColor; + } + + public Color getFillColor() { return fillColor; } + + public Color getLineColor() { return lineColor; } + }; + + /** + * Loads all plots in a file and formats them according to the + * indicated style. + * @param args - Unused default executable parameter. + * @throws IOException Occurs if there is an issue opening the file. + */ + public static void main(String[] args) throws IOException { + // Define the root directory for the plots. + String rootDir = "D:\\cygwin64\\home\\Kyle\\"; + + // Define the new name of the file containing the trigger plots. + String plotFile = rootDir + "temp.aida"; + + // Define the scaling factors for each plot. + double scaleFactor = 1; + + // Get the plots file and open it. + IAnalysisFactory af = IAnalysisFactory.create(); + ITree tree = af.createTreeFactory().create(plotFile); + if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } + + // Define index references for each event type. + int MOLLER = 0; + int TRIDENT = 1; + int ELASTIC = 2; + + // Get the histograms. + IHistogram1D[] trackCountPlots = new IHistogram1D[3]; + trackCountPlots[MOLLER] = (IHistogram1D) tree.find("MTE Analysis/Møller Event Tracks"); + trackCountPlots[TRIDENT] = (IHistogram1D) tree.find("MTE Analysis/Trident Event Tracks"); + trackCountPlots[ELASTIC] = (IHistogram1D) tree.find("MTE Analysis/Elastic Event Tracks"); + + IHistogram1D[] energyPlots = new IHistogram1D[3]; + energyPlots[MOLLER] = (IHistogram1D) tree.find("MTE Analysis/Møller Electron Energy Distribution"); + energyPlots[TRIDENT] = (IHistogram1D) tree.find("MTE Analysis/Trident Electron Energy Distribution"); + energyPlots[ELASTIC] = (IHistogram1D) tree.find("MTE Analysis/Elastic Energy Distribution"); + + IHistogram1D[] energySumPlots = new IHistogram1D[2]; + energySumPlots[MOLLER] = (IHistogram1D) tree.find("MTE Analysis/Møller Energy Sum Distribution"); + energySumPlots[TRIDENT] = (IHistogram1D) tree.find("MTE Analysis/Trident Energy Sum Distribution"); + + IHistogram2D[] energy2DPlots = new IHistogram2D[2]; + energy2DPlots[MOLLER] = (IHistogram2D) tree.find("MTE Analysis/Møller 2D Energy Distribution"); + energy2DPlots[TRIDENT] = (IHistogram2D) tree.find("MTE Analysis/Trident 2D Energy Distribution"); + + // Create a plotter factory. + IPlotterFactory plotterFactory = af.createPlotterFactory(); + + // Format the track count plots. + for(IHistogram1D trackCountPlot : trackCountPlots) { + // Create a plotter and plotting region for the plot. + IPlotter plotter = plotterFactory.create(trackCountPlot.title()); + plotter.createRegions(1); + plotter.region(0).plot(trackCountPlot); + + // Format the axis labels. + PlotterRegion region = (PlotterRegion) plotter.region(0); + region.getPlot().setTitle(trackCountPlot.title()); + region.getPlot().getXAxis().setLabel("Number of Tracks"); + region.getPlot().getYAxis().setLabel("Count"); + + // Format the fonts and general plot presentation. + setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); + + // Show the plot. + plotter.setParameter("plotterWidth", "2000"); + plotter.setParameter("plotterHeight", "1200"); + plotter.show(); + } + + // Format the electron energy plots. + for(IHistogram1D energyPlot : energyPlots) { + // Create a plotter and plotting region for the plot. + IPlotter plotter = plotterFactory.create(energyPlot.title()); + plotter.createRegions(1); + plotter.region(0).plot(energyPlot); + + // Format the axis labels. + PlotterRegion region = (PlotterRegion) plotter.region(0); + region.getPlot().setTitle(energyPlot.title()); + region.getPlot().getXAxis().setLabel("Track Energy (GeV)"); + region.getPlot().getYAxis().setLabel("Count"); + + // Format the fonts and general plot presentation. + setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); + + // Show the plot. + plotter.setParameter("plotterWidth", "2000"); + plotter.setParameter("plotterHeight", "1200"); + plotter.show(); + } + + // Format the energy sum plots. + for(IHistogram1D energySumPlot : energySumPlots) { + // Create a plotter and plotting region for the plot. + IPlotter plotter = plotterFactory.create(energySumPlot.title()); + plotter.createRegions(1); + plotter.region(0).plot(energySumPlot); + + // Format the axis labels. + PlotterRegion region = (PlotterRegion) plotter.region(0); + region.getPlot().setTitle(energySumPlot.title()); + region.getPlot().getXAxis().setLabel("Track Energy (GeV)"); + region.getPlot().getYAxis().setLabel("Count"); + + // Format the fonts and general plot presentation. + setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); + + // Show the plot. + plotter.setParameter("plotterWidth", "2000"); + plotter.setParameter("plotterHeight", "1200"); + plotter.show(); + } + + // Format the 2D energy sum plots. + for(IHistogram2D energy2DPlot : energy2DPlots) { + // Create a plotter and plotting region for the plot. + IPlotter plotter = plotterFactory.create(energy2DPlot.title()); + plotter.createRegions(1); + plotter.region(0).plot(energy2DPlot); + + // Format the axis labels. + PlotterRegion region = (PlotterRegion) plotter.region(0); + region.getPlot().setTitle(energy2DPlot.title()); + region.getPlot().getXAxis().setLabel("First Track Energy (GeV)"); + region.getPlot().getYAxis().setLabel("Second Track Energy (GeV)"); + + + // Format the fonts and general plot presentation. + setDefault2DStyle(region, false); + + // Show the plot. + plotter.setParameter("plotterWidth", "2000"); + plotter.setParameter("plotterHeight", "1200"); + plotter.show(); + } + + // Disable the error bars. + //JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); + //fillStyle.setShowErrorBars(false); + + // Close the tree. + tree.close(); + } + + /** + * Sets the plot display formatting for 1D plots. + * @param region - The plotter region to format. + * @param color - The data color settings to use. + */ + private static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) { + // Get the names of each plot on in the region. + String[] dataNames = region.getAllDataNames(); + + // Check whether this is an overlay plot. Overlay plots contain + // more than one data name. + boolean overlay = (dataNames.length > 1 ? true : false); + + // Iterate over each plot in the region. + for(int i = 0; i < dataNames.length; i++) { + // Set the overlay style if needed. + if(overlay) { + // Get the fill style for the current data type. + JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); + + // Set the histogram style to display thick-lined bars + // with no fill. The color is set by the "color" argument. + fillStyle.setHistogramFill(false); + fillStyle.setHistogramBarLineWidth(3); + fillStyle.setHistogramBarLineColor(color[i].getFillColor()); + + // Set the legend text style. + region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20)); + } + + // Otherwise, set the fill style for a single plot. + else { + // Get the fill style for the current data type. + JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); + + // Set the histogram style to display thick-lined bars + // with a fill color. The colors are defined by the + // "color" argument. + fillStyle.setHistogramBarLineWidth(3); + fillStyle.setHistogramBarColor(color[i].getFillColor()); + fillStyle.setHistogramBarLineColor(color[i].getLineColor()); + } + + // Set the statistics box style. + region.getPlot().getStats().setVisible(true); + region.getPlot().getStats().setFont(BASIC_FONT); + + // Set the title font. + region.getPlot().getTitleObject().setFont(TITLE_FONT); + + // Set the axis tick-mark fonts. + region.getPlot().getXAxis().setFont(BASIC_FONT); + region.getPlot().getYAxis().setFont(BASIC_FONT); + region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); + region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); + } + } + + /** + * Sets the plot display formatting for 1D plots. + * @param region - The plotter region to format. + */ + private static final void setDefault2DStyle(PlotterRegion region, boolean logarithmic) { + // Get the fill style object. 2D plots should never be overlay + // plots, so there should only ever be one data name. + JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); + + // Set the fill style for a two-dimensional plot. + if(logarithmic) { fillStyle.setLogZ(true); } + fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP); + fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW); + + // Make the statistics box invisible. + region.getPlot().getStats().setVisible(false); + + // Set the general plot font (which is also the z-axis font). + region.getPlot().setFont(BASIC_FONT); + + // Set the title font. + region.getPlot().getTitleObject().setFont(TITLE_FONT); + + // Set the axis tick-mark fonts. + region.getPlot().getXAxis().setFont(BASIC_FONT); + region.getPlot().getYAxis().setFont(BASIC_FONT); + region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); + region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); + } + + /** + * Recursive method that gets all object names from a tree that + * are not directories. Method should not be called directly, but + * rather called only through the <code>getHistograms(ITree)</code> + * method. + * @param tree - The tree from which to obtain the object names. + * @param directory - The directory in which to search for objects. + * @param list - The list in which to place the objects. + * @return Returns the <code>List</code> collection that was given + * as an argument. + */ + private static final List<String> getHistograms(ITree tree, String directory, List<String> list) { + // Get the list of objects in the directory. + String[] treeObjects = tree.listObjectNames(directory); + + // Print the objects. + for(String objectName : treeObjects) { + // Check if the object is a directory. + boolean isDirectory = isDirectory(objectName); + + // If the object is a directory, get the histograms from it. + if(isDirectory) { + getHistograms(tree, objectName, list); + } + + // If the object is a plot, add it to the list. + else { list.add(objectName); } + } + + // Return the list. + return list; + } + + /** + * Checks whether a tree object is a directory. + * @param object - The object to check. + * @return Returns <code>true</code> if the object is a directory + * and <code>false</code> otherwise. + */ + private static final boolean isDirectory(String object) { + return (object.toCharArray()[object.length() - 1] == '/'); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTETriggerPlotsFormatter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTETriggerPlotsFormatter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTETriggerPlotsFormatter.java Wed Mar 9 11:43:24 2016 @@ -15,164 +15,164 @@ public class MTETriggerPlotsFormatter { - public static void main(String[] args) throws IllegalArgumentException, IOException { - // Define the root directory for the plots. - String rootDir = "D:\\cygwin64\\home\\Kyle\\"; - - // Define the new name of the file containing the trigger plots. - String plotFile = rootDir + "5772-ana.aida"; - - // Get the plots file and open it. - IAnalysisFactory af = IAnalysisFactory.create(); - ITree tree = af.createTreeFactory().create(plotFile); - if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } - - // Define the 1D trigger plot names for Møllers and tridents. - String[] plotNames1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy", - "Pair Coplanarity", "Pair Energy Difference", "Pair Energy Slope", "Pair Energy Sum" }; - String[] displayNames1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy", - "Pair Coplanarity", "Pair Energy Difference", "Pair Energy Slope", "Pair Energy Sum" }; - String[] xAxisNames1D = { "Hit Count", "Seed Energy (GeV)", "Total Energy (GeV)", - "Coplanarity (Degrees)", "Energy Difference (GeV)", "Energy Slope (GeV)", "Energy Sum (GeV)" }; - String yAxisName1D = "Count"; - - // Define the 2D trigger plot names for Møllers and tridents. - String[] plotNames2D = { "Cluster Seed", "Pair Energy Sum 2D" }; - String[] displayNames2D = { "Cluster Seed Distribution", "2D Energy Sum" }; - String[] xAxisNames2D = { "x-Index", "Second Cluster Energy (GeV)" }; - String[] yAxisNames2D = { "y-Index", "First Cluster Energy (GeV)" }; - - // Define the 1D trigger plot names for elastics. - String[] plotNamesElastic1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy" }; - String[] displayNamesElastic1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy" }; - String[] xAxisNamesElastic1D = { "Hit Count", "Seed Energy (GeV)", "Total Energy (GeV)" }; - String yAxisNameElastic1D = "Count"; - - // Define the 2D trigger plot names for elastics. - String[] plotNamesElastic2D = { "Cluster Seed" }; - String[] displayNamesElastic2D = { "Cluster Seed Distribution" }; - String[] xAxisNamesElastic2D = { "x-Index" }; - String[] yAxisNamesElastic2D = { "y-Index" }; - - // Define the Møller, trident, and elastic prefixes. - String allPrefix = "All Trigger Plots/Pair Plots/"; - String møllerPrefix = "Møller Trigger Plots/Pair Plots/"; - String tridentPrefix = "Trident Trigger Plots/Pair Plots/"; - String elasticPrefix = "Elastic Trigger Plots/Singles Plots/"; - String allSinglesPrefix = "All Trigger Plots/Singles Plots/"; - - // Define the plot type prefix. - String allTypeName = "All Pairs - "; - String møllerTypeName = "Møller - "; - String tridentTypeName = "Trident - "; - String elasticTypeName = "Elastic - "; - String allSinglesTypeName = "All Singles - "; - - // Define the plot type colors. - ColorStyle allColor = PlotsFormatter.ColorStyle.GREY; - ColorStyle møllerColor = PlotsFormatter.ColorStyle.MS_BLUE; - ColorStyle tridentColor = PlotsFormatter.ColorStyle.MS_ORANGE; - ColorStyle elasticColor = PlotsFormatter.ColorStyle.MS_GREEN; - - // Create a plot formatting module. - PlotFormatModule module = new PlotFormatModule(); - - // Get the histograms and add them to the module. Start with the - // trident and Møller plots. - for(int i = 0; i < plotNames1D.length; i++) { - // Get the Møller and trident plots. - IHistogram1D allPlot = (IHistogram1D) tree.find(allPrefix + plotNames1D[i]); - IHistogram1D møllerPlot = (IHistogram1D) tree.find(møllerPrefix + plotNames1D[i]); - IHistogram1D tridentPlot = (IHistogram1D) tree.find(tridentPrefix + plotNames1D[i]); - - // Make a formatted plot for each. - FormattedPlot1D allFormattedPlot = new FormattedPlot1D(allPlot, allColor, xAxisNames1D[i], yAxisName1D, allTypeName + displayNames1D[i]); - FormattedPlot1D møllerFormattedPlot = new FormattedPlot1D(møllerPlot, møllerColor, xAxisNames1D[i], yAxisName1D, møllerTypeName + displayNames1D[i]); - FormattedPlot1D tridentFormattedPlot = new FormattedPlot1D(tridentPlot, tridentColor, xAxisNames1D[i], yAxisName1D, tridentTypeName + displayNames1D[i]); - - // Add them to the module. - module.addPlot1D(allFormattedPlot); - module.addPlot1D(møllerFormattedPlot); - module.addPlot1D(tridentFormattedPlot); - } - for(int i = 0; i < plotNames2D.length; i++) { - // Get the Møller and trident plots. - IHistogram2D allPlot = (IHistogram2D) tree.find(allPrefix + plotNames2D[i]); - IHistogram2D møllerPlot = (IHistogram2D) tree.find(møllerPrefix + plotNames2D[i]); - IHistogram2D tridentPlot = (IHistogram2D) tree.find(tridentPrefix + plotNames2D[i]); - - // Make a formatted plot for each. - FormattedPlot2D allFormattedPlot = new FormattedPlot2D(allPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], allTypeName + displayNames2D[i]); - FormattedPlot2D møllerFormattedPlot = new FormattedPlot2D(møllerPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], møllerTypeName + displayNames2D[i]); - FormattedPlot2D tridentFormattedPlot = new FormattedPlot2D(tridentPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], tridentTypeName + displayNames2D[i]); - - // Add them to the module. - module.addPlot2D(allFormattedPlot); - module.addPlot2D(møllerFormattedPlot); - module.addPlot2D(tridentFormattedPlot); - } - - // Get the histograms for the elastic plots and add them to the module. - for(int i = 0; i < plotNamesElastic1D.length; i++) { - // Get the Møller and trident plots. - IHistogram1D allPlot = (IHistogram1D) tree.find(allSinglesPrefix + plotNames1D[i]); - IHistogram1D elasticPlot = (IHistogram1D) tree.find(elasticPrefix + plotNames1D[i]); - - // Make a formatted plot for each. - FormattedPlot1D allFormattedPlot = new FormattedPlot1D(allPlot, allColor, xAxisNamesElastic1D[i], yAxisNameElastic1D, - allSinglesTypeName + displayNamesElastic1D[i]); - FormattedPlot1D elasticFormattedPlot = new FormattedPlot1D(elasticPlot, elasticColor, xAxisNamesElastic1D[i], yAxisNameElastic1D, - elasticTypeName + displayNamesElastic1D[i]); - - // Add them to the module. - module.addPlot1D(allFormattedPlot); - module.addPlot1D(elasticFormattedPlot); - } - for(int i = 0; i < plotNamesElastic2D.length; i++) { - // Get the Møller and trident plots. - IHistogram2D allPlot = (IHistogram2D) tree.find(allPrefix + plotNamesElastic2D[i]); - IHistogram2D elasticPlot = (IHistogram2D) tree.find(møllerPrefix + plotNamesElastic2D[i]); - - // Make a formatted plot for each. - FormattedPlot2D allFormattedPlot = new FormattedPlot2D(allPlot, i == 0 ? true : false, xAxisNamesElastic2D[i], yAxisNamesElastic2D[i], - allSinglesTypeName + plotNames2D[i]); - FormattedPlot2D elasticFormattedPlot = new FormattedPlot2D(elasticPlot, i == 0 ? true : false, xAxisNamesElastic2D[i], yAxisNamesElastic2D[i], - elasticTypeName + displayNamesElastic2D[i]); - - // Add them to the module. - module.addPlot2D(allFormattedPlot); - module.addPlot2D(elasticFormattedPlot); - } - - // Add the MTE plots to the module. - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Elastic Energy Distribution"), elasticColor, - "Momentum (GeV)", "Count", "Elastic - Momentum")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Elastic Event Tracks"), elasticColor, - "Tracks", "Count", "Elastic - Tracks in Event")); - - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Energy Sum Distribution"), møllerColor, - "Momentum Sum (GeV)", "Count", "Møller - Momentum Sum")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Electron Energy Distribution"), møllerColor, - "Momentum (GeV)", "Count", "Møller - Momentum (Electron)")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Time Coincidence Distribution (All Møller Cuts)"), møllerColor, - "Time (ns)", "Count", "Møller - Time Coincidence")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Event Tracks"), møllerColor, - "Tracks", "Count", "Møller - Tracks in Event")); - module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MTE Analysis/Møller 2D Energy Distribution"), false, - "First Track Momentum (GeV)", "Second Track Momentum (GeV)", "Møller - 2D Momentum Sum")); - - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Energy Sum Distribution"), tridentColor, - "Momentum Sum (GeV)", "Count", "Trident - Momentum Sum")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Electron Energy Distribution"), tridentColor, - "Momentum (GeV)", "Count", "Trident - Momentum (Electron)")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Positron Energy Distribution"), tridentColor, - "Momentum (GeV)", "Count", "Trident - Momentum (Positron)")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Event Tracks"), tridentColor, - "Tracks", "Count", "Trident - Tracks in Event")); - module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MTE Analysis/Trident 2D Energy Distribution"), false, - "First Track Momentum (GeV)", "Second Track Momentum (GeV)", "Trident - 2D Momentum Sum")); - - // Display the plots. - module.savePlots("C:\\Users\\Kyle\\Desktop\\EnergyShift\\TestPrint\\"); - } + public static void main(String[] args) throws IllegalArgumentException, IOException { + // Define the root directory for the plots. + String rootDir = "D:\\cygwin64\\home\\Kyle\\"; + + // Define the new name of the file containing the trigger plots. + String plotFile = rootDir + "5772-ana.aida"; + + // Get the plots file and open it. + IAnalysisFactory af = IAnalysisFactory.create(); + ITree tree = af.createTreeFactory().create(plotFile); + if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } + + // Define the 1D trigger plot names for Møllers and tridents. + String[] plotNames1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy", + "Pair Coplanarity", "Pair Energy Difference", "Pair Energy Slope", "Pair Energy Sum" }; + String[] displayNames1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy", + "Pair Coplanarity", "Pair Energy Difference", "Pair Energy Slope", "Pair Energy Sum" }; + String[] xAxisNames1D = { "Hit Count", "Seed Energy (GeV)", "Total Energy (GeV)", + "Coplanarity (Degrees)", "Energy Difference (GeV)", "Energy Slope (GeV)", "Energy Sum (GeV)" }; + String yAxisName1D = "Count"; + + // Define the 2D trigger plot names for Møllers and tridents. + String[] plotNames2D = { "Cluster Seed", "Pair Energy Sum 2D" }; + String[] displayNames2D = { "Cluster Seed Distribution", "2D Energy Sum" }; + String[] xAxisNames2D = { "x-Index", "Second Cluster Energy (GeV)" }; + String[] yAxisNames2D = { "y-Index", "First Cluster Energy (GeV)" }; + + // Define the 1D trigger plot names for elastics. + String[] plotNamesElastic1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy" }; + String[] displayNamesElastic1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy" }; + String[] xAxisNamesElastic1D = { "Hit Count", "Seed Energy (GeV)", "Total Energy (GeV)" }; + String yAxisNameElastic1D = "Count"; + + // Define the 2D trigger plot names for elastics. + String[] plotNamesElastic2D = { "Cluster Seed" }; + String[] displayNamesElastic2D = { "Cluster Seed Distribution" }; + String[] xAxisNamesElastic2D = { "x-Index" }; + String[] yAxisNamesElastic2D = { "y-Index" }; + + // Define the Møller, trident, and elastic prefixes. + String allPrefix = "All Trigger Plots/Pair Plots/"; + String møllerPrefix = "Møller Trigger Plots/Pair Plots/"; + String tridentPrefix = "Trident Trigger Plots/Pair Plots/"; + String elasticPrefix = "Elastic Trigger Plots/Singles Plots/"; + String allSinglesPrefix = "All Trigger Plots/Singles Plots/"; + + // Define the plot type prefix. + String allTypeName = "All Pairs - "; + String møllerTypeName = "Møller - "; + String tridentTypeName = "Trident - "; + String elasticTypeName = "Elastic - "; + String allSinglesTypeName = "All Singles - "; + + // Define the plot type colors. + ColorStyle allColor = PlotsFormatter.ColorStyle.GREY; + ColorStyle møllerColor = PlotsFormatter.ColorStyle.MS_BLUE; + ColorStyle tridentColor = PlotsFormatter.ColorStyle.MS_ORANGE; + ColorStyle elasticColor = PlotsFormatter.ColorStyle.MS_GREEN; + + // Create a plot formatting module. + PlotFormatModule module = new PlotFormatModule(); + + // Get the histograms and add them to the module. Start with the + // trident and Møller plots. + for(int i = 0; i < plotNames1D.length; i++) { + // Get the Møller and trident plots. + IHistogram1D allPlot = (IHistogram1D) tree.find(allPrefix + plotNames1D[i]); + IHistogram1D møllerPlot = (IHistogram1D) tree.find(møllerPrefix + plotNames1D[i]); + IHistogram1D tridentPlot = (IHistogram1D) tree.find(tridentPrefix + plotNames1D[i]); + + // Make a formatted plot for each. + FormattedPlot1D allFormattedPlot = new FormattedPlot1D(allPlot, allColor, xAxisNames1D[i], yAxisName1D, allTypeName + displayNames1D[i]); + FormattedPlot1D møllerFormattedPlot = new FormattedPlot1D(møllerPlot, møllerColor, xAxisNames1D[i], yAxisName1D, møllerTypeName + displayNames1D[i]); + FormattedPlot1D tridentFormattedPlot = new FormattedPlot1D(tridentPlot, tridentColor, xAxisNames1D[i], yAxisName1D, tridentTypeName + displayNames1D[i]); + + // Add them to the module. + module.addPlot1D(allFormattedPlot); + module.addPlot1D(møllerFormattedPlot); + module.addPlot1D(tridentFormattedPlot); + } + for(int i = 0; i < plotNames2D.length; i++) { + // Get the Møller and trident plots. + IHistogram2D allPlot = (IHistogram2D) tree.find(allPrefix + plotNames2D[i]); + IHistogram2D møllerPlot = (IHistogram2D) tree.find(møllerPrefix + plotNames2D[i]); + IHistogram2D tridentPlot = (IHistogram2D) tree.find(tridentPrefix + plotNames2D[i]); + + // Make a formatted plot for each. + FormattedPlot2D allFormattedPlot = new FormattedPlot2D(allPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], allTypeName + displayNames2D[i]); + FormattedPlot2D møllerFormattedPlot = new FormattedPlot2D(møllerPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], møllerTypeName + displayNames2D[i]); + FormattedPlot2D tridentFormattedPlot = new FormattedPlot2D(tridentPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], tridentTypeName + displayNames2D[i]); + + // Add them to the module. + module.addPlot2D(allFormattedPlot); + module.addPlot2D(møllerFormattedPlot); + module.addPlot2D(tridentFormattedPlot); + } + + // Get the histograms for the elastic plots and add them to the module. + for(int i = 0; i < plotNamesElastic1D.length; i++) { + // Get the Møller and trident plots. + IHistogram1D allPlot = (IHistogram1D) tree.find(allSinglesPrefix + plotNames1D[i]); + IHistogram1D elasticPlot = (IHistogram1D) tree.find(elasticPrefix + plotNames1D[i]); + + // Make a formatted plot for each. + FormattedPlot1D allFormattedPlot = new FormattedPlot1D(allPlot, allColor, xAxisNamesElastic1D[i], yAxisNameElastic1D, + allSinglesTypeName + displayNamesElastic1D[i]); + FormattedPlot1D elasticFormattedPlot = new FormattedPlot1D(elasticPlot, elasticColor, xAxisNamesElastic1D[i], yAxisNameElastic1D, + elasticTypeName + displayNamesElastic1D[i]); + + // Add them to the module. + module.addPlot1D(allFormattedPlot); + module.addPlot1D(elasticFormattedPlot); + } + for(int i = 0; i < plotNamesElastic2D.length; i++) { + // Get the Møller and trident plots. + IHistogram2D allPlot = (IHistogram2D) tree.find(allPrefix + plotNamesElastic2D[i]); + IHistogram2D elasticPlot = (IHistogram2D) tree.find(møllerPrefix + plotNamesElastic2D[i]); + + // Make a formatted plot for each. + FormattedPlot2D allFormattedPlot = new FormattedPlot2D(allPlot, i == 0 ? true : false, xAxisNamesElastic2D[i], yAxisNamesElastic2D[i], + allSinglesTypeName + plotNames2D[i]); + FormattedPlot2D elasticFormattedPlot = new FormattedPlot2D(elasticPlot, i == 0 ? true : false, xAxisNamesElastic2D[i], yAxisNamesElastic2D[i], + elasticTypeName + displayNamesElastic2D[i]); + + // Add them to the module. + module.addPlot2D(allFormattedPlot); + module.addPlot2D(elasticFormattedPlot); + } + + // Add the MTE plots to the module. + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Elastic Energy Distribution"), elasticColor, + "Momentum (GeV)", "Count", "Elastic - Momentum")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Elastic Event Tracks"), elasticColor, + "Tracks", "Count", "Elastic - Tracks in Event")); + + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Energy Sum Distribution"), møllerColor, + "Momentum Sum (GeV)", "Count", "Møller - Momentum Sum")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Electron Energy Distribution"), møllerColor, + "Momentum (GeV)", "Count", "Møller - Momentum (Electron)")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Time Coincidence Distribution (All Møller Cuts)"), møllerColor, + "Time (ns)", "Count", "Møller - Time Coincidence")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Event Tracks"), møllerColor, + "Tracks", "Count", "Møller - Tracks in Event")); + module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MTE Analysis/Møller 2D Energy Distribution"), false, + "First Track Momentum (GeV)", "Second Track Momentum (GeV)", "Møller - 2D Momentum Sum")); + + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Energy Sum Distribution"), tridentColor, + "Momentum Sum (GeV)", "Count", "Trident - Momentum Sum")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Electron Energy Distribution"), tridentColor, + "Momentum (GeV)", "Count", "Trident - Momentum (Electron)")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Positron Energy Distribution"), tridentColor, + "Momentum (GeV)", "Count", "Trident - Momentum (Positron)")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Event Tracks"), tridentColor, + "Tracks", "Count", "Trident - Tracks in Event")); + module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MTE Analysis/Trident 2D Energy Distribution"), false, + "First Track Momentum (GeV)", "Second Track Momentum (GeV)", "Trident - 2D Momentum Sum")); + + // Display the plots. + module.savePlots("C:\\Users\\Kyle\\Desktop\\EnergyShift\\TestPrint\\"); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/ParticleMCAnalysisPlotsFormatter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/ParticleMCAnalysisPlotsFormatter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/ParticleMCAnalysisPlotsFormatter.java Wed Mar 9 11:43:24 2016 @@ -13,43 +13,43 @@ import org.hps.users.kmccarty.plots.PlotsFormatter.ColorStyle; public class ParticleMCAnalysisPlotsFormatter { - public static void main(String[] args) throws IllegalArgumentException, IOException { - // Define the root directory for the plots. - String rootDir = "D:\\cygwin64\\home\\Kyle\\"; - - // Define the new name of the file containing the trigger plots. - String plotFile = rootDir + "moller-mc-out_triggerPlots.aida"; - - // Get the plots file and open it. - IAnalysisFactory af = IAnalysisFactory.create(); - ITree tree = af.createTreeFactory().create(plotFile); - if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } - - // Create a plot formatting module. - PlotFormatModule module = new PlotFormatModule(); - - // Define the plot color. - ColorStyle plotColor = ColorStyle.MS_BLUE; - - // Define the plots to be read. - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Electron Energy Distribution"), - plotColor, "Electron Energy (GeV)", "Count", "Electron Energy Distribution")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Electron\\Electron Momentum Sum Distribution"), - plotColor, "Momentum Sum (GeV)", "Count", "Momentum Sum Distribution")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Electron\\Electron Pair Angle Distribution"), - plotColor, "Momentum Sum (GeV)", "Count", "Pair Angle Distribution")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Particle x-Momentum Distribution"), - plotColor, "Momentum (GeV)", "Count", "Particle x-Momentum Distribution")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Particle y-Momentum Distribution"), - plotColor, "Momentum (GeV)", "Count", "Particle y-Momentum Distribution")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Particle z-Momentum Distribution"), - plotColor, "Momentum (GeV)", "Count", "Particle z-Momentum Distribution")); - module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MC Analysis/Electron\\Electron 2D Momentum Distribution"), - true, "Particle 1 Momentum (GeV)", "Particle 2 Momentum (GeV)", "2D Momentum Sum Distribution")); - module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MC Analysis/Particle Momentum Distribution"), - true, "px (GeV)", "py (GeV)", "Particle x/y Momentum Distribution")); - - // Display the plots. - module.displayPlots(); - } + public static void main(String[] args) throws IllegalArgumentException, IOException { + // Define the root directory for the plots. + String rootDir = "D:\\cygwin64\\home\\Kyle\\"; + + // Define the new name of the file containing the trigger plots. + String plotFile = rootDir + "moller-mc-out_triggerPlots.aida"; + + // Get the plots file and open it. + IAnalysisFactory af = IAnalysisFactory.create(); + ITree tree = af.createTreeFactory().create(plotFile); + if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } + + // Create a plot formatting module. + PlotFormatModule module = new PlotFormatModule(); + + // Define the plot color. + ColorStyle plotColor = ColorStyle.MS_BLUE; + + // Define the plots to be read. + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Electron Energy Distribution"), + plotColor, "Electron Energy (GeV)", "Count", "Electron Energy Distribution")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Electron\\Electron Momentum Sum Distribution"), + plotColor, "Momentum Sum (GeV)", "Count", "Momentum Sum Distribution")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Electron\\Electron Pair Angle Distribution"), + plotColor, "Momentum Sum (GeV)", "Count", "Pair Angle Distribution")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Particle x-Momentum Distribution"), + plotColor, "Momentum (GeV)", "Count", "Particle x-Momentum Distribution")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Particle y-Momentum Distribution"), + plotColor, "Momentum (GeV)", "Count", "Particle y-Momentum Distribution")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Particle z-Momentum Distribution"), + plotColor, "Momentum (GeV)", "Count", "Particle z-Momentum Distribution")); + module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MC Analysis/Electron\\Electron 2D Momentum Distribution"), + true, "Particle 1 Momentum (GeV)", "Particle 2 Momentum (GeV)", "2D Momentum Sum Distribution")); + module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MC Analysis/Particle Momentum Distribution"), + true, "px (GeV)", "py (GeV)", "Particle x/y Momentum Distribution")); + + // Display the plots. + module.displayPlots(); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/RafoTridentFormatter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/RafoTridentFormatter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/RafoTridentFormatter.java Wed Mar 9 11:43:24 2016 @@ -13,101 +13,101 @@ import hep.aida.ITree; public class RafoTridentFormatter { - /** - * Loads all plots in a file and formats them according to the - * indicated style. - * @param args - Unused default executable parameter. - * @throws IOException Occurs if there is an issue opening the file. - */ - public static void main(String[] args) throws IOException { - // Define the root directory for the plots. - String rootDir = "D:\\cygwin64\\home\\Kyle\\"; - - // Define the new name of the file containing the trigger plots. - String plotFile = rootDir + "mte-out.aida"; - - // Get the plots file and open it. - IAnalysisFactory af = IAnalysisFactory.create(); - ITree tree = af.createTreeFactory().create(plotFile); - if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } - - // Declare the histogram names. - String energySumName = "Energy Sum"; - String timeCoincidenceName = "Time Coincidence"; - String timeEnergy2DName = "Cluster Time vs. Cluster Energy"; - String hCoplanaritySum2DName = "Hardware Coplanarity vs. Energy Sum"; - String coplanaritySum2DName = "Calculated Coplanarity vs. Energy Sum"; - String energySum2DName = "Top Cluster Energy vs. Bottom Cluster Energy"; - String fiducial = " (Fiducial Region)"; - - // Get the histograms. - IHistogram1D[] energySum = { - (IHistogram1D) tree.find("Trident/" + energySumName), - (IHistogram1D) tree.find("Trident/" + energySumName + fiducial) - }; - IHistogram1D[] timeCoincidence = { - (IHistogram1D) tree.find("Trident/" + timeCoincidenceName), - (IHistogram1D) tree.find("Trident/" + timeCoincidenceName + fiducial) - }; - IHistogram2D[] coplanaritySum = { - (IHistogram2D) tree.find("Trident/" + coplanaritySum2DName), - (IHistogram2D) tree.find("Trident/" + coplanaritySum2DName + fiducial) - }; - IHistogram2D[] hcoplanaritySum = { - (IHistogram2D) tree.find("Trident/" + hCoplanaritySum2DName), - (IHistogram2D) tree.find("Trident/" + hCoplanaritySum2DName + fiducial) - }; - IHistogram2D[] energySum2D = { - (IHistogram2D) tree.find("Trident/" + energySum2DName), - (IHistogram2D) tree.find("Trident/" + energySum2DName + fiducial) - }; - IHistogram2D[] timeEnergy = { - (IHistogram2D) tree.find("Trident/" + timeEnergy2DName), - (IHistogram2D) tree.find("Trident/" + timeEnergy2DName + fiducial) - }; - - // Define the scaling factors for each plot. - double scaleFactor = 19000.0 / 9736969.0; - - // Define the plot titles and arrays for 1D plots. - IHistogram1D[][] plots = { energySum, timeCoincidence }; - String titles[] = { energySumName, timeCoincidenceName, coplanaritySum2DName, hCoplanaritySum2DName, energySum2DName, timeEnergy2DName }; - String[] xTitles = { "Energy (GeV)", "Time Difference (ns)" }; - String yTitle = "Rate (Hz)"; - - // Define the plot titles and arrays for 2D plots. - IHistogram2D[][] plots2D = { coplanaritySum, hcoplanaritySum, energySum2D, timeEnergy }; - String[] titles2D = { coplanaritySum2DName, hCoplanaritySum2DName, energySum2DName, timeEnergy2DName }; - String[] xTitles2D = { "Coplanarity (Degrees)", "Coplanarity (Degrees)", "Top Cluster Energy (GeV)", "Time Coincidence (ns)" }; - String[] yTitles2D = { "Energy Sum (GeV)", "Energy Sum (GeV)", "Bottom Cluster Energy (GeV)", "Energy Sum (GeV)" }; - String zTitle2D = "Rate (Hz)"; - - // Create a plot formatting module. - PlotFormatModule module = new PlotFormatModule(); - - // Define the plot color. - ColorStyle plotColor = ColorStyle.MS_BLUE; - - // Define the plots to be read. - for(int i = 0; i < plots.length; i++) { - plots[i][0].scale(scaleFactor); - plots[i][1].scale(scaleFactor); - module.addPlot1D(new FormattedPlot1D(plots[i][0], plotColor, xTitles[i], yTitle, titles[i])); - module.addPlot1D(new FormattedPlot1D(plots[i][1], plotColor, xTitles[i], yTitle, titles[i] + fiducial)); - } - for(int i = 0; i < plots2D.length; i++) { - plots2D[i][0].scale(scaleFactor); - plots2D[i][1].scale(scaleFactor); - module.addPlot2D(new FormattedPlot2D(plots2D[i][0], false, xTitles2D[i], yTitles2D[i], titles2D[i])); - module.addPlot2D(new FormattedPlot2D(plots2D[i][1], false, xTitles2D[i], yTitles2D[i], titles2D[i] + fiducial)); - } - - // Display the plots. - //module.displayPlots(); - module.savePlots("C:\\Users\\Kyle\\Desktop\\EnergyShift\\run-5772\\RafoPlots\\"); - module.exportPlots("C:\\Users\\Kyle\\Desktop\\EnergyShift\\run-5772\\RafoPlots\\"); - - // Close the tree. - tree.close(); - } + /** + * Loads all plots in a file and formats them according to the + * indicated style. + * @param args - Unused default executable parameter. + * @throws IOException Occurs if there is an issue opening the file. + */ + public static void main(String[] args) throws IOException { + // Define the root directory for the plots. + String rootDir = "D:\\cygwin64\\home\\Kyle\\"; + + // Define the new name of the file containing the trigger plots. + String plotFile = rootDir + "mte-out.aida"; + + // Get the plots file and open it. + IAnalysisFactory af = IAnalysisFactory.create(); + ITree tree = af.createTreeFactory().create(plotFile); + if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } + + // Declare the histogram names. + String energySumName = "Energy Sum"; + String timeCoincidenceName = "Time Coincidence"; + String timeEnergy2DName = "Cluster Time vs. Cluster Energy"; + String hCoplanaritySum2DName = "Hardware Coplanarity vs. Energy Sum"; + String coplanaritySum2DName = "Calculated Coplanarity vs. Energy Sum"; + String energySum2DName = "Top Cluster Energy vs. Bottom Cluster Energy"; + String fiducial = " (Fiducial Region)"; + + // Get the histograms. + IHistogram1D[] energySum = { + (IHistogram1D) tree.find("Trident/" + energySumName), + (IHistogram1D) tree.find("Trident/" + energySumName + fiducial) + }; + IHistogram1D[] timeCoincidence = { + (IHistogram1D) tree.find("Trident/" + timeCoincidenceName), + (IHistogram1D) tree.find("Trident/" + timeCoincidenceName + fiducial) + }; + IHistogram2D[] coplanaritySum = { + (IHistogram2D) tree.find("Trident/" + coplanaritySum2DName), + (IHistogram2D) tree.find("Trident/" + coplanaritySum2DName + fiducial) + }; + IHistogram2D[] hcoplanaritySum = { + (IHistogram2D) tree.find("Trident/" + hCoplanaritySum2DName), + (IHistogram2D) tree.find("Trident/" + hCoplanaritySum2DName + fiducial) + }; + IHistogram2D[] energySum2D = { + (IHistogram2D) tree.find("Trident/" + energySum2DName), + (IHistogram2D) tree.find("Trident/" + energySum2DName + fiducial) + }; + IHistogram2D[] timeEnergy = { + (IHistogram2D) tree.find("Trident/" + timeEnergy2DName), + (IHistogram2D) tree.find("Trident/" + timeEnergy2DName + fiducial) + }; + + // Define the scaling factors for each plot. + double scaleFactor = 19000.0 / 9736969.0; + + // Define the plot titles and arrays for 1D plots. + IHistogram1D[][] plots = { energySum, timeCoincidence }; + String titles[] = { energySumName, timeCoincidenceName, coplanaritySum2DName, hCoplanaritySum2DName, energySum2DName, timeEnergy2DName }; + String[] xTitles = { "Energy (GeV)", "Time Difference (ns)" }; + String yTitle = "Rate (Hz)"; + + // Define the plot titles and arrays for 2D plots. + IHistogram2D[][] plots2D = { coplanaritySum, hcoplanaritySum, energySum2D, timeEnergy }; + String[] titles2D = { coplanaritySum2DName, hCoplanaritySum2DName, energySum2DName, timeEnergy2DName }; + String[] xTitles2D = { "Coplanarity (Degrees)", "Coplanarity (Degrees)", "Top Cluster Energy (GeV)", "Time Coincidence (ns)" }; + String[] yTitles2D = { "Energy Sum (GeV)", "Energy Sum (GeV)", "Bottom Cluster Energy (GeV)", "Energy Sum (GeV)" }; + String zTitle2D = "Rate (Hz)"; + + // Create a plot formatting module. + PlotFormatModule module = new PlotFormatModule(); + + // Define the plot color. + ColorStyle plotColor = ColorStyle.MS_BLUE; + + // Define the plots to be read. + for(int i = 0; i < plots.length; i++) { + plots[i][0].scale(scaleFactor); + plots[i][1].scale(scaleFactor); + module.addPlot1D(new FormattedPlot1D(plots[i][0], plotColor, xTitles[i], yTitle, titles[i])); + module.addPlot1D(new FormattedPlot1D(plots[i][1], plotColor, xTitles[i], yTitle, titles[i] + fiducial)); + } + for(int i = 0; i < plots2D.length; i++) { + plots2D[i][0].scale(scaleFactor); + plots2D[i][1].scale(scaleFactor); + module.addPlot2D(new FormattedPlot2D(plots2D[i][0], false, xTitles2D[i], yTitles2D[i], titles2D[i])); + module.addPlot2D(new FormattedPlot2D(plots2D[i][1], false, xTitles2D[i], yTitles2D[i], titles2D[i] + fiducial)); + } + + // Display the plots. + //module.displayPlots(); + module.savePlots("C:\\Users\\Kyle\\Desktop\\EnergyShift\\run-5772\\RafoPlots\\"); + module.exportPlots("C:\\Users\\Kyle\\Desktop\\EnergyShift\\run-5772\\RafoPlots\\"); + + // Close the tree. + tree.close(); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/SingleTriggerPlotsFormatter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/SingleTriggerPlotsFormatter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/SingleTriggerPlotsFormatter.java Wed Mar 9 11:43:24 2016 @@ -13,151 +13,151 @@ import hep.aida.ITree; public class SingleTriggerPlotsFormatter { - - public static void main(String[] args) throws IllegalArgumentException, IOException { - // Define the root directory for the plots. - String rootDir = "D:\\cygwin64\\home\\Kyle\\"; - - // Define the new name of the file containing the trigger plots. - String plotFile = rootDir + "trident-readout-full.aida"; - - // Get the plots file and open it. - IAnalysisFactory af = IAnalysisFactory.create(); - ITree tree = af.createTreeFactory().create(plotFile); - if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } - - // Define plots variables. - int UNCUT = 0; - int TRIGGERED = 1; - String[] plotsDir = { "NoCuts/", "PassedAll/" }; - int PLOT_HIT_COUNT = 0; - int PLOT_SEED_ENERGY = 1; - int PLOT_CLUSTER_ENERGY = 2; - int PLOT_COPLANARITY = 3; - int PLOT_ENERGY_SUM = 4; - int PLOT_ENERGY_DIFF = 5; - int PLOT_ENERGY_SLOPE = 6; - int PLOT_SEED_DIST = 0; - int PLOT_ENERGY_SUM_2D = 1; - - // Define the internal plot names. - String[] plotNameInternal1D = new String[7]; - String[] plotNameInternal2D = new String[2]; - plotNameInternal1D[PLOT_HIT_COUNT] = "Cluster Hit Count"; - plotNameInternal1D[PLOT_SEED_ENERGY] = "Cluster Seed Energy"; - plotNameInternal1D[PLOT_CLUSTER_ENERGY] = "Cluster Total Energy"; - plotNameInternal1D[PLOT_COPLANARITY] = "Pair Coplanarity"; - plotNameInternal1D[PLOT_ENERGY_SUM] = "Pair Energy Sum"; - plotNameInternal1D[PLOT_ENERGY_DIFF] = "Pair Energy Difference"; - plotNameInternal1D[PLOT_ENERGY_SLOPE] = "Pair Energy Slope"; - plotNameInternal2D[PLOT_SEED_DIST] = "Cluster Seed"; - plotNameInternal2D[PLOT_ENERGY_SUM_2D] = "Pair Energy Sum 2D"; - - // Define the plot display names. - String[] plotName1D = new String[7]; - String[] plotName2D = new String[2]; - for(int j = 0; j < plotNameInternal1D.length; j++) { - plotName1D[j] = plotNameInternal1D[j]; - } - for(int j = 0; j < plotNameInternal2D.length; j++) { - plotName2D[j] = plotNameInternal2D[j]; - } - plotName1D[PLOT_ENERGY_SUM] = "1D Pair Energy Sum"; - plotName2D[PLOT_SEED_DIST] = "Cluster Seed Distribution"; - plotName2D[PLOT_ENERGY_SUM_2D] = "2D Pair Energy Sum"; - - String[] xTitles1D = new String[plotName1D.length]; - String[] xTitles2D = new String[plotName2D.length]; - xTitles1D[PLOT_HIT_COUNT] = "Hit Count"; - xTitles1D[PLOT_SEED_ENERGY] = "Seed Energy (GeV)"; - xTitles1D[PLOT_CLUSTER_ENERGY] = "Cluster Energy (GeV)"; - xTitles1D[PLOT_COPLANARITY] = "Coplanarity Angle (Degrees)"; - xTitles1D[PLOT_ENERGY_SUM] = "Energy Sum (GeV)"; - xTitles1D[PLOT_ENERGY_DIFF] = "Energy Difference (GeV)"; - xTitles1D[PLOT_ENERGY_SLOPE] = "Energy Slope (GeV)"; - xTitles2D[PLOT_SEED_DIST] = "x-Index"; - xTitles2D[PLOT_ENERGY_SUM_2D] = "First Cluster Energy (GeV)"; - String yTitle1D = "Count"; - String[] yTitles2D = new String[plotName2D.length]; - yTitles2D[PLOT_SEED_DIST] = "y-Index"; - yTitles2D[PLOT_ENERGY_SUM_2D] = "Second Cluster Energy (GeV)"; - - // Define axis ranges. - double[] axisRanges1D = new double[plotName1D.length]; - axisRanges1D[PLOT_HIT_COUNT] = -1; - axisRanges1D[PLOT_SEED_ENERGY] = 1.1; - axisRanges1D[PLOT_CLUSTER_ENERGY] = 1.1; - axisRanges1D[PLOT_COPLANARITY] = 180; - axisRanges1D[PLOT_ENERGY_SUM] = 2.2; - axisRanges1D[PLOT_ENERGY_DIFF] = 1.1; - axisRanges1D[PLOT_ENERGY_SLOPE] = 2.4; - double[] xAxisRanges2D = new double[plotName2D.length]; - double[] yAxisRanges2D = new double[plotName2D.length]; - xAxisRanges2D[PLOT_SEED_DIST] = -1; - xAxisRanges2D[PLOT_ENERGY_SUM_2D] = 1.1; - yAxisRanges2D[PLOT_SEED_DIST] = -1; - yAxisRanges2D[PLOT_ENERGY_SUM_2D] = 1.1; - - // Define the plot names. - String[][] plotLocations1D = new String[plotsDir.length][plotNameInternal1D.length]; - String[][] plotLocations2D = new String[plotsDir.length][plotNameInternal2D.length]; - for(int i = 0; i < plotsDir.length; i++) { - for(int j = 0; j < plotNameInternal1D.length; j++) { - plotLocations1D[i][j] = plotsDir[i] + plotNameInternal1D[j]; - } - } - for(int i = 0; i < plotsDir.length; i++) { - for(int j = 0; j < plotNameInternal2D.length; j++) { - plotLocations2D[i][j] = plotsDir[i] + plotNameInternal2D[j]; - } - } - - // Create a plot formatting module. - PlotFormatModule module = new PlotFormatModule(); - - // Load the plot objects. - for(int i = 0; i < plotName1D.length; i++) { - // Get the uncut and triggered plots. - IHistogram1D uncutPlot = (IHistogram1D) tree.find(plotLocations1D[UNCUT][i]); - IHistogram1D triggeredPlot = (IHistogram1D) tree.find(plotLocations1D[TRIGGERED][i] + " (Passed All Cuts)"); - - // Make a formatted plot for each. - FormattedPlot1D uncutFormattedPlot; - FormattedPlot1D triggeredFormattedPlot; - if(axisRanges1D[i] != -1) { - uncutFormattedPlot = new FormattedPlot1D(uncutPlot, PlotsFormatter.ColorStyle.GREY, xTitles1D[i], yTitle1D, plotName1D[i] + " (No Cuts)", axisRanges1D[i]); - triggeredFormattedPlot = new FormattedPlot1D(triggeredPlot, PlotsFormatter.ColorStyle.MS_GREEN, xTitles1D[i], yTitle1D, plotName1D[i] + " (Triggered)", axisRanges1D[i]); - } else { - uncutFormattedPlot = new FormattedPlot1D(uncutPlot, PlotsFormatter.ColorStyle.GREY, xTitles1D[i], yTitle1D, plotName1D[i] + " (No Cuts)"); - triggeredFormattedPlot = new FormattedPlot1D(triggeredPlot, PlotsFormatter.ColorStyle.MS_GREEN, xTitles1D[i], yTitle1D, plotName1D[i] + " (Triggered)"); - } - - // Add the plots to the module. - module.addPlot1D(uncutFormattedPlot); - module.addPlot1D(triggeredFormattedPlot); - } - for(int i = 0; i < plotName2D.length; i++) { - // Get the uncut and triggered plots. - IHistogram2D uncutPlot = (IHistogram2D) tree.find(plotLocations2D[UNCUT][i]); - IHistogram2D triggeredPlot = (IHistogram2D) tree.find(plotLocations2D[TRIGGERED][i] + " (Passed All Cuts)"); - - // Make a formatted plot for each. - FormattedPlot2D uncutFormattedPlot; - FormattedPlot2D triggeredFormattedPlot; - if(xAxisRanges2D[i] != -1) { - uncutFormattedPlot = new FormattedPlot2D(uncutPlot, true, xTitles2D[i], yTitles2D[i], plotName2D[i] + " (No Cuts)", xAxisRanges2D[i], yAxisRanges2D[i]); - triggeredFormattedPlot = new FormattedPlot2D(triggeredPlot, true, xTitles2D[i], yTitles2D[i], plotName2D[i] + " (Triggered)", xAxisRanges2D[i], yAxisRanges2D[i]); - } else { - uncutFormattedPlot = new FormattedPlot2D(uncutPlot, true, xTitles2D[i], yTitles2D[i], plotName2D[i] + " (No Cuts)"); - triggeredFormattedPlot = new FormattedPlot2D(triggeredPlot, true, xTitles2D[i], yTitles2D[i], plotName2D[i] + " (Triggered)"); - } - - // Add the plots to the module. - module.addPlot2D(uncutFormattedPlot); - module.addPlot2D(triggeredFormattedPlot); - } - - // Save the plots. - module.savePlots("C:\\Users\\Kyle\\Desktop\\EnergyShift\\MonteCarlo\\Trident\\Trigger\\"); - } + + public static void main(String[] args) throws IllegalArgumentException, IOException { + // Define the root directory for the plots. + String rootDir = "D:\\cygwin64\\home\\Kyle\\"; + + // Define the new name of the file containing the trigger plots. + String plotFile = rootDir + "trident-readout-full.aida"; + + // Get the plots file and open it. + IAnalysisFactory af = IAnalysisFactory.create(); + ITree tree = af.createTreeFactory().create(plotFile); + if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } + + // Define plots variables. + int UNCUT = 0; + int TRIGGERED = 1; + String[] plotsDir = { "NoCuts/", "PassedAll/" }; + int PLOT_HIT_COUNT = 0; + int PLOT_SEED_ENERGY = 1; + int PLOT_CLUSTER_ENERGY = 2; + int PLOT_COPLANARITY = 3; + int PLOT_ENERGY_SUM = 4; + int PLOT_ENERGY_DIFF = 5; + int PLOT_ENERGY_SLOPE = 6; + int PLOT_SEED_DIST = 0; + int PLOT_ENERGY_SUM_2D = 1; + + // Define the internal plot names. + String[] plotNameInternal1D = new String[7]; + String[] plotNameInternal2D = new String[2]; + plotNameInternal1D[PLOT_HIT_COUNT] = "Cluster Hit Count"; + plotNameInternal1D[PLOT_SEED_ENERGY] = "Cluster Seed Energy"; + plotNameInternal1D[PLOT_CLUSTER_ENERGY] = "Cluster Total Energy"; + plotNameInternal1D[PLOT_COPLANARITY] = "Pair Coplanarity"; + plotNameInternal1D[PLOT_ENERGY_SUM] = "Pair Energy Sum"; + plotNameInternal1D[PLOT_ENERGY_DIFF] = "Pair Energy Difference"; + plotNameInternal1D[PLOT_ENERGY_SLOPE] = "Pair Energy Slope"; + plotNameInternal2D[PLOT_SEED_DIST] = "Cluster Seed"; + plotNameInternal2D[PLOT_ENERGY_SUM_2D] = "Pair Energy Sum 2D"; + + // Define the plot display names. + String[] plotName1D = new String[7]; + String[] plotName2D = new String[2]; + for(int j = 0; j < plotNameInternal1D.length; j++) { + plotName1D[j] = plotNameInternal1D[j]; + } + for(int j = 0; j < plotNameInternal2D.length; j++) { + plotName2D[j] = plotNameInternal2D[j]; + } + plotName1D[PLOT_ENERGY_SUM] = "1D Pair Energy Sum"; + plotName2D[PLOT_SEED_DIST] = "Cluster Seed Distribution"; + plotName2D[PLOT_ENERGY_SUM_2D] = "2D Pair Energy Sum"; + + String[] xTitles1D = new String[plotName1D.length]; + String[] xTitles2D = new String[plotName2D.length]; + xTitles1D[PLOT_HIT_COUNT] = "Hit Count"; + xTitles1D[PLOT_SEED_ENERGY] = "Seed Energy (GeV)"; + xTitles1D[PLOT_CLUSTER_ENERGY] = "Cluster Energy (GeV)"; + xTitles1D[PLOT_COPLANARITY] = "Coplanarity Angle (Degrees)"; + xTitles1D[PLOT_ENERGY_SUM] = "Energy Sum (GeV)"; + xTitles1D[PLOT_ENERGY_DIFF] = "Energy Difference (GeV)"; + xTitles1D[PLOT_ENERGY_SLOPE] = "Energy Slope (GeV)"; + xTitles2D[PLOT_SEED_DIST] = "x-Index"; + xTitles2D[PLOT_ENERGY_SUM_2D] = "First Cluster Energy (GeV)"; + String yTitle1D = "Count"; + String[] yTitles2D = new String[plotName2D.length]; + yTitles2D[PLOT_SEED_DIST] = "y-Index"; + yTitles2D[PLOT_ENERGY_SUM_2D] = "Second Cluster Energy (GeV)"; + + // Define axis ranges. + double[] axisRanges1D = new double[plotName1D.length]; + axisRanges1D[PLOT_HIT_COUNT] = -1; + axisRanges1D[PLOT_SEED_ENERGY] = 1.1; + axisRanges1D[PLOT_CLUSTER_ENERGY] = 1.1; + axisRanges1D[PLOT_COPLANARITY] = 180; + axisRanges1D[PLOT_ENERGY_SUM] = 2.2; + axisRanges1D[PLOT_ENERGY_DIFF] = 1.1; + axisRanges1D[PLOT_ENERGY_SLOPE] = 2.4; + double[] xAxisRanges2D = new double[plotName2D.length]; + double[] yAxisRanges2D = new double[plotName2D.length]; + xAxisRanges2D[PLOT_SEED_DIST] = -1; + xAxisRanges2D[PLOT_ENERGY_SUM_2D] = 1.1; + yAxisRanges2D[PLOT_SEED_DIST] = -1; + yAxisRanges2D[PLOT_ENERGY_SUM_2D] = 1.1; + + // Define the plot names. + String[][] plotLocations1D = new String[plotsDir.length][plotNameInternal1D.length]; + String[][] plotLocations2D = new String[plotsDir.length][plotNameInternal2D.length]; + for(int i = 0; i < plotsDir.length; i++) { + for(int j = 0; j < plotNameInternal1D.length; j++) { + plotLocations1D[i][j] = plotsDir[i] + plotNameInternal1D[j]; + } + } + for(int i = 0; i < plotsDir.length; i++) { + for(int j = 0; j < plotNameInternal2D.length; j++) { + plotLocations2D[i][j] = plotsDir[i] + plotNameInternal2D[j]; + } + } + + // Create a plot formatting module. + PlotFormatModule module = new PlotFormatModule(); + + // Load the plot objects. + for(int i = 0; i < plotName1D.length; i++) { + // Get the uncut and triggered plots. + IHistogram1D uncutPlot = (IHistogram1D) tree.find(plotLocations1D[UNCUT][i]); + IHistogram1D triggeredPlot = (IHistogram1D) tree.find(plotLocations1D[TRIGGERED][i] + " (Passed All Cuts)"); + + // Make a formatted plot for each. + FormattedPlot1D uncutFormattedPlot; + FormattedPlot1D triggeredFormattedPlot; + if(axisRanges1D[i] != -1) { + uncutFormattedPlot = new FormattedPlot1D(uncutPlot, PlotsFormatter.ColorStyle.GREY, xTitles1D[i], yTitle1D, plotName1D[i] + " (No Cuts)", axisRanges1D[i]); + triggeredFormattedPlot = new FormattedPlot1D(triggeredPlot, PlotsFormatter.ColorStyle.MS_GREEN, xTitles1D[i], yTitle1D, plotName1D[i] + " (Triggered)", axisRanges1D[i]); + } else { + uncutFormattedPlot = new FormattedPlot1D(uncutPlot, PlotsFormatter.ColorStyle.GREY, xTitles1D[i], yTitle1D, plotName1D[i] + " (No Cuts)"); + triggeredFormattedPlot = new FormattedPlot1D(triggeredPlot, PlotsFormatter.ColorStyle.MS_GREEN, xTitles1D[i], yTitle1D, plotName1D[i] + " (Triggered)"); + } + + // Add the plots to the module. + module.addPlot1D(uncutFormattedPlot); + module.addPlot1D(triggeredFormattedPlot); + } + for(int i = 0; i < plotName2D.length; i++) { + // Get the uncut and triggered plots. + IHistogram2D uncutPlot = (IHistogram2D) tree.find(plotLocations2D[UNCUT][i]); + IHistogram2D triggeredPlot = (IHistogram2D) tree.find(plotLocations2D[TRIGGERED][i] + " (Passed All Cuts)"); + + // Make a formatted plot for each. + FormattedPlot2D uncutFormattedPlot; + FormattedPlot2D triggeredFormattedPlot; + if(xAxisRanges2D[i] != -1) { + uncutFormattedPlot = new FormattedPlot2D(uncutPlot, true, xTitles2D[i], yTitles2D[i], plotName2D[i] + " (No Cuts)", xAxisRanges2D[i], yAxisRanges2D[i]); + triggeredFormattedPlot = new FormattedPlot2D(triggeredPlot, true, xTitles2D[i], yTitles2D[i], plotName2D[i] + " (Triggered)", xAxisRanges2D[i], yAxisRanges2D[i]); + } else { + uncutFormattedPlot = new FormattedPlot2D(uncutPlot, true, xTitles2D[i], yTitles2D[i], plotName2D[i] + " (No Cuts)"); + triggeredFormattedPlot = new FormattedPlot2D(triggeredPlot, true, xTitles2D[i], yTitles2D[i], plotName2D[i] + " (Triggered)"); + } + + // Add the plots to the module. + module.addPlot2D(uncutFormattedPlot); + module.addPlot2D(triggeredFormattedPlot); + } + + // Save the plots. + module.savePlots("C:\\Users\\Kyle\\Desktop\\EnergyShift\\MonteCarlo\\Trident\\Trigger\\"); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TridentTrackFormatter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TridentTrackFormatter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TridentTrackFormatter.java Wed Mar 9 11:43:24 2016 @@ -16,187 +16,187 @@ import hep.aida.ref.plotter.PlotterRegion; public class TridentTrackFormatter { - /** - * Loads all plots in a file and formats them according to the - * indicated style. - * @param args - Unused default executable parameter. - * @throws IOException Occurs if there is an issue opening the file. - */ - public static void main(String[] args) throws IOException { - // Define the root directory for the plots. - String rootDir = "D:\\cygwin64\\home\\Kyle\\tmp\\"; - - // Define the new name of the file containing the trigger plots. - String plotFile = rootDir + "trident-out.aida"; - - // Get the plots file and open it. - IAnalysisFactory af = IAnalysisFactory.create(); - ITree tree = af.createTreeFactory().create(plotFile); - if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } - - // Declare the histogram names. - String trackName = "Tracks in Event (All)"; - String posTrackName = "Tracks in Event (Positive)"; - String negTrackName = "Tracks in Event (Negative)"; - String posMomentumName = "Momentum (Positive)"; - String negMomentumName = "Momentum (Negative)"; - String energySumName = "Energy Sum"; - String momentumSumName = "Momentum Sum"; - String energyMomentumDiffName = "Energy-Momentum Difference"; - String invariantMassName = "Invariant Mass"; - String energySum2DName = "2D Energy Sum"; - String momentumSum2DName = "2D Momentum Sum"; - String positionName = "Track Cluster Position"; - - // Get the histograms. - IHistogram1D[] tracks = { - (IHistogram1D) tree.find("Trident Analysis/All/" + trackName), - (IHistogram1D) tree.find("Trident Analysis/Cluster/" + trackName) - }; - IHistogram1D[] posTracks = { - (IHistogram1D) tree.find("Trident Analysis/All/" + posTrackName), - (IHistogram1D) tree.find("Trident Analysis/Cluster/" + posTrackName) - }; - IHistogram1D[] negTracks = { - (IHistogram1D) tree.find("Trident Analysis/All/" + negTrackName), - (IHistogram1D) tree.find("Trident Analysis/Cluster/" + negTrackName) - }; - IHistogram1D[] posMomentum = { - (IHistogram1D) tree.find("Trident Analysis/All/" + posMomentumName), - (IHistogram1D) tree.find("Trident Analysis/Cluster/" + posMomentumName) - }; - IHistogram1D[] negMomentum = { - (IHistogram1D) tree.find("Trident Analysis/All/" + negMomentumName), - (IHistogram1D) tree.find("Trident Analysis/Cluster/" + negMomentumName) - }; - IHistogram1D[] energySum = { - (IHistogram1D) tree.find("Trident Analysis/All/" + energySumName), - (IHistogram1D) tree.find("Trident Analysis/Cluster/" + energySumName) - }; - IHistogram1D[] momentumSum = { - (IHistogram1D) tree.find("Trident Analysis/All/" + momentumSumName), - (IHistogram1D) tree.find("Trident Analysis/Cluster/" + momentumSumName) - }; - IHistogram1D[] energyMomentumDiff = { - (IHistogram1D) tree.find("Trident Analysis/All/" + energyMomentumDiffName), - (IHistogram1D) tree.find("Trident Analysis/Cluster/" + energyMomentumDiffName) - }; - IHistogram1D[] invariantMass = { - (IHistogram1D) tree.find("Trident Analysis/All/" + invariantMassName), - (IHistogram1D) tree.find("Trident Analysis/Cluster/" + invariantMassName) - }; - IHistogram2D[] energySum2D = { - (IHistogram2D) tree.find("Trident Analysis/All/" + energySum2DName), - (IHistogram2D) tree.find("Trident Analysis/Cluster/" + energySum2DName) - }; - IHistogram2D[] momentumSum2D = { - (IHistogram2D) tree.find("Trident Analysis/All/" + momentumSum2DName), - (IHistogram2D) tree.find("Trident Analysis/Cluster/" + momentumSum2DName) - }; - IHistogram2D[] position = { - (IHistogram2D) tree.find("Trident Analysis/All/" + positionName), - (IHistogram2D) tree.find("Trident Analysis/Cluster/" + positionName) - }; - - // Re-bin the histograms to have 5-times larger bins. First, - // get the bin count and upper and lower bounds of the plot. - int bins = invariantMass[0].axis().bins(); - double low = invariantMass[0].axis().binLowerEdge(0); - double high = invariantMass[0].axis().binUpperEdge(invariantMass[0].axis().bins() - 1); - - // Create new plots with the larger bin sizes. - AIDA aida = AIDA.defaultInstance(); - IHistogram1D[] newPlot = new IHistogram1D[2]; - newPlot[0] = aida.histogram1D(invariantMassName, bins / 5, low, high); - newPlot[1] = aida.histogram1D("Cluster " + invariantMassName, bins / 5, low, high); - - // Populate the new plots with the data from the old ones. - for(int j = 0; j < 2; j++) { - for(int i = 0; i < bins; i++) { - int entries = invariantMass[j].binEntries(i); - double center = invariantMass[j].axis().binCenter(i); - for(int k = 0; k < entries; k++) { - newPlot[j].fill(center); - } - } - } - - // Replace the old plots. - invariantMass = newPlot; - - // Define the scaling factors for each plot. - double scaleFactor = 1; - - // Define the plot titles and arrays for 1D plots. - IHistogram[][] plots = { tracks, posTracks, negTracks, posMomentum, negMomentum, energySum, momentumSum, energyMomentumDiff, invariantMass }; - String[] titles = { trackName, posTrackName, negTrackName, posMomentumName, negMomentumName, energySumName, momentumSumName, - energyMomentumDiffName, invariantMassName }; - String[] xTitles = { "Tracks", "Tracks", "Tracks", "Momentum (GeV)", "Momentum (GeV)", "Energy Sum (GeV)", "Momentum Sum (GeV)", - "|E_Cluster - P_Track| (GeV)", "Invariant Mass (GeV)" }; - String yTitle = "Count"; - - // Define the plot titles and arrays for 2D plots. - IHistogram2D[][] plots2D = { energySum2D, momentumSum2D, position }; - String[] titles2D = { energySum2DName, momentumSum2DName, positionName }; - String[] xTitles2D = { "Positive Cluster Energy", "Positive Track Momentum", "x-Index" }; - String[] yTitles2D = { "Negative Cluster Energy", "Negative Track Momentum", "y-Index" }; - String zTitle2D = "Count"; - - // Create a plotter factory. - IPlotterFactory plotterFactory = af.createPlotterFactory(); - - // Format and display the basic histograms. - for(int i = 0; i < plots.length; i++) { - for(int j = 0; j < 2; j++) { - // Scale the histogram by the appropriate scaling factor. - plots[i][j].scale(1.0 / scaleFactor); - - // Create a plotter and plotting region for the plot. - IPlotter plotter = plotterFactory.create((j == 1 ? "Cluster " : "") + titles[i]); - plotter.createRegions(1); - plotter.region(0).plot(plots[i][j]); - - // Format the axis labels. - PlotterRegion region = (PlotterRegion) plotter.region(0); - region.getPlot().setTitle((j == 1 ? "Cluster " : "") + titles[i]); - region.getPlot().getXAxis().setLabel(xTitles[i]); - region.getPlot().getYAxis().setLabel(yTitle); - - // Format the fonts and general plot presentation. - PlotsFormatter.setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); - - // Show the plot. - plotter.setParameter("plotterWidth", "2000"); - plotter.setParameter("plotterHeight", "1200"); - plotter.show(); - } - } - - // Format and display the 2D histogram. - for(int i = 0; i < plots2D.length; i++) { - for(int j = 0; j < 2; j++) { - plots2D[i][j].scale(1.0 / scaleFactor); - IPlotter plotter2D = plotterFactory.create((j == 1 ? "Cluster " : "") + titles2D[i]); - plotter2D.createRegions(1); - plotter2D.region(0).plot(plots2D[i][j]); - - // Format the axis labels. - PlotterRegion region2D = (PlotterRegion) plotter2D.region(0); - region2D.getPlot().setTitle((j == 1 ? "Cluster " : "") + titles2D[i]); - region2D.getPlot().getXAxis().setLabel(xTitles2D[i]); - region2D.getPlot().getYAxis().setLabel(yTitles2D[i]); - - // Format the fonts and general plot presentation. - PlotsFormatter.setDefault2DStyle(region2D, true); - - // Show the plot. - plotter2D.setParameter("plotterWidth", "2000"); - plotter2D.setParameter("plotterHeight", "1200"); - plotter2D.show(); - } - } - - // Close the tree. - tree.close(); - } + /** + * Loads all plots in a file and formats them according to the + * indicated style. + * @param args - Unused default executable parameter. + * @throws IOException Occurs if there is an issue opening the file. + */ + public static void main(String[] args) throws IOException { + // Define the root directory for the plots. + String rootDir = "D:\\cygwin64\\home\\Kyle\\tmp\\"; + + // Define the new name of the file containing the trigger plots. + String plotFile = rootDir + "trident-out.aida"; + + // Get the plots file and open it. + IAnalysisFactory af = IAnalysisFactory.create(); + ITree tree = af.createTreeFactory().create(plotFile); + if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } + + // Declare the histogram names. + String trackName = "Tracks in Event (All)"; + String posTrackName = "Tracks in Event (Positive)"; + String negTrackName = "Tracks in Event (Negative)"; + String posMomentumName = "Momentum (Positive)"; + String negMomentumName = "Momentum (Negative)"; + String energySumName = "Energy Sum"; + String momentumSumName = "Momentum Sum"; + String energyMomentumDiffName = "Energy-Momentum Difference"; + String invariantMassName = "Invariant Mass"; + String energySum2DName = "2D Energy Sum"; + String momentumSum2DName = "2D Momentum Sum"; + String positionName = "Track Cluster Position"; + + // Get the histograms. + IHistogram1D[] tracks = { + (IHistogram1D) tree.find("Trident Analysis/All/" + trackName), + (IHistogram1D) tree.find("Trident Analysis/Cluster/" + trackName) + }; + IHistogram1D[] posTracks = { + (IHistogram1D) tree.find("Trident Analysis/All/" + posTrackName), + (IHistogram1D) tree.find("Trident Analysis/Cluster/" + posTrackName) + }; + IHistogram1D[] negTracks = { + (IHistogram1D) tree.find("Trident Analysis/All/" + negTrackName), + (IHistogram1D) tree.find("Trident Analysis/Cluster/" + negTrackName) + }; + IHistogram1D[] posMomentum = { + (IHistogram1D) tree.find("Trident Analysis/All/" + posMomentumName), + (IHistogram1D) tree.find("Trident Analysis/Cluster/" + posMomentumName) + }; + IHistogram1D[] negMomentum = { + (IHistogram1D) tree.find("Trident Analysis/All/" + negMomentumName), + (IHistogram1D) tree.find("Trident Analysis/Cluster/" + negMomentumName) + }; + IHistogram1D[] energySum = { + (IHistogram1D) tree.find("Trident Analysis/All/" + energySumName), + (IHistogram1D) tree.find("Trident Analysis/Cluster/" + energySumName) + }; + IHistogram1D[] momentumSum = { + (IHistogram1D) tree.find("Trident Analysis/All/" + momentumSumName), + (IHistogram1D) tree.find("Trident Analysis/Cluster/" + momentumSumName) + }; + IHistogram1D[] energyMomentumDiff = { + (IHistogram1D) tree.find("Trident Analysis/All/" + energyMomentumDiffName), + (IHistogram1D) tree.find("Trident Analysis/Cluster/" + energyMomentumDiffName) + }; + IHistogram1D[] invariantMass = { + (IHistogram1D) tree.find("Trident Analysis/All/" + invariantMassName), + (IHistogram1D) tree.find("Trident Analysis/Cluster/" + invariantMassName) + }; + IHistogram2D[] energySum2D = { + (IHistogram2D) tree.find("Trident Analysis/All/" + energySum2DName), + (IHistogram2D) tree.find("Trident Analysis/Cluster/" + energySum2DName) + }; + IHistogram2D[] momentumSum2D = { + (IHistogram2D) tree.find("Trident Analysis/All/" + momentumSum2DName), + (IHistogram2D) tree.find("Trident Analysis/Cluster/" + momentumSum2DName) + }; + IHistogram2D[] position = { + (IHistogram2D) tree.find("Trident Analysis/All/" + positionName), + (IHistogram2D) tree.find("Trident Analysis/Cluster/" + positionName) + }; + + // Re-bin the histograms to have 5-times larger bins. First, + // get the bin count and upper and lower bounds of the plot. + int bins = invariantMass[0].axis().bins(); + double low = invariantMass[0].axis().binLowerEdge(0); + double high = invariantMass[0].axis().binUpperEdge(invariantMass[0].axis().bins() - 1); + + // Create new plots with the larger bin sizes. + AIDA aida = AIDA.defaultInstance(); + IHistogram1D[] newPlot = new IHistogram1D[2]; + newPlot[0] = aida.histogram1D(invariantMassName, bins / 5, low, high); + newPlot[1] = aida.histogram1D("Cluster " + invariantMassName, bins / 5, low, high); + + // Populate the new plots with the data from the old ones. + for(int j = 0; j < 2; j++) { + for(int i = 0; i < bins; i++) { + int entries = invariantMass[j].binEntries(i); + double center = invariantMass[j].axis().binCenter(i); + for(int k = 0; k < entries; k++) { + newPlot[j].fill(center); + } + } + } + + // Replace the old plots. + invariantMass = newPlot; + + // Define the scaling factors for each plot. + double scaleFactor = 1; + + // Define the plot titles and arrays for 1D plots. + IHistogram[][] plots = { tracks, posTracks, negTracks, posMomentum, negMomentum, energySum, momentumSum, energyMomentumDiff, invariantMass }; + String[] titles = { trackName, posTrackName, negTrackName, posMomentumName, negMomentumName, energySumName, momentumSumName, + energyMomentumDiffName, invariantMassName }; + String[] xTitles = { "Tracks", "Tracks", "Tracks", "Momentum (GeV)", "Momentum (GeV)", "Energy Sum (GeV)", "Momentum Sum (GeV)", + "|E_Cluster - P_Track| (GeV)", "Invariant Mass (GeV)" }; + String yTitle = "Count"; + + // Define the plot titles and arrays for 2D plots. + IHistogram2D[][] plots2D = { energySum2D, momentumSum2D, position }; + String[] titles2D = { energySum2DName, momentumSum2DName, positionName }; + String[] xTitles2D = { "Positive Cluster Energy", "Positive Track Momentum", "x-Index" }; + String[] yTitles2D = { "Negative Cluster Energy", "Negative Track Momentum", "y-Index" }; + String zTitle2D = "Count"; + + // Create a plotter factory. + IPlotterFactory plotterFactory = af.createPlotterFactory(); + + // Format and display the basic histograms. + for(int i = 0; i < plots.length; i++) { + for(int j = 0; j < 2; j++) { + // Scale the histogram by the appropriate scaling factor. + plots[i][j].scale(1.0 / scaleFactor); + + // Create a plotter and plotting region for the plot. + IPlotter plotter = plotterFactory.create((j == 1 ? "Cluster " : "") + titles[i]); + plotter.createRegions(1); + plotter.region(0).plot(plots[i][j]); + + // Format the axis labels. + PlotterRegion region = (PlotterRegion) plotter.region(0); + region.getPlot().setTitle((j == 1 ? "Cluster " : "") + titles[i]); + region.getPlot().getXAxis().setLabel(xTitles[i]); + region.getPlot().getYAxis().setLabel(yTitle); + + // Format the fonts and general plot presentation. + PlotsFormatter.setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); + + // Show the plot. + plotter.setParameter("plotterWidth", "2000"); + plotter.setParameter("plotterHeight", "1200"); + plotter.show(); + } + } + + // Format and display the 2D histogram. + for(int i = 0; i < plots2D.length; i++) { + for(int j = 0; j < 2; j++) { + plots2D[i][j].scale(1.0 / scaleFactor); + IPlotter plotter2D = plotterFactory.create((j == 1 ? "Cluster " : "") + titles2D[i]); + plotter2D.createRegions(1); + plotter2D.region(0).plot(plots2D[i][j]); + + // Format the axis labels. + PlotterRegion region2D = (PlotterRegion) plotter2D.region(0); + region2D.getPlot().setTitle((j == 1 ? "Cluster " : "") + titles2D[i]); + region2D.getPlot().getXAxis().setLabel(xTitles2D[i]); + region2D.getPlot().getYAxis().setLabel(yTitles2D[i]); + + // Format the fonts and general plot presentation. + PlotsFormatter.setDefault2DStyle(region2D, true); + + // Show the plot. + plotter2D.setParameter("plotterWidth", "2000"); + plotter2D.setParameter("plotterHeight", "1200"); + plotter2D.show(); + } + } + + // Close the tree. + tree.close(); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TriggerPlotsFormat.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TriggerPlotsFormat.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TriggerPlotsFormat.java Wed Mar 9 11:43:24 2016 @@ -20,331 +20,331 @@ import hep.aida.ref.plotter.PlotterRegion; public class TriggerPlotsFormat { - // Define plot fonts. - private static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 20); - private static final Font AXIS_FONT = new Font("Calibri", Font.BOLD, 25); - private static final Font TITLE_FONT = new Font("Calibri", Font.BOLD, 35); - - // Defines the color style options for plot data. - private enum ColorStyle { - MS_BLUE(new Color( 79, 129, 189), new Color( 36, 64, 97)), MS_ORANGE(new Color(247, 150, 70), new Color(152, 72, 6)), - MS_RED(new Color(192, 80, 77), new Color( 99, 36, 35)), GREY(new Color(166, 166, 166), new Color( 89, 89, 89)), - MS_GREEN(new Color(155, 187, 89), new Color( 79, 98, 40)), CRIMSON(new Color(161, 0, 0), new Color(104, 0, 0)), - RUST(new Color(161, 80, 0), new Color(105, 80, 0)), YELLOW(new Color(161, 161, 0), new Color(122, 109, 8)), - FOREST(new Color( 65, 102, 0), new Color( 37, 79, 0)), GREEN(new Color( 7, 132, 70), new Color( 7, 82, 30)), - TEAL(new Color( 0, 130, 130), new Color( 0, 90, 100)), CERULEAN(new Color( 0, 86, 130), new Color( 0, 28, 83)), - BLUE(new Color( 0, 33, 203), new Color( 0, 0, 137)), INDIGO(new Color( 68, 10, 127), new Color( 0, 0, 61)), - PURPLE(new Color(106, 0, 106), new Color( 63, 0, 56)), FUSCHIA(new Color(119, 0, 60), new Color( 60, 0, 60)); - - private final Color fillColor; - private final Color lineColor; - - private ColorStyle(Color fillColor, Color lineColor) { - this.fillColor = fillColor; - this.lineColor = lineColor; - } - - public Color getFillColor() { return fillColor; } - - public Color getLineColor() { return lineColor; } - }; - - /** - * Loads all plots in a file and formats them according to the - * indicated style. - * @param args - Unused default executable parameter. - * @throws IOException Occurs if there is an issue opening the file. - */ - public static void main(String[] args) throws IOException { - // Define the root directory for the plots. - String rootDir = "D:\\cygwin64\\home\\Kyle\\beam-plots\\base\\"; - //String rootDir = "D:\\cygwin64\\home\\Kyle\\aprime-plots\\base\\readout-plots\\"; - - // Define the new name of the file containing the trigger plots. - String[] plotFile = { - rootDir + "compiled-plots.aida" - //rootDir + "15-MeV\\compiled-plots.aida", - //rootDir + "20-MeV\\compiled-plots.aida", - //rootDir + "30-MeV\\compiled-plots.aida", - //rootDir + "40-MeV\\compiled-plots.aida", - //rootDir + "50-MeV\\compiled-plots.aida" - }; - - // Define the names of each plot. This will be used for the - // legend in the case of multiple plots. - String[] treeName = { - "Background", - "15 MeV A'", - "20 MeV A'", - "30 MeV A'", - "40 MeV A'", - "50 MeV A'" - }; - - // Define the color style for the plots. - ColorStyle[] dataColorStyle = { - ColorStyle.GREY, - ColorStyle.MS_GREEN, - ColorStyle.MS_BLUE, - ColorStyle.MS_ORANGE, - ColorStyle.MS_RED, - ColorStyle.TEAL, - ColorStyle.CRIMSON, - ColorStyle.FOREST - }; - - // Get the plots file and open it. - IAnalysisFactory af = IAnalysisFactory.create(); - ITree[] tree = new ITree[plotFile.length]; - for(int i = 0; i < plotFile.length; i++) { - tree[i] = af.createTreeFactory().create(plotFile[i]); - if(tree[i] == null) { throw new IllegalArgumentException("Unable to load plot file."); } - } - - // Get a list of all the histograms in the file. - List<List<String>> treeHistograms = new ArrayList<List<String>>(plotFile.length); - for(int i = 0; i < plotFile.length; i++) { - treeHistograms.add(getHistograms(tree[i], "/NoCuts/"));//, "/PassedAll/")); - } - - // Create a plotter factory. - IPlotterFactory plotterFactory = af.createPlotterFactory(); - - // Plot each histogram and format it. - for(String histogram : treeHistograms.get(0)) { - // Get the plot from the tree and verify that it is a 1D - // or 2D histogram. Other types are not supported. - IManagedObject histObject = tree[0].find(histogram); - if(!(histObject instanceof IHistogram1D) && !(histObject instanceof IHistogram2D)) { - continue; - } - - // Obtain the histogram object. - IBaseHistogram hist; - if(histObject instanceof IHistogram1D) { hist = (IHistogram1D) histObject; } - else { hist = (IHistogram2D) histObject; } - - // Define whether this is an overlay plot and whether - // this is a one or two dimensional plot. - boolean overlay = plotFile.length > 1; - boolean twoDimensional = hist instanceof IHistogram2D; - - // Generate the plotter and set its title. The plotter will - // use the title of the first tree's plot. - String plotTitle = hist.title(); - IPlotter plotter = plotterFactory.create(plotTitle); - - // For single plots and one-dimensional overlay plots, - // there should only be a single plotter region. - if(!twoDimensional || !overlay) { plotter.createRegions(1); } - - // For two-dimensional overlay plots, create a region for - // each plot individually. - else { plotter.createRegions(2, (int) Math.ceil(plotFile.length / 2.0)); } - - // Find the histogram in each of the trees and plot them - // all on the same region. - for(int i = 0; i < plotFile.length; i++) { - // Get the histogram from the tree. - IManagedObject treeObject = tree[i].find(histogram); - IBaseHistogram treeHist; - if(treeObject instanceof IHistogram1D) { treeHist = (IHistogram1D) treeObject; } - else { treeHist = (IHistogram2D) treeObject; } - - // Display the plot. - if(treeHist != null) { - // Set the title of plot to the name associated with - // its tree. This ensures that the correct name will - // appear on the legend. - if(plotFile.length > 1) { - treeHist.setTitle(treeName[i]); - } - - // Plot the tree's data in the plotter region. - if(!twoDimensional || !overlay) { plotter.region(0).plot(treeHist); } - else { - plotter.region(i).plot(treeHist); - setDefault2DStyle(((PlotterRegion) plotter.region(i)), dataColorStyle); - } - } - } - - // Format the plot region. - if(!twoDimensional) { setDefault1DStyle(((PlotterRegion) plotter.region(0)), dataColorStyle); } - else { setDefault2DStyle(((PlotterRegion) plotter.region(0)), dataColorStyle); } - - // Show the plotter. - plotter.region(0).setTitle(plotTitle); - plotter.setParameter("plotterWidth", "750"); - plotter.setParameter("plotterHeight", "600"); - //plotter.setParameter("plotterWidth", "2000"); - //plotter.setParameter("plotterHeight", "1200"); - plotter.show(); - } - - // Close the trees. - for(int i = 0; i < plotFile.length; i++) { - tree[i].close(); - } - } - - /** - * Sets the plot display formatting for 1D plots. - * @param region - The plotter region to format. - * @param color - The data color settings to use. - */ - private static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) { - // Get the names of each plot on in the region. - String[] dataNames = region.getAllDataNames(); - - // Check whether this is an overlay plot. Overlay plots contain - // more than one data name. - boolean overlay = (dataNames.length > 1 ? true : false); - - // Iterate over each plot in the region. - for(int i = 0; i < dataNames.length; i++) { - // Set the overlay style if needed. - if(overlay) { - // Get the fill style for the current data type. - JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); - - // Set the histogram style to display thick-lined bars - // with no fill. The color is set by the "color" argument. - fillStyle.setHistogramFill(false); - fillStyle.setHistogramBarLineWidth(3); - fillStyle.setHistogramBarLineColor(color[i].getFillColor()); - - // Set the legend text style. - region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20)); - } - - // Otherwise, set the fill style for a single plot. - else { - // Get the fill style for the current data type. - JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); - - // Set the histogram style to display thick-lined bars - // with a fill color. The colors are defined by the - // "color" argument. - fillStyle.setHistogramBarLineWidth(3); - fillStyle.setHistogramBarColor(color[i].getFillColor()); - fillStyle.setHistogramBarLineColor(color[i].getLineColor()); - } - - // Set the statistics box style. - region.getPlot().getStats().setVisible(true); - region.getPlot().getStats().setFont(BASIC_FONT); - - // Set the title font. - region.getPlot().getTitleObject().setFont(TITLE_FONT); - - // Set generic axis titles. - region.getPlot().getXAxis().setLabel("Data Label (Unit)"); - region.getPlot().getYAxis().setLabel("Count"); - - // Set the axis tick-mark fonts. - region.getPlot().getXAxis().setFont(BASIC_FONT); - region.getPlot().getYAxis().setFont(BASIC_FONT); - region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); - region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); - } - } - - /** - * Sets the plot display formatting for 1D plots. - * @param region - The plotter region to format. - * @param color - The data color settings to use. - */ - private static final void setDefault2DStyle(PlotterRegion region, ColorStyle[] color) { - // Get the fill style object. 2D plots should never be overlay - // plots, so there should only ever be one data name. - JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); - - // Set the fill style for a two-dimensional plot. - fillStyle.setLogZ(true); - fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP); - fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW); - - // Make the statistics box invisible. - region.getPlot().getStats().setVisible(false); - - // Set the general plot font (which is also the z-axis font). - region.getPlot().setFont(BASIC_FONT); - - // Set the title font. - region.getPlot().getTitleObject().setFont(TITLE_FONT); - - // Set generic axis titles. - region.getPlot().getXAxis().setLabel("Data Label (Unit)"); - region.getPlot().getYAxis().setLabel("Data Label (Unit)"); - - // Set the axis tick-mark fonts. - region.getPlot().getXAxis().setFont(BASIC_FONT); - region.getPlot().getYAxis().setFont(BASIC_FONT); - region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); - region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); - } - - /** - * Gets a list of all objects that are not directories in a tree. - * @param tree - The tree from which to extract the object names. - * @return Returns the object names as <code>String</code> objects - * in a <code>List</code> collection. - */ - private static final List<String> getHistograms(ITree tree) { - return getHistograms(tree, "/"); - } - - /** - * Gets a list of all objects that are not directories in a tree. - * @param tree - The tree from which to extract the object names. - * @return Returns the object names as <code>String</code> objects - * in a <code>List</code> collection. - */ - private static final List<String> getHistograms(ITree tree, String rootDir) { - return getHistograms(tree, rootDir, new ArrayList<String>()); - } - - /** - * Recursive method that gets all object names from a tree that - * are not directories. Method should not be called directly, but - * rather called only through the <code>getHistograms(ITree)</code> - * method. - * @param tree - The tree from which to obtain the object names. - * @param directory - The directory in which to search for objects. - * @param list - The list in which to place the objects. - * @return Returns the <code>List</code> collection that was given - * as an argument. - */ - private static final List<String> getHistograms(ITree tree, String directory, List<String> list) { - // Get the list of objects in the directory. - String[] treeObjects = tree.listObjectNames(directory); - - // Print the objects. - for(String objectName : treeObjects) { - // Check if the object is a directory. - boolean isDirectory = isDirectory(objectName); - - // If the object is a directory, get the histograms from it. - if(isDirectory) { - getHistograms(tree, objectName, list); - } - - // If the object is a plot, add it to the list. - else { list.add(objectName); } - } - - // Return the list. - return list; - } - - /** - * Checks whether a tree object is a directory. - * @param object - The object to check. - * @return Returns <code>true</code> if the object is a directory - * and <code>false</code> otherwise. - */ - private static final boolean isDirectory(String object) { - return (object.toCharArray()[object.length() - 1] == '/'); - } + // Define plot fonts. + private static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 20); + private static final Font AXIS_FONT = new Font("Calibri", Font.BOLD, 25); + private static final Font TITLE_FONT = new Font("Calibri", Font.BOLD, 35); + + // Defines the color style options for plot data. + private enum ColorStyle { + MS_BLUE(new Color( 79, 129, 189), new Color( 36, 64, 97)), MS_ORANGE(new Color(247, 150, 70), new Color(152, 72, 6)), + MS_RED(new Color(192, 80, 77), new Color( 99, 36, 35)), GREY(new Color(166, 166, 166), new Color( 89, 89, 89)), + MS_GREEN(new Color(155, 187, 89), new Color( 79, 98, 40)), CRIMSON(new Color(161, 0, 0), new Color(104, 0, 0)), + RUST(new Color(161, 80, 0), new Color(105, 80, 0)), YELLOW(new Color(161, 161, 0), new Color(122, 109, 8)), + FOREST(new Color( 65, 102, 0), new Color( 37, 79, 0)), GREEN(new Color( 7, 132, 70), new Color( 7, 82, 30)), + TEAL(new Color( 0, 130, 130), new Color( 0, 90, 100)), CERULEAN(new Color( 0, 86, 130), new Color( 0, 28, 83)), + BLUE(new Color( 0, 33, 203), new Color( 0, 0, 137)), INDIGO(new Color( 68, 10, 127), new Color( 0, 0, 61)), + PURPLE(new Color(106, 0, 106), new Color( 63, 0, 56)), FUSCHIA(new Color(119, 0, 60), new Color( 60, 0, 60)); + + private final Color fillColor; + private final Color lineColor; + + private ColorStyle(Color fillColor, Color lineColor) { + this.fillColor = fillColor; + this.lineColor = lineColor; + } + + public Color getFillColor() { return fillColor; } + + public Color getLineColor() { return lineColor; } + }; + + /** + * Loads all plots in a file and formats them according to the + * indicated style. + * @param args - Unused default executable parameter. + * @throws IOException Occurs if there is an issue opening the file. + */ + public static void main(String[] args) throws IOException { + // Define the root directory for the plots. + String rootDir = "D:\\cygwin64\\home\\Kyle\\beam-plots\\base\\"; + //String rootDir = "D:\\cygwin64\\home\\Kyle\\aprime-plots\\base\\readout-plots\\"; + + // Define the new name of the file containing the trigger plots. + String[] plotFile = { + rootDir + "compiled-plots.aida" + //rootDir + "15-MeV\\compiled-plots.aida", + //rootDir + "20-MeV\\compiled-plots.aida", + //rootDir + "30-MeV\\compiled-plots.aida", + //rootDir + "40-MeV\\compiled-plots.aida", + //rootDir + "50-MeV\\compiled-plots.aida" + }; + + // Define the names of each plot. This will be used for the + // legend in the case of multiple plots. + String[] treeName = { + "Background", + "15 MeV A'", + "20 MeV A'", + "30 MeV A'", + "40 MeV A'", + "50 MeV A'" + }; + + // Define the color style for the plots. + ColorStyle[] dataColorStyle = { + ColorStyle.GREY, + ColorStyle.MS_GREEN, + ColorStyle.MS_BLUE, + ColorStyle.MS_ORANGE, + ColorStyle.MS_RED, + ColorStyle.TEAL, + ColorStyle.CRIMSON, + ColorStyle.FOREST + }; + + // Get the plots file and open it. + IAnalysisFactory af = IAnalysisFactory.create(); + ITree[] tree = new ITree[plotFile.length]; + for(int i = 0; i < plotFile.length; i++) { + tree[i] = af.createTreeFactory().create(plotFile[i]); + if(tree[i] == null) { throw new IllegalArgumentException("Unable to load plot file."); } + } + + // Get a list of all the histograms in the file. + List<List<String>> treeHistograms = new ArrayList<List<String>>(plotFile.length); + for(int i = 0; i < plotFile.length; i++) { + treeHistograms.add(getHistograms(tree[i], "/NoCuts/"));//, "/PassedAll/")); + } + + // Create a plotter factory. + IPlotterFactory plotterFactory = af.createPlotterFactory(); + + // Plot each histogram and format it. + for(String histogram : treeHistograms.get(0)) { + // Get the plot from the tree and verify that it is a 1D + // or 2D histogram. Other types are not supported. + IManagedObject histObject = tree[0].find(histogram); + if(!(histObject instanceof IHistogram1D) && !(histObject instanceof IHistogram2D)) { + continue; + } + + // Obtain the histogram object. + IBaseHistogram hist; + if(histObject instanceof IHistogram1D) { hist = (IHistogram1D) histObject; } + else { hist = (IHistogram2D) histObject; } + + // Define whether this is an overlay plot and whether + // this is a one or two dimensional plot. + boolean overlay = plotFile.length > 1; + boolean twoDimensional = hist instanceof IHistogram2D; + + // Generate the plotter and set its title. The plotter will + // use the title of the first tree's plot. + String plotTitle = hist.title(); + IPlotter plotter = plotterFactory.create(plotTitle); + + // For single plots and one-dimensional overlay plots, + // there should only be a single plotter region. + if(!twoDimensional || !overlay) { plotter.createRegions(1); } + + // For two-dimensional overlay plots, create a region for + // each plot individually. + else { plotter.createRegions(2, (int) Math.ceil(plotFile.length / 2.0)); } + + // Find the histogram in each of the trees and plot them + // all on the same region. + for(int i = 0; i < plotFile.length; i++) { + // Get the histogram from the tree. + IManagedObject treeObject = tree[i].find(histogram); + IBaseHistogram treeHist; + if(treeObject instanceof IHistogram1D) { treeHist = (IHistogram1D) treeObject; } + else { treeHist = (IHistogram2D) treeObject; } + + // Display the plot. + if(treeHist != null) { + // Set the title of plot to the name associated with + // its tree. This ensures that the correct name will + // appear on the legend. + if(plotFile.length > 1) { + treeHist.setTitle(treeName[i]); + } + + // Plot the tree's data in the plotter region. + if(!twoDimensional || !overlay) { plotter.region(0).plot(treeHist); } + else { + plotter.region(i).plot(treeHist); + setDefault2DStyle(((PlotterRegion) plotter.region(i)), dataColorStyle); + } + } + } + + // Format the plot region. + if(!twoDimensional) { setDefault1DStyle(((PlotterRegion) plotter.region(0)), dataColorStyle); } + else { setDefault2DStyle(((PlotterRegion) plotter.region(0)), dataColorStyle); } + + // Show the plotter. + plotter.region(0).setTitle(plotTitle); + plotter.setParameter("plotterWidth", "750"); + plotter.setParameter("plotterHeight", "600"); + //plotter.setParameter("plotterWidth", "2000"); + //plotter.setParameter("plotterHeight", "1200"); + plotter.show(); + } + + // Close the trees. + for(int i = 0; i < plotFile.length; i++) { + tree[i].close(); + } + } + + /** + * Sets the plot display formatting for 1D plots. + * @param region - The plotter region to format. + * @param color - The data color settings to use. + */ + private static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) { + // Get the names of each plot on in the region. + String[] dataNames = region.getAllDataNames(); + + // Check whether this is an overlay plot. Overlay plots contain + // more than one data name. + boolean overlay = (dataNames.length > 1 ? true : false); + + // Iterate over each plot in the region. + for(int i = 0; i < dataNames.length; i++) { + // Set the overlay style if needed. + if(overlay) { + // Get the fill style for the current data type. + JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); + + // Set the histogram style to display thick-lined bars + // with no fill. The color is set by the "color" argument. + fillStyle.setHistogramFill(false); + fillStyle.setHistogramBarLineWidth(3); + fillStyle.setHistogramBarLineColor(color[i].getFillColor()); + + // Set the legend text style. + region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20)); + } + + // Otherwise, set the fill style for a single plot. + else { + // Get the fill style for the current data type. + JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); + + // Set the histogram style to display thick-lined bars + // with a fill color. The colors are defined by the + // "color" argument. + fillStyle.setHistogramBarLineWidth(3); + fillStyle.setHistogramBarColor(color[i].getFillColor()); + fillStyle.setHistogramBarLineColor(color[i].getLineColor()); + } + + // Set the statistics box style. + region.getPlot().getStats().setVisible(true); + region.getPlot().getStats().setFont(BASIC_FONT); + + // Set the title font. + region.getPlot().getTitleObject().setFont(TITLE_FONT); + + // Set generic axis titles. + region.getPlot().getXAxis().setLabel("Data Label (Unit)"); + region.getPlot().getYAxis().setLabel("Count"); + + // Set the axis tick-mark fonts. + region.getPlot().getXAxis().setFont(BASIC_FONT); + region.getPlot().getYAxis().setFont(BASIC_FONT); + region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); + region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); + } + } + + /** + * Sets the plot display formatting for 1D plots. + * @param region - The plotter region to format. + * @param color - The data color settings to use. + */ + private static final void setDefault2DStyle(PlotterRegion region, ColorStyle[] color) { + // Get the fill style object. 2D plots should never be overlay + // plots, so there should only ever be one data name. + JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); + + // Set the fill style for a two-dimensional plot. + fillStyle.setLogZ(true); + fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP); + fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW); + + // Make the statistics box invisible. + region.getPlot().getStats().setVisible(false); + + // Set the general plot font (which is also the z-axis font). + region.getPlot().setFont(BASIC_FONT); + + // Set the title font. + region.getPlot().getTitleObject().setFont(TITLE_FONT); + + // Set generic axis titles. + region.getPlot().getXAxis().setLabel("Data Label (Unit)"); + region.getPlot().getYAxis().setLabel("Data Label (Unit)"); + + // Set the axis tick-mark fonts. + region.getPlot().getXAxis().setFont(BASIC_FONT); + region.getPlot().getYAxis().setFont(BASIC_FONT); + region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); + region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); + } + + /** + * Gets a list of all objects that are not directories in a tree. + * @param tree - The tree from which to extract the object names. + * @return Returns the object names as <code>String</code> objects + * in a <code>List</code> collection. + */ + private static final List<String> getHistograms(ITree tree) { + return getHistograms(tree, "/"); + } + + /** + * Gets a list of all objects that are not directories in a tree. + * @param tree - The tree from which to extract the object names. + * @return Returns the object names as <code>String</code> objects + * in a <code>List</code> collection. + */ + private static final List<String> getHistograms(ITree tree, String rootDir) { + return getHistograms(tree, rootDir, new ArrayList<String>()); + } + + /** + * Recursive method that gets all object names from a tree that + * are not directories. Method should not be called directly, but + * rather called only through the <code>getHistograms(ITree)</code> + * method. + * @param tree - The tree from which to obtain the object names. + * @param directory - The directory in which to search for objects. + * @param list - The list in which to place the objects. + * @return Returns the <code>List</code> collection that was given + * as an argument. + */ + private static final List<String> getHistograms(ITree tree, String directory, List<String> list) { + // Get the list of objects in the directory. + String[] treeObjects = tree.listObjectNames(directory); + + // Print the objects. + for(String objectName : treeObjects) { + // Check if the object is a directory. + boolean isDirectory = isDirectory(objectName); + + // If the object is a directory, get the histograms from it. + if(isDirectory) { + getHistograms(tree, objectName, list); + } + + // If the object is a plot, add it to the list. + else { list.add(objectName); } + } + + // Return the list. + return list; + } + + /** + * Checks whether a tree object is a directory. + * @param object - The object to check. + * @return Returns <code>true</code> if the object is a directory + * and <code>false</code> otherwise. + */ + private static final boolean isDirectory(String object) { + return (object.toCharArray()[object.length() - 1] == '/'); + } } Modified: java/trunk/users/src/main/java/org/hps/users/luca/FADCVariableTriggerFEEDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/luca/FADCVariableTriggerFEEDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/luca/FADCVariableTriggerFEEDriver.java Wed Mar 9 11:43:24 2016 @@ -25,64 +25,64 @@ // ================================================================== // ==== Trigger Cut Default Parameters ============================== // ================================================================== - private int minHitCount = 1; // Minimum required cluster hit count threshold. (Hits) - private double seedEnergyHigh = Double.MAX_VALUE; // Maximum allowed cluster seed energy. (GeV) - private double seedEnergyLow = Double.MIN_VALUE; // Minimum required cluster seed energy. (GeV) - private double clusterEnergyHigh = 1.5 * EcalUtils.GeV; // Maximum allowed cluster total energy. (GeV) - private double clusterEnergyLow = .1 * EcalUtils.GeV; // Minimum required cluster total energy. (GeV) - private double energySumHigh = 1.9 * EcalUtils.GeV; // Maximum allowed pair energy sum. (GeV) - private double energySumLow = 0.0 * EcalUtils.GeV; // Minimum required pair energy sum. (GeV) - private double energyDifferenceHigh = 2.2 * EcalUtils.GeV; // Maximum allowed pair energy difference. (GeV) - private double energySlopeLow = 1.1; // Minimum required pair energy slope value. - private double coplanarityHigh = 35; // Maximum allowed pair coplanarity deviation. (Degrees) + private int minHitCount = 1; // Minimum required cluster hit count threshold. (Hits) + private double seedEnergyHigh = Double.MAX_VALUE; // Maximum allowed cluster seed energy. (GeV) + private double seedEnergyLow = Double.MIN_VALUE; // Minimum required cluster seed energy. (GeV) + private double clusterEnergyHigh = 1.5 * EcalUtils.GeV; // Maximum allowed cluster total energy. (GeV) + private double clusterEnergyLow = .1 * EcalUtils.GeV; // Minimum required cluster total energy. (GeV) + private double energySumHigh = 1.9 * EcalUtils.GeV; // Maximum allowed pair energy sum. (GeV) + private double energySumLow = 0.0 * EcalUtils.GeV; // Minimum required pair energy sum. (GeV) + private double energyDifferenceHigh = 2.2 * EcalUtils.GeV; // Maximum allowed pair energy difference. (GeV) + private double energySlopeLow = 1.1; // Minimum required pair energy slope value. + private double coplanarityHigh = 35; // Maximum allowed pair coplanarity deviation. (Degrees) // ================================================================== // ==== Trigger General Default Parameters ========================== // ================================================================== - private String clusterCollectionName = "EcalClusters"; // Name for the LCIO cluster collection. - private int pairCoincidence = 2; // Maximum allowed time difference between clusters. (4 ns clock-cycles) - private double energySlopeParamF = 0.005500; // A parameter value used for the energy slope calculation. - private double originX = 1393.0 * Math.tan(0.03052); // ECal mid-plane, defined by photon beam position (30.52 mrad) at ECal face (z=1393 mm) - private int backgroundLevel = -1; // Automatically sets the cuts to achieve a predetermined background rate. + private String clusterCollectionName = "EcalClusters"; // Name for the LCIO cluster collection. + private int pairCoincidence = 2; // Maximum allowed time difference between clusters. (4 ns clock-cycles) + private double energySlopeParamF = 0.005500; // A parameter value used for the energy slope calculation. + private double originX = 1393.0 * Math.tan(0.03052); // ECal mid-plane, defined by photon beam position (30.52 mrad) at ECal face (z=1393 mm) + private int backgroundLevel = -1; // Automatically sets the cuts to achieve a predetermined background rate. // ================================================================== // ==== Driver Internal Variables =================================== // ================================================================== - private Queue<List<Cluster>> topClusterQueue = null; // Store clusters on the top half of the calorimeter. - private Queue<List<Cluster>> botClusterQueue = null; // Store clusters on the bottom half of the calorimeter. - private int allClusters = 0; // Track the number of clusters processed. - private int allPairs = 0; // Track the number of cluster pairs processed. - private int clusterTotalEnergyCount = 0; // Track the clusters which pass the total energy cut. - private int clusterSeedEnergyCount = 0; // Track the clusters which pass the seed energy cut. - private int clusterHitCountCount = 0; // Track the clusters which pass the hit count cut. - private int pairEnergySumCount = 0; // Track the pairs which pass the energy sum cut. - private int pairEnergyDifferenceCount = 0; // Track the pairs which pass the energy difference cut. - private int pairEnergySlopeCount = 0; // Track the pairs which pass the energy slope cut. - private int pairCoplanarityCount = 0; // Track the pairs which pass the coplanarity cut. + private Queue<List<Cluster>> topClusterQueue = null; // Store clusters on the top half of the calorimeter. + private Queue<List<Cluster>> botClusterQueue = null; // Store clusters on the bottom half of the calorimeter. + private int allClusters = 0; // Track the number of clusters processed. + private int allPairs = 0; // Track the number of cluster pairs processed. + private int clusterTotalEnergyCount = 0; // Track the clusters which pass the total energy cut. + private int clusterSeedEnergyCount = 0; // Track the clusters which pass the seed energy cut. + private int clusterHitCountCount = 0; // Track the clusters which pass the hit count cut. + private int pairEnergySumCount = 0; // Track the pairs which pass the energy sum cut. + private int pairEnergyDifferenceCount = 0; // Track the pairs which pass the energy difference cut. + private int pairEnergySlopeCount = 0; // Track the pairs which pass the energy slope cut. + private int pairCoplanarityCount = 0; // Track the pairs which pass the coplanarity cut. /** * Prints out the results of the trigger at the end of the run. */ @Override public void endOfData() { - // Print out the results of the trigger cuts. - System.out.printf("Trigger Processing Results%n"); - System.out.printf("\tSingle-Cluster Cuts%n"); - System.out.printf("\t\tTotal Clusters Processed :: %d%n", allClusters); - System.out.printf("\t\tPassed Seed Energy Cut :: %d%n", clusterSeedEnergyCount); - System.out.printf("\t\tPassed Hit Count Cut :: %d%n", clusterHitCountCount); - System.out.printf("\t\tPassed Total Energy Cut :: %d%n", clusterTotalEnergyCount); - System.out.printf("%n"); - System.out.printf("\tCluster Pair Cuts%n"); - System.out.printf("\t\tTotal Pairs Processed :: %d%n", allPairs); - System.out.printf("\t\tPassed Energy Sum Cut :: %d%n", pairEnergySumCount); - System.out.printf("\t\tPassed Energy Difference Cut :: %d%n", pairEnergyDifferenceCount); - System.out.printf("\t\tPassed Energy Slope Cut :: %d%n", pairEnergySlopeCount); - System.out.printf("\t\tPassed Coplanarity Cut :: %d%n", pairCoplanarityCount); - System.out.printf("%n"); - System.out.printf("\tTrigger Count :: %d%n", numTriggers); - - // Run the superclass method. + // Print out the results of the trigger cuts. + System.out.printf("Trigger Processing Results%n"); + System.out.printf("\tSingle-Cluster Cuts%n"); + System.out.printf("\t\tTotal Clusters Processed :: %d%n", allClusters); + System.out.printf("\t\tPassed Seed Energy Cut :: %d%n", clusterSeedEnergyCount); + System.out.printf("\t\tPassed Hit Count Cut :: %d%n", clusterHitCountCount); + System.out.printf("\t\tPassed Total Energy Cut :: %d%n", clusterTotalEnergyCount); + System.out.printf("%n"); + System.out.printf("\tCluster Pair Cuts%n"); + System.out.printf("\t\tTotal Pairs Processed :: %d%n", allPairs); + System.out.printf("\t\tPassed Energy Sum Cut :: %d%n", pairEnergySumCount); + System.out.printf("\t\tPassed Energy Difference Cut :: %d%n", pairEnergyDifferenceCount); + System.out.printf("\t\tPassed Energy Slope Cut :: %d%n", pairEnergySlopeCount); + System.out.printf("\t\tPassed Coplanarity Cut :: %d%n", pairCoplanarityCount); + System.out.printf("%n"); + System.out.printf("\tTrigger Count :: %d%n", numTriggers); + + // Run the superclass method. super.endOfData(); } @@ -92,53 +92,53 @@ */ @Override public void process(EventHeader event) { - // Process the list of clusters for the event, if it exists. + // Process the list of clusters for the event, if it exists. if (event.hasCollection(Cluster.class, clusterCollectionName)) { - // Get the collection of clusters. - List<Cluster> clusterList = event.get(Cluster.class, clusterCollectionName); - - // Create a list to hold clusters which pass the single - // cluster cuts. - List<Cluster> goodClusterList = new ArrayList<Cluster>(clusterList.size()); - - // Sort through the cluster list and add clusters that pass - // the single cluster cuts to the good list. - clusterLoop: - for(Cluster cluster : clusterList) { - // Increment the number of processed clusters. - allClusters++; - - // ==== Seed Hit Energy Cut ==================================== - // ============================================================= - // If the cluster fails the cut, skip to the next cluster. - if(!clusterSeedEnergyCut(cluster)) { continue clusterLoop; } - - // Otherwise, note that it passed the cut. - clusterSeedEnergyCount++; - - // ==== Cluster Hit Count Cut ================================== - // ============================================================= - // If the cluster fails the cut, skip to the next cluster. - if(!clusterHitCountCut(cluster)) { continue clusterLoop; } - - // Otherwise, note that it passed the cut. - clusterHitCountCount++; - - // ==== Cluster Total Energy Cut =============================== - // ============================================================= - // If the cluster fails the cut, skip to the next cluster. - if(!clusterTotalEnergyCut(cluster)) { continue clusterLoop; } - - // Otherwise, note that it passed the cut. - clusterTotalEnergyCount++; - - // A cluster that passes all of the single-cluster cuts - // can be used in cluster pairs. - goodClusterList.add(cluster); - } - - // Put the good clusters into the cluster queue. - updateClusterQueues(goodClusterList); + // Get the collection of clusters. + List<Cluster> clusterList = event.get(Cluster.class, clusterCollectionName); + + // Create a list to hold clusters which pass the single + // cluster cuts. + List<Cluster> goodClusterList = new ArrayList<Cluster>(clusterList.size()); + + // Sort through the cluster list and add clusters that pass + // the single cluster cuts to the good list. + clusterLoop: + for(Cluster cluster : clusterList) { + // Increment the number of processed clusters. + allClusters++; + + // ==== Seed Hit Energy Cut ==================================== + // ============================================================= + // If the cluster fails the cut, skip to the next cluster. + if(!clusterSeedEnergyCut(cluster)) { continue clusterLoop; } + + // Otherwise, note that it passed the cut. + clusterSeedEnergyCount++; + + // ==== Cluster Hit Count Cut ================================== + // ============================================================= + // If the cluster fails the cut, skip to the next cluster. + if(!clusterHitCountCut(cluster)) { continue clusterLoop; } + + // Otherwise, note that it passed the cut. + clusterHitCountCount++; + + // ==== Cluster Total Energy Cut =============================== + // ============================================================= + // If the cluster fails the cut, skip to the next cluster. + if(!clusterTotalEnergyCut(cluster)) { continue clusterLoop; } + + // Otherwise, note that it passed the cut. + clusterTotalEnergyCount++; + + // A cluster that passes all of the single-cluster cuts + // can be used in cluster pairs. + goodClusterList.add(cluster); + } + + // Put the good clusters into the cluster queue. + updateClusterQueues(goodClusterList); } // Perform the superclass event processing. @@ -152,7 +152,7 @@ * be set. Actual background rates equal about (5 * backgroundLevel) kHz. */ public void setBackgroundLevel(int backgroundLevel) { - this.backgroundLevel = backgroundLevel; + this.backgroundLevel = backgroundLevel; } /** @@ -215,7 +215,7 @@ * @param energySlopeLow - The parameter value. */ public void setEnergySlopeLow(double energySlopeLow) { - this.energySlopeLow = energySlopeLow; + this.energySlopeLow = energySlopeLow; } /** @@ -299,12 +299,12 @@ */ @Override public void startOfData() { - // Make sure that a valid cluster collection name has been - // defined. If it has not, throw an exception. + // Make sure that a valid cluster collection name has been + // defined. If it has not, throw an exception. if (clusterCollectionName == null) { throw new RuntimeException("The parameter clusterCollectionName was not set!"); } - + // Initialize the top and bottom cluster queues. topClusterQueue = new LinkedList<List<Cluster>>(); botClusterQueue = new LinkedList<List<Cluster>>(); @@ -345,9 +345,9 @@ for (Cluster botCluster : botClusterQueue.element()) { for (List<Cluster> topClusters : topClusterQueue) { for (Cluster topCluster : topClusters) { - // The first cluster in a pair should always be - // the higher energy cluster. If the top cluster - // is higher energy, it goes first. + // The first cluster in a pair should always be + // the higher energy cluster. If the top cluster + // is higher energy, it goes first. if (topCluster.getEnergy() > botCluster.getEnergy()) { Cluster[] clusterPair = {topCluster, botCluster}; clusterPairs.add(clusterPair); @@ -366,24 +366,24 @@ return clusterPairs; } - /** - * Determines if the event produces a trigger. - * - * @return Returns <code>true</code> if the event produces a trigger - * and <code>false</code> if it does not. - */ - @Override - protected boolean triggerDecision(EventHeader event) { - // If there is a list of clusters present for this event, - // check whether it passes the trigger conditions. - if (event.hasCollection(Cluster.class, clusterCollectionName)) { - return testTrigger(); + /** + * Determines if the event produces a trigger. + * + * @return Returns <code>true</code> if the event produces a trigger + * and <code>false</code> if it does not. + */ + @Override + protected boolean triggerDecision(EventHeader event) { + // If there is a list of clusters present for this event, + // check whether it passes the trigger conditions. + if (event.hasCollection(Cluster.class, clusterCollectionName)) { + return testTrigger(); } // Otherwise, this event can not produce a trigger and should // return false automatically. else { return false; } - } + } /** * Checks whether the argument cluster possesses the minimum @@ -394,7 +394,7 @@ * and <code>false</code> if the cluster does not. */ private boolean clusterHitCountCut(Cluster cluster) { - return (getValueClusterHitCount(cluster) >= minHitCount); + return (getValueClusterHitCount(cluster) >= minHitCount); } /** @@ -406,12 +406,12 @@ * and <code>false</code> if the cluster does not. */ private boolean clusterSeedEnergyCut(Cluster cluster) { - // Get the cluster seed energy. - double energy = getValueClusterSeedEnergy(cluster); - - // Check that it is above the minimum threshold and below the - // maximum threshold. - return (energy < seedEnergyHigh) && (energy > seedEnergyLow); + // Get the cluster seed energy. + double energy = getValueClusterSeedEnergy(cluster); + + // Check that it is above the minimum threshold and below the + // maximum threshold. + return (energy < seedEnergyHigh) && (energy > seedEnergyLow); } /** @@ -423,12 +423,12 @@ * and <code>false</code> if the cluster does not. */ private boolean clusterTotalEnergyCut(Cluster cluster) { - // Get the total cluster energy. - double energy = getValueClusterTotalEnergy(cluster); - - // Check that it is above the minimum threshold and below the - // maximum threshold. - return (energy < clusterEnergyHigh) && (energy > clusterEnergyLow); + // Get the total cluster energy. + double energy = getValueClusterTotalEnergy(cluster); + + // Check that it is above the minimum threshold and below the + // maximum threshold. + return (energy < clusterEnergyHigh) && (energy > clusterEnergyLow); } /** @@ -450,7 +450,7 @@ * @return Returns the cut value. */ private double getValueClusterTotalEnergy(Cluster cluster) { - return cluster.getEnergy(); + return cluster.getEnergy(); } /** @@ -461,7 +461,7 @@ * @return Returns the cut value. */ private int getValueClusterHitCount(Cluster cluster) { - return cluster.getCalorimeterHits().size(); + return cluster.getCalorimeterHits().size(); } /** @@ -472,7 +472,7 @@ * @return Returns the cut value. */ private double getValueClusterSeedEnergy(Cluster cluster) { - return cluster.getCalorimeterHits().get(0).getCorrectedEnergy(); + return cluster.getCalorimeterHits().get(0).getCorrectedEnergy(); } /** @@ -483,16 +483,16 @@ * @return Returns the cut value. */ private double getValueCoplanarity(Cluster[] clusterPair) { - // Get the cluster angles. - double[] clusterAngle = new double[2]; - for(int i = 0; i < 2; i++) { + // Get the cluster angles. + double[] clusterAngle = new double[2]; + for(int i = 0; i < 2; i++) { double position[] = clusterPair[i].getCalorimeterHits().get(0).getPosition(); //clusterAngle[i] = Math.toDegrees(Math.atan2(position[1], position[0] - originX)); //clusterAngle[i] = (clusterAngle[i] + 180.0) % 180.0; clusterAngle[i] = (Math.toDegrees(Math.atan2(position[1], position[0] - originX)) + 180.0) % 180.0; - } - - // Calculate the coplanarity cut value. + } + + // Calculate the coplanarity cut value. return Math.abs(clusterAngle[1] - clusterAngle[0]); } @@ -504,7 +504,7 @@ * @return Returns the cut value. */ private double getValueEnergyDifference(Cluster[] clusterPair) { - return clusterPair[0].getEnergy() - clusterPair[1].getEnergy(); + return clusterPair[0].getEnergy() - clusterPair[1].getEnergy(); } /** @@ -515,15 +515,15 @@ * @return Returns the cut value. */ private double getValueEnergySlope(Cluster[] clusterPair) { - // E + R*F - // Get the low energy cluster energy. - double slopeParamE = clusterPair[1].getEnergy(); - - // Get the low energy cluster radial distance. - double slopeParamR = getClusterDistance(clusterPair[1]); - - // Calculate the energy slope. - return slopeParamE + slopeParamR * energySlopeParamF; + // E + R*F + // Get the low energy cluster energy. + double slopeParamE = clusterPair[1].getEnergy(); + + // Get the low energy cluster radial distance. + double slopeParamR = getClusterDistance(clusterPair[1]); + + // Calculate the energy slope. + return slopeParamE + slopeParamR * energySlopeParamF; } /** @@ -534,7 +534,7 @@ * @return Returns the cut value. */ private double getValueEnergySum(Cluster[] clusterPair) { - return clusterPair[0].getEnergy() + clusterPair[1].getEnergy(); + return clusterPair[0].getEnergy() + clusterPair[1].getEnergy(); } /** @@ -570,7 +570,7 @@ * @return true if pair is found, false otherwise */ private boolean pairEnergySlopeCut(Cluster[] clusterPair) { - return (getValueEnergySlope(clusterPair) > energySlopeLow); + return (getValueEnergySlope(clusterPair) > energySlopeLow); } /** @@ -582,175 +582,175 @@ * the cut and <code>false</code> if it does not. */ private boolean pairEnergySumCut(Cluster[] clusterPair) { - // Get the energy sum value. - double energySum = getValueEnergySum(clusterPair); - - // Check that it is within the allowed range. + // Get the energy sum value. + double energySum = getValueEnergySum(clusterPair); + + // Check that it is within the allowed range. return (energySum < energySumHigh) && (energySum > energySumLow); } - + private void setBackgroundCuts(int backgroundLevel) { - // Make sure that the background level is valid. - if(backgroundLevel < 1 || backgroundLevel > 10) { - throw new RuntimeException(String.format("Trigger cuts are undefined for background level %d.", backgroundLevel)); - } - - // Otherwise, set the trigger cuts. Certain cuts are constant - // across all background levels. - clusterEnergyLow = 0.000; - seedEnergyLow = 0.100; - - // Set the variable values. - if(backgroundLevel == 1) { - clusterEnergyHigh = 1.700; - seedEnergyHigh = 1.300; - energySumLow = 0.400; - energySumHigh = 2.00; - energyDifferenceHigh = 1.500; - energySlopeLow = 1.0; - coplanarityHigh = 40; - minHitCount = 2; - } else if(backgroundLevel == 2) { - clusterEnergyHigh = 1.600; - seedEnergyHigh = 1.200; - energySumLow = 0.300; - energySumHigh = 2.00; - energyDifferenceHigh = 1.400; - energySlopeLow = 0.8; - coplanarityHigh = 40; - minHitCount = 2; - } else if(backgroundLevel == 3) { - clusterEnergyHigh = 1.600; - seedEnergyHigh = 1.200; - energySumLow = 0.200; - energySumHigh = 2.000; - energyDifferenceHigh = 1.400; - energySlopeLow = 0.7; - coplanarityHigh = 40; - minHitCount = 2; - } else if(backgroundLevel == 4) { - clusterEnergyHigh = 1.500; - seedEnergyHigh = 1.200; - energySumLow = 0.500; - energySumHigh = 1.950; - energyDifferenceHigh = 1.400; - energySlopeLow = 0.6; - coplanarityHigh = 40; - minHitCount = 2; - } else if(backgroundLevel == 5) { - clusterEnergyHigh = 1.500; - seedEnergyHigh = 1.200; - energySumLow = 0.400; - energySumHigh = 2.000; - energyDifferenceHigh = 1.400; - energySlopeLow = 0.6; - coplanarityHigh = 45; - minHitCount = 2; - } else if(backgroundLevel == 6) { - clusterEnergyHigh = 1.500; - seedEnergyHigh = 1.200; - energySumLow = 0.200; - energySumHigh = 1.950; - energyDifferenceHigh = 1.400; - energySlopeLow = 0.6; - coplanarityHigh = 55; - minHitCount = 2; - } else if(backgroundLevel == 7) { - clusterEnergyHigh = 1.700; - seedEnergyHigh = 1.200; - energySumLow = 0.200; - energySumHigh = 2.000; - energyDifferenceHigh = 1.500; - energySlopeLow = 0.6; - coplanarityHigh = 60; - minHitCount = 2; - } else if(backgroundLevel == 8) { - clusterEnergyHigh = 1.700; - seedEnergyHigh = 1.300; - energySumLow = 0.200; - energySumHigh = 2.000; - energyDifferenceHigh = 1.500; - energySlopeLow = 0.6; - coplanarityHigh = 65; - minHitCount = 2; - } else if(backgroundLevel == 9) { - clusterEnergyHigh = 1.500; - seedEnergyHigh = 1.200; - energySumLow = 0.400; - energySumHigh = 1.950; - energyDifferenceHigh = 1.400; - energySlopeLow = 0.5; - coplanarityHigh = 60; - minHitCount = 2; - } else if(backgroundLevel == 10) { - clusterEnergyHigh = 1.500; - seedEnergyHigh = 1.200; - energySumLow = 0.400; - energySumHigh = 2.000; - energyDifferenceHigh = 1.400; - energySlopeLow = 0.5; - coplanarityHigh = 65; - minHitCount = 2; - } - } - - /** - * Tests all of the current cluster pairs for triggers. - * - * @return Returns <code>true</code> if one of the cluster pairs - * passes all of the cluster cuts and <code>false</code> otherwise. - */ + // Make sure that the background level is valid. + if(backgroundLevel < 1 || backgroundLevel > 10) { + throw new RuntimeException(String.format("Trigger cuts are undefined for background level %d.", backgroundLevel)); + } + + // Otherwise, set the trigger cuts. Certain cuts are constant + // across all background levels. + clusterEnergyLow = 0.000; + seedEnergyLow = 0.100; + + // Set the variable values. + if(backgroundLevel == 1) { + clusterEnergyHigh = 1.700; + seedEnergyHigh = 1.300; + energySumLow = 0.400; + energySumHigh = 2.00; + energyDifferenceHigh = 1.500; + energySlopeLow = 1.0; + coplanarityHigh = 40; + minHitCount = 2; + } else if(backgroundLevel == 2) { + clusterEnergyHigh = 1.600; + seedEnergyHigh = 1.200; + energySumLow = 0.300; + energySumHigh = 2.00; + energyDifferenceHigh = 1.400; + energySlopeLow = 0.8; + coplanarityHigh = 40; + minHitCount = 2; + } else if(backgroundLevel == 3) { + clusterEnergyHigh = 1.600; + seedEnergyHigh = 1.200; + energySumLow = 0.200; + energySumHigh = 2.000; + energyDifferenceHigh = 1.400; + energySlopeLow = 0.7; + coplanarityHigh = 40; + minHitCount = 2; + } else if(backgroundLevel == 4) { + clusterEnergyHigh = 1.500; + seedEnergyHigh = 1.200; + energySumLow = 0.500; + energySumHigh = 1.950; + energyDifferenceHigh = 1.400; + energySlopeLow = 0.6; + coplanarityHigh = 40; + minHitCount = 2; + } else if(backgroundLevel == 5) { + clusterEnergyHigh = 1.500; + seedEnergyHigh = 1.200; + energySumLow = 0.400; + energySumHigh = 2.000; + energyDifferenceHigh = 1.400; + energySlopeLow = 0.6; + coplanarityHigh = 45; + minHitCount = 2; + } else if(backgroundLevel == 6) { + clusterEnergyHigh = 1.500; + seedEnergyHigh = 1.200; + energySumLow = 0.200; + energySumHigh = 1.950; + energyDifferenceHigh = 1.400; + energySlopeLow = 0.6; + coplanarityHigh = 55; + minHitCount = 2; + } else if(backgroundLevel == 7) { + clusterEnergyHigh = 1.700; + seedEnergyHigh = 1.200; + energySumLow = 0.200; + energySumHigh = 2.000; + energyDifferenceHigh = 1.500; + energySlopeLow = 0.6; + coplanarityHigh = 60; + minHitCount = 2; + } else if(backgroundLevel == 8) { + clusterEnergyHigh = 1.700; + seedEnergyHigh = 1.300; + energySumLow = 0.200; + energySumHigh = 2.000; + energyDifferenceHigh = 1.500; + energySlopeLow = 0.6; + coplanarityHigh = 65; + minHitCount = 2; + } else if(backgroundLevel == 9) { + clusterEnergyHigh = 1.500; + seedEnergyHigh = 1.200; + energySumLow = 0.400; + energySumHigh = 1.950; + energyDifferenceHigh = 1.400; + energySlopeLow = 0.5; + coplanarityHigh = 60; + minHitCount = 2; + } else if(backgroundLevel == 10) { + clusterEnergyHigh = 1.500; + seedEnergyHigh = 1.200; + energySumLow = 0.400; + energySumHigh = 2.000; + energyDifferenceHigh = 1.400; + energySlopeLow = 0.5; + coplanarityHigh = 65; + minHitCount = 2; + } + } + + /** + * Tests all of the current cluster pairs for triggers. + * + * @return Returns <code>true</code> if one of the cluster pairs + * passes all of the cluster cuts and <code>false</code> otherwise. + */ private boolean testTrigger() { - // Get the list of cluster pairs. - List<Cluster[]> clusterPairs = getClusterPairsTopBot(); + // Get the list of cluster pairs. + List<Cluster[]> clusterPairs = getClusterPairsTopBot(); // Iterate over the cluster pairs and perform each of the cluster // pair cuts on them. A cluster pair that passes all of the // cuts registers as a trigger. - pairLoop: + pairLoop: for (Cluster[] clusterPair : clusterPairs) { - // Increment the number of processed cluster pairs. - allPairs++; - - // ==== Pair Energy Sum Cut ==================================== - // ============================================================= - // If the cluster fails the cut, skip to the next pair. - if(!pairEnergySumCut(clusterPair)) { continue pairLoop; } - - // Otherwise, note that it passed the cut. - pairEnergySumCount++; - - // ==== Pair Energy Difference Cut ============================= - // ============================================================= - // If the cluster fails the cut, skip to the next pair. - if(!pairEnergyDifferenceCut(clusterPair)) { continue pairLoop; } - - // Otherwise, note that it passed the cut. - pairEnergyDifferenceCount++; - - // ==== Pair Energy Slope Cut ================================== - // ============================================================= - // If the cluster fails the cut, skip to the next pair. - //if(!energyDistanceCut(clusterPair)) { continue pairLoop; } - if(!pairEnergySlopeCut(clusterPair)) { continue pairLoop; } - - // Otherwise, note that it passed the cut. - pairEnergySlopeCount++; - - // ==== Pair Coplanarity Cut =================================== - // ============================================================= - // If the cluster fails the cut, skip to the next pair. - if(!pairCoplanarityCut(clusterPair)) { continue pairLoop; } - - // Otherwise, note that it passed the cut. - pairCoplanarityCount++; - - // Clusters that pass all of the pair cuts produce a trigger. - return true; + // Increment the number of processed cluster pairs. + allPairs++; + + // ==== Pair Energy Sum Cut ==================================== + // ============================================================= + // If the cluster fails the cut, skip to the next pair. + if(!pairEnergySumCut(clusterPair)) { continue pairLoop; } + + // Otherwise, note that it passed the cut. + pairEnergySumCount++; + + // ==== Pair Energy Difference Cut ============================= + // ============================================================= + // If the cluster fails the cut, skip to the next pair. + if(!pairEnergyDifferenceCut(clusterPair)) { continue pairLoop; } + + // Otherwise, note that it passed the cut. + pairEnergyDifferenceCount++; + + // ==== Pair Energy Slope Cut ================================== + // ============================================================= + // If the cluster fails the cut, skip to the next pair. + //if(!energyDistanceCut(clusterPair)) { continue pairLoop; } + if(!pairEnergySlopeCut(clusterPair)) { continue pairLoop; } + + // Otherwise, note that it passed the cut. + pairEnergySlopeCount++; + + // ==== Pair Coplanarity Cut =================================== + // ============================================================= + // If the cluster fails the cut, skip to the next pair. + if(!pairCoplanarityCut(clusterPair)) { continue pairLoop; } + + // Otherwise, note that it passed the cut. + pairCoplanarityCount++; + + // Clusters that pass all of the pair cuts produce a trigger. + return true; } // If the loop terminates without producing a trigger, there - // are no cluster pairs which meet the trigger conditions. + // are no cluster pairs which meet the trigger conditions. return false; } @@ -761,14 +761,14 @@ * @param clusterList - The clusters to add to the queues. */ private void updateClusterQueues(List<Cluster> clusterList) { - // Create lists to store the top and bottom clusters. + // Create lists to store the top and bottom clusters. ArrayList<Cluster> topClusterList = new ArrayList<Cluster>(); ArrayList<Cluster> botClusterList = new ArrayList<Cluster>(); // Loop over the clusters in the cluster list. for (Cluster cluster : clusterList) { - // If the cluster is on the top of the calorimeter, it - // goes into the top cluster list. + // If the cluster is on the top of the calorimeter, it + // goes into the top cluster list. if (cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy") > 0) { topClusterList.add(cluster); } Modified: java/trunk/users/src/main/java/org/hps/users/luca/FEETrigger.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/luca/FEETrigger.java (original) +++ java/trunk/users/src/main/java/org/hps/users/luca/FEETrigger.java Wed Mar 9 11:43:24 2016 @@ -15,209 +15,209 @@ * @author Luca Colaneri */ public class FEETrigger extends TriggerDriver { - // Store the LCIO cluster collection name. - private String clusterCollectionName = "EcalClusters"; - - // Store the cluster total energy trigger threshold. - private double energyThreshold = 1.5; - - // Track the number of over-threshold clusters in each region. - private int zone1Count = 0; - private int zone2Count = 0; - private int zone3Count = 0; - + // Store the LCIO cluster collection name. + private String clusterCollectionName = "EcalClusters"; + + // Store the cluster total energy trigger threshold. + private double energyThreshold = 1.5; + + // Track the number of over-threshold clusters in each region. + private int zone1Count = 0; + private int zone2Count = 0; + private int zone3Count = 0; + // The number of cluster over threshold that must occur in a region - // before a trigger occurs. - private int zone1Prescaling = 50; - private int zone2Prescaling = 10; - - /** - * Sets the energy threshold required for a cluster to be counted. - * - * @param energyThreshold - The energy threshold in GeV. - */ - public void setEnergyThreshold(int energyThreshold) { - this.energyThreshold = energyThreshold; - } - - /** - * Sets the number of events over threshold which must occur in the - * first region in order for a trigger to occur. - * - * @param zone1Prescaling - The number of over-threshold clusters needed - * for a trigger. - */ - public void setZone1Prescaling(int zone1Prescaling) { - this.zone1Prescaling = zone1Prescaling; - } - - /** - * Sets the number of events over threshold which must occur in the - * second region in order for a trigger to occur. - * - * @param zone2Prescaling - The number of over-threshold clusters needed - * for a trigger. - */ - public void setZone2Prescaling(int zone2Prescaling) { - this.zone2Prescaling = zone2Prescaling; - } - - /** - * Checks if any clusters exist over the set energy threshold and, - * if they do, increments the appropriate over-threshold count - * variable for the zone in which the cluster resides. - * - * @param event - The event from which clusters should be extracted. - */ - @Override - public void process(EventHeader event) { - if(event.hasCollection(Cluster.class, clusterCollectionName)) { - // Get the list of clusters from the event. - List<Cluster> clusterList = event.get(Cluster.class, clusterCollectionName); - - // Loop over the clusters and check for any that pass the threshold. - for(Cluster cluster : clusterList) { - // Check if the current cluster exceeds the energy - // threshold. If it does not, continue to the next - // cluster in the list. - if(cluster.getEnergy() > energyThreshold) { - // Get the x-index of the seed hit. - int ix = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"); - - // Determine in which region the cluster is located - // and increment the counter for that region. Zones - // are defined as: - // Zone 1 is -13 < ix < -4 and 14 < ix < 21 MISTAKE!!! it's all reversed!! remember!!! - // Zone 2 is -20 < ix < -14 and ix > 20 - // Zone 3 is -23 <= ix < -18 + // before a trigger occurs. + private int zone1Prescaling = 50; + private int zone2Prescaling = 10; + + /** + * Sets the energy threshold required for a cluster to be counted. + * + * @param energyThreshold - The energy threshold in GeV. + */ + public void setEnergyThreshold(int energyThreshold) { + this.energyThreshold = energyThreshold; + } + + /** + * Sets the number of events over threshold which must occur in the + * first region in order for a trigger to occur. + * + * @param zone1Prescaling - The number of over-threshold clusters needed + * for a trigger. + */ + public void setZone1Prescaling(int zone1Prescaling) { + this.zone1Prescaling = zone1Prescaling; + } + + /** + * Sets the number of events over threshold which must occur in the + * second region in order for a trigger to occur. + * + * @param zone2Prescaling - The number of over-threshold clusters needed + * for a trigger. + */ + public void setZone2Prescaling(int zone2Prescaling) { + this.zone2Prescaling = zone2Prescaling; + } + + /** + * Checks if any clusters exist over the set energy threshold and, + * if they do, increments the appropriate over-threshold count + * variable for the zone in which the cluster resides. + * + * @param event - The event from which clusters should be extracted. + */ + @Override + public void process(EventHeader event) { + if(event.hasCollection(Cluster.class, clusterCollectionName)) { + // Get the list of clusters from the event. + List<Cluster> clusterList = event.get(Cluster.class, clusterCollectionName); + + // Loop over the clusters and check for any that pass the threshold. + for(Cluster cluster : clusterList) { + // Check if the current cluster exceeds the energy + // threshold. If it does not, continue to the next + // cluster in the list. + if(cluster.getEnergy() > energyThreshold) { + // Get the x-index of the seed hit. + int ix = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"); + + // Determine in which region the cluster is located + // and increment the counter for that region. Zones + // are defined as: + // Zone 1 is -13 < ix < -4 and 14 < ix < 21 MISTAKE!!! it's all reversed!! remember!!! + // Zone 2 is -20 < ix < -14 and ix > 20 + // Zone 3 is -23 <= ix < -18 //V3 /* - if( ix > 18 || ix < -22) { zone3Count++; } - if(ix < 19 && ix > 12 ) { zone2Count++; } - if((ix > 4 && ix < 13) || (ix > -23 && ix < -14)) { zone1Count++; } + if( ix > 18 || ix < -22) { zone3Count++; } + if(ix < 19 && ix > 12 ) { zone2Count++; } + if((ix > 4 && ix < 13) || (ix > -23 && ix < -14)) { zone1Count++; } */ //V2 /* - if( ix > 18 ) { zone3Count++; } - if(ix < 19 && ix > 12 || ix <-20) { zone2Count++; } - if((ix > 4 && ix < 13) || (ix > -21 && ix < -14)) { zone1Count++; } + if( ix > 18 ) { zone3Count++; } + if(ix < 19 && ix > 12 || ix <-20) { zone2Count++; } + if((ix > 4 && ix < 13) || (ix > -21 && ix < -14)) { zone1Count++; } */ //v4/* /* if( ix > 19 || ix < -22) { zone3Count++; } - if(ix < 20 && ix > 12 || ix <-20 && ix > -23) { zone2Count++; } - if((ix > 4 && ix < 13) || (ix > -21 && ix < -14)) { zone1Count++; } + if(ix < 20 && ix > 12 || ix <-20 && ix > -23) { zone2Count++; } + if((ix > 4 && ix < 13) || (ix > -21 && ix < -14)) { zone1Count++; } */ //V prova /* - if( ix != 50 ) { zone2Count++; } - */ + if( ix != 50 ) { zone2Count++; } + */ //V6 /* if( ix > 19 || ix < -22) { zone3Count++; } - if(ix < 20 && ix > 8 || ix <-16 && ix > -23) { zone2Count++; } - if((ix > 4 && ix < 9) || (ix > -17 && ix < -14)) { zone1Count++; } + if(ix < 20 && ix > 8 || ix <-16 && ix > -23) { zone2Count++; } + if((ix > 4 && ix < 9) || (ix > -17 && ix < -14)) { zone1Count++; } */ //V7 /* if( ix > 19 || ix < -22) { zone3Count++; } - if(ix < 20 && ix > 15 ) { zone2Count++; } - if((ix > 5 && ix < 16) || (ix > -23 && ix < -14)) { zone1Count++; } + if(ix < 20 && ix > 15 ) { zone2Count++; } + if((ix > 5 && ix < 16) || (ix > -23 && ix < -14)) { zone1Count++; } */ //V8 /* if( ix > 19 || ix < -17) { zone3Count++; } //x1 - if(ix < 20 && ix > 9 ) { zone2Count++; }//x10 - if((ix > 5 && ix < 10) || (ix > -18 && ix < -14)) { zone1Count++; } //x50 + if(ix < 20 && ix > 9 ) { zone2Count++; }//x10 + if((ix > 5 && ix < 10) || (ix > -18 && ix < -14)) { zone1Count++; } //x50 }*/ //V9 /* if( ix > 19 || ix < -21) { zone3Count++; } //x1 - if(ix < 20 && ix > 9 || ix > -22 && ix <-17) { zone2Count++; }//x10 - if((ix > 5 && ix < 10) || (ix > -18 && ix < -14)) { zone1Count++; } //x50 + if(ix < 20 && ix > 9 || ix > -22 && ix <-17) { zone2Count++; }//x10 + if((ix > 5 && ix < 10) || (ix > -18 && ix < -14)) { zone1Count++; } //x50 */ //10 /* if( ix > 19 || ix < -22) { zone3Count++; } //x1 - if(ix < 20 && ix > 9 || ix > -22 && ix <-17) { zone2Count++; }//x10 - if((ix > 5 && ix < 10) || (ix > -18 && ix < -14)) { zone1Count++; } //x50 + if(ix < 20 && ix > 9 || ix > -22 && ix <-17) { zone2Count++; }//x10 + if((ix > 5 && ix < 10) || (ix > -18 && ix < -14)) { zone1Count++; } //x50 */ //V11 if( ix > 19 || ix < -22) { zone3Count++; } //x1 - if(ix < 20 && ix > 11 || ix > -22 && ix <-19) { zone2Count++; }//x10 - if((ix > 5 && ix < 12) || (ix > -20 && ix < -14)) { zone1Count++; } //x50 + if(ix < 20 && ix > 11 || ix > -22 && ix <-19) { zone2Count++; }//x10 + if((ix > 5 && ix < 12) || (ix > -20 && ix < -14)) { zone1Count++; } //x50 } - } - } - - // Run the superclass event processing. - super.process(event); - } - - /** - * Checks whether or not a trigger occurred. - * - * @param event - The event on which to base the trigger decision. - * @return Returns <code>true</code> if a trigger occurred and <code> - * false</code> if a trigger did not. - */ - @Override - protected boolean triggerDecision(EventHeader event) { - // Check if the event has clusters. An event with no clusters - // should never result in a trigger. - if(event.hasCollection(Cluster.class, clusterCollectionName)) { - // Check if any of the zone counts are high enough to trigger. - return triggerTest(); - } - - // Events without clusters can not trigger. - else { return false; } - } - - /** - * Checks if any of the regional counts are sufficiently high to - * register a trigger. - * - * @return Returns <code>true</code> if a region has enough clusters - * to trigger and <code>false</code> otherwise. - */ - private boolean triggerTest() { - // Track whether a trigger occurred. - boolean trigger = false; - - // If any clusters occur in zone 3, reset the count and note - // that a trigger occurred. - if(zone3Count > 0) { - zone3Count = 0; + } + } + + // Run the superclass event processing. + super.process(event); + } + + /** + * Checks whether or not a trigger occurred. + * + * @param event - The event on which to base the trigger decision. + * @return Returns <code>true</code> if a trigger occurred and <code> + * false</code> if a trigger did not. + */ + @Override + protected boolean triggerDecision(EventHeader event) { + // Check if the event has clusters. An event with no clusters + // should never result in a trigger. + if(event.hasCollection(Cluster.class, clusterCollectionName)) { + // Check if any of the zone counts are high enough to trigger. + return triggerTest(); + } + + // Events without clusters can not trigger. + else { return false; } + } + + /** + * Checks if any of the regional counts are sufficiently high to + * register a trigger. + * + * @return Returns <code>true</code> if a region has enough clusters + * to trigger and <code>false</code> otherwise. + */ + private boolean triggerTest() { + // Track whether a trigger occurred. + boolean trigger = false; + + // If any clusters occur in zone 3, reset the count and note + // that a trigger occurred. + if(zone3Count > 0) { + zone3Count = 0; if(zone2Count==zone2Prescaling){zone2Count=0;} if(zone1Count==zone1Prescaling){zone1Count=0;} - trigger = true; - } - - // If zone 2 has sufficient clusters (100 by default) to - // trigger, reset its count and note that a trigger occurred. - else if(zone2Count == zone2Prescaling) { - zone2Count = 0; + trigger = true; + } + + // If zone 2 has sufficient clusters (100 by default) to + // trigger, reset its count and note that a trigger occurred. + else if(zone2Count == zone2Prescaling) { + zone2Count = 0; if(zone3Count>0){zone3Count=0;} if(zone1Count==zone1Prescaling){zone1Count=0;} - trigger = true; - } - - // If zone 3 has sufficient clusters (1000 by default) to - // trigger, reset its count and note that a trigger occurred. - else if(zone1Count == zone1Prescaling) { - zone1Count = 0; + trigger = true; + } + + // If zone 3 has sufficient clusters (1000 by default) to + // trigger, reset its count and note that a trigger occurred. + else if(zone1Count == zone1Prescaling) { + zone1Count = 0; if(zone3Count>0){zone3Count=0;} if(zone2Count==zone2Prescaling){zone2Count=0;} - trigger = true; - } - - // Return whether or not a trigger occurred. - return trigger; - } + trigger = true; + } + + // Return whether or not a trigger occurred. + return trigger; + } } Modified: java/trunk/users/src/main/java/org/hps/users/luca/FEETrigger2.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/luca/FEETrigger2.java (original) +++ java/trunk/users/src/main/java/org/hps/users/luca/FEETrigger2.java Wed Mar 9 11:43:24 2016 @@ -15,159 +15,159 @@ * @author Luca Colaneri */ public class FEETrigger2 extends TriggerDriver { - // Store the LCIO cluster collection name. - private String clusterCollectionName = "EcalClusters"; - - // Store the cluster total energy trigger threshold. - private double energyThreshold = 1.5; - - // Track the number of over-threshold clusters in each region. - private int zone1Count = 0; - private int zone2Count = 0; - private int zone3Count = 0; + // Store the LCIO cluster collection name. + private String clusterCollectionName = "EcalClusters"; + + // Store the cluster total energy trigger threshold. + private double energyThreshold = 1.5; + + // Track the number of over-threshold clusters in each region. + private int zone1Count = 0; + private int zone2Count = 0; + private int zone3Count = 0; private int zone4Count = 0; - + // The number of cluster over threshold that must occur in a region - // before a trigger occurs. - private int zone1Prescaling = 1000; - private int zone2Prescaling = 70; - private int zone4Prescaling = 200; - /** - * Sets the energy threshold required for a cluster to be counted. - * - * @param energyThreshold - The energy threshold in GeV. - */ - public void setEnergyThreshold(int energyThreshold) { - this.energyThreshold = energyThreshold; - } - - /** - * Sets the number of events over threshold which must occur in the - * first region in order for a trigger to occur. - * - * @param zone1Prescaling - The number of over-threshold clusters needed - * for a trigger. - */ - public void setZone1Prescaling(int zone1Prescaling) { - this.zone1Prescaling = zone1Prescaling; - } - - /** - * Sets the number of events over threshold which must occur in the - * second region in order for a trigger to occur. - * - * @param zone2Prescaling - The number of over-threshold clusters needed - * for a trigger. - */ - public void setZone2Prescaling(int zone2Prescaling) { - this.zone2Prescaling = zone2Prescaling; - } - - /** - * Checks if any clusters exist over the set energy threshold and, - * if they do, increments the appropriate over-threshold count - * variable for the zone in which the cluster resides. - * - * @param event - The event from which clusters should be extracted. - */ - @Override - public void process(EventHeader event) { - if(event.hasCollection(Cluster.class, clusterCollectionName)) { - // Get the list of clusters from the event. - List<Cluster> clusterList = event.get(Cluster.class, clusterCollectionName); - - // Loop over the clusters and check for any that pass the threshold. - for(Cluster cluster : clusterList) { - // Check if the current cluster exceeds the energy - // threshold. If it does not, continue to the next - // cluster in the list. - if(cluster.getEnergy() > energyThreshold) { - // Get the x-index of the seed hit. - int ix = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"); - - // Determine in which region the cluster is located - // and increment the counter for that region. Zones - // are defined as: - // Zone 1 is -13 < ix < -4 and 14 < ix < 21 - // Zone 2 is -20 < ix < -14 and ix > 20 - // Zone 3 is -23 <= ix < -19 - if(-23 <= ix && ix < -19) { zone3Count++; } - if((-20 < ix && ix < -14)) { zone2Count++; } - if((-13 < ix && ix < -4) || (14 < ix && ix < 21)) { zone1Count++; } + // before a trigger occurs. + private int zone1Prescaling = 1000; + private int zone2Prescaling = 70; + private int zone4Prescaling = 200; + /** + * Sets the energy threshold required for a cluster to be counted. + * + * @param energyThreshold - The energy threshold in GeV. + */ + public void setEnergyThreshold(int energyThreshold) { + this.energyThreshold = energyThreshold; + } + + /** + * Sets the number of events over threshold which must occur in the + * first region in order for a trigger to occur. + * + * @param zone1Prescaling - The number of over-threshold clusters needed + * for a trigger. + */ + public void setZone1Prescaling(int zone1Prescaling) { + this.zone1Prescaling = zone1Prescaling; + } + + /** + * Sets the number of events over threshold which must occur in the + * second region in order for a trigger to occur. + * + * @param zone2Prescaling - The number of over-threshold clusters needed + * for a trigger. + */ + public void setZone2Prescaling(int zone2Prescaling) { + this.zone2Prescaling = zone2Prescaling; + } + + /** + * Checks if any clusters exist over the set energy threshold and, + * if they do, increments the appropriate over-threshold count + * variable for the zone in which the cluster resides. + * + * @param event - The event from which clusters should be extracted. + */ + @Override + public void process(EventHeader event) { + if(event.hasCollection(Cluster.class, clusterCollectionName)) { + // Get the list of clusters from the event. + List<Cluster> clusterList = event.get(Cluster.class, clusterCollectionName); + + // Loop over the clusters and check for any that pass the threshold. + for(Cluster cluster : clusterList) { + // Check if the current cluster exceeds the energy + // threshold. If it does not, continue to the next + // cluster in the list. + if(cluster.getEnergy() > energyThreshold) { + // Get the x-index of the seed hit. + int ix = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"); + + // Determine in which region the cluster is located + // and increment the counter for that region. Zones + // are defined as: + // Zone 1 is -13 < ix < -4 and 14 < ix < 21 + // Zone 2 is -20 < ix < -14 and ix > 20 + // Zone 3 is -23 <= ix < -19 + if(-23 <= ix && ix < -19) { zone3Count++; } + if((-20 < ix && ix < -14)) { zone2Count++; } + if((-13 < ix && ix < -4) || (14 < ix && ix < 21)) { zone1Count++; } if(ix>20){zone4Count++;} - } - } - } - - // Run the superclass event processing. - super.process(event); - } - - /** - * Checks whether or not a trigger occurred. - * - * @param event - The event on which to base the trigger decision. - * @return Returns <code>true</code> if a trigger occurred and <code> - * false</code> if a trigger did not. - */ - @Override - protected boolean triggerDecision(EventHeader event) { - // Check if the event has clusters. An event with no clusters - // should never result in a trigger. - if(event.hasCollection(Cluster.class, clusterCollectionName)) { - // Check if any of the zone counts are high enough to trigger. - return triggerTest(); - } - - // Events without clusters can not trigger. - else { return false; } - } - - /** - * Checks if any of the regional counts are sufficiently high to - * register a trigger. - * - * @return Returns <code>true</code> if a region has enough clusters - * to trigger and <code>false</code> otherwise. - */ - private boolean triggerTest() { - // Track whether a trigger occurred. - boolean trigger = false; - - // If any clusters occur in zone 3, reset the count and note - // that a trigger occurred. - if(zone3Count > 0) { - zone3Count = 0; + } + } + } + + // Run the superclass event processing. + super.process(event); + } + + /** + * Checks whether or not a trigger occurred. + * + * @param event - The event on which to base the trigger decision. + * @return Returns <code>true</code> if a trigger occurred and <code> + * false</code> if a trigger did not. + */ + @Override + protected boolean triggerDecision(EventHeader event) { + // Check if the event has clusters. An event with no clusters + // should never result in a trigger. + if(event.hasCollection(Cluster.class, clusterCollectionName)) { + // Check if any of the zone counts are high enough to trigger. + return triggerTest(); + } + + // Events without clusters can not trigger. + else { return false; } + } + + /** + * Checks if any of the regional counts are sufficiently high to + * register a trigger. + * + * @return Returns <code>true</code> if a region has enough clusters + * to trigger and <code>false</code> otherwise. + */ + private boolean triggerTest() { + // Track whether a trigger occurred. + boolean trigger = false; + + // If any clusters occur in zone 3, reset the count and note + // that a trigger occurred. + if(zone3Count > 0) { + zone3Count = 0; if(zone2Count==zone2Prescaling){zone2Count=0;} if(zone1Count==zone1Prescaling){zone1Count=0;} - trigger = true; - } - - // If zone 2 has sufficient clusters (100 by default) to - // trigger, reset its count and note that a trigger occurred. - else if(zone2Count == zone2Prescaling) { - zone2Count = 0; + trigger = true; + } + + // If zone 2 has sufficient clusters (100 by default) to + // trigger, reset its count and note that a trigger occurred. + else if(zone2Count == zone2Prescaling) { + zone2Count = 0; if(zone3Count>0){zone3Count=0;} if(zone1Count==zone1Prescaling){zone1Count=0;} - trigger = true; - } - - // If zone 3 has sufficient clusters (1000 by default) to - // trigger, reset its count and note that a trigger occurred. - else if(zone1Count == zone1Prescaling) { - zone1Count = 0; + trigger = true; + } + + // If zone 3 has sufficient clusters (1000 by default) to + // trigger, reset its count and note that a trigger occurred. + else if(zone1Count == zone1Prescaling) { + zone1Count = 0; if(zone3Count>0){zone3Count=0;} if(zone2Count==zone2Prescaling){zone2Count=0;} - trigger = true; - } - else if(zone4Count == zone4Prescaling) { - zone4Count = 0; + trigger = true; + } + else if(zone4Count == zone4Prescaling) { + zone4Count = 0; if(zone3Count>0){zone3Count=0;} if(zone2Count==zone2Prescaling){zone2Count=0;} if(zone1Count==zone1Prescaling){zone1Count=0;} - trigger = true; - } - // Return whether or not a trigger occurred. - return trigger; - } + trigger = true; + } + // Return whether or not a trigger occurred. + return trigger; + } } Modified: java/trunk/users/src/main/java/org/hps/users/luca/LCIOReadScript.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/luca/LCIOReadScript.java (original) +++ java/trunk/users/src/main/java/org/hps/users/luca/LCIOReadScript.java Wed Mar 9 11:43:24 2016 @@ -10,91 +10,91 @@ import org.lcsim.lcio.LCIOWriter; public class LCIOReadScript { - public static void main(String[] args) { - // Make sure there arguments are valid. - if(args.length != 2) { - System.err.println("Error: Arguments must be [Input_File] [Output_File]"); - System.exit(1); - } - - // Set the input/output files. - File inputFile = new File(args[0]); - File outputFile = new File(args[1]); - - // Make sure that the input file exists. - if(!inputFile.canRead()) { - System.err.println("Error: Input file can not be found."); - System.exit(1); - } - - // Create an LCIO reader to read it in. - LCIOReader reader = null; - try { reader = new LCIOReader(inputFile); } - catch(IOException e) { - e.printStackTrace(); - System.exit(1); - } - - // Create an LCIO writer to output the new file. - LCIOWriter writer = null; - try { writer = new LCIOWriter(outputFile); } - catch(IOException e) { - e.printStackTrace(); - System.exit(1); - } - - // Keep looping through events until there are no more. - while(true) { - // Try to get an event. - EventHeader event = null; - try { event = reader.read(); } - catch(IOException e) { } - - // If the event is still null, there either was no event - // or an error occurred. - if(event == null) { break; } - - // Get the event number to print a status update. - int num = event.getEventNumber(); - if(num % 10000 == 0) { System.out.println("Parsing event " + num + "."); } - - // See if the MCParticle collection exists. - if(event.hasCollection(MCParticle.class, "MCParticle")) { - // Get the MCParticle collection from the event. - ArrayList<MCParticle> particleList = (ArrayList<MCParticle>) event.get(MCParticle.class, "MCParticle"); - - // Remove the MCParticle collection from the event. - event.remove("MCParticle"); - - // Make a new list for good particles which pass some test. - ArrayList<MCParticle> goodParticles = new ArrayList<MCParticle>(); - - // Sort through the list of MCParticle objects in the - // full list and add good ones to the good list. - for(MCParticle p : particleList) { - if(p.getEnergy() >= 2.1) { goodParticles.add(p); } - } - - // Write the good particles back to the event. - event.put("MCParticle", goodParticles); - } - - // Write the event back out to the new file. - try { writer.write(event); } - catch(IOException e) { - e.printStackTrace(); - System.exit(1); - } - } - - // Close the reader and writer. - try { - reader.close(); - writer.close(); - } - catch(IOException e) { - e.printStackTrace(); - System.exit(1); - } - } + public static void main(String[] args) { + // Make sure there arguments are valid. + if(args.length != 2) { + System.err.println("Error: Arguments must be [Input_File] [Output_File]"); + System.exit(1); + } + + // Set the input/output files. + File inputFile = new File(args[0]); + File outputFile = new File(args[1]); + + // Make sure that the input file exists. + if(!inputFile.canRead()) { + System.err.println("Error: Input file can not be found."); + System.exit(1); + } + + // Create an LCIO reader to read it in. + LCIOReader reader = null; + try { reader = new LCIOReader(inputFile); } + catch(IOException e) { + e.printStackTrace(); + System.exit(1); + } + + // Create an LCIO writer to output the new file. + LCIOWriter writer = null; + try { writer = new LCIOWriter(outputFile); } + catch(IOException e) { + e.printStackTrace(); + System.exit(1); + } + + // Keep looping through events until there are no more. + while(true) { + // Try to get an event. + EventHeader event = null; + try { event = reader.read(); } + catch(IOException e) { } + + // If the event is still null, there either was no event + // or an error occurred. + if(event == null) { break; } + + // Get the event number to print a status update. + int num = event.getEventNumber(); + if(num % 10000 == 0) { System.out.println("Parsing event " + num + "."); } + + // See if the MCParticle collection exists. + if(event.hasCollection(MCParticle.class, "MCParticle")) { + // Get the MCParticle collection from the event. + ArrayList<MCParticle> particleList = (ArrayList<MCParticle>) event.get(MCParticle.class, "MCParticle"); + + // Remove the MCParticle collection from the event. + event.remove("MCParticle"); + + // Make a new list for good particles which pass some test. + ArrayList<MCParticle> goodParticles = new ArrayList<MCParticle>(); + + // Sort through the list of MCParticle objects in the + // full list and add good ones to the good list. + for(MCParticle p : particleList) { + if(p.getEnergy() >= 2.1) { goodParticles.add(p); } + } + + // Write the good particles back to the event. + event.put("MCParticle", goodParticles); + } + + // Write the event back out to the new file. + try { writer.write(event); } + catch(IOException e) { + e.printStackTrace(); + System.exit(1); + } + } + + // Close the reader and writer. + try { + reader.close(); + writer.close(); + } + catch(IOException e) { + e.printStackTrace(); + System.exit(1); + } + } } Modified: java/trunk/users/src/main/java/org/hps/users/luca/rate.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/luca/rate.java (original) +++ java/trunk/users/src/main/java/org/hps/users/luca/rate.java Wed Mar 9 11:43:24 2016 @@ -435,15 +435,15 @@ nevents++; - /* natha's code for trigger - List <AbstractIntData> aids = event.get(AbstractIntData.class, "TriggerBank"); - for (AbstractIntData aid : aids) { - if (aid.getTag() == TIData.BANK_TAG) { - TIData tt=(TIData)aid; - if (!tt.isSingle1Trigger()) return; + /* natha's code for trigger + List <AbstractIntData> aids = event.get(AbstractIntData.class, "TriggerBank"); + for (AbstractIntData aid : aids) { + if (aid.getTag() == TIData.BANK_TAG) { + TIData tt=(TIData)aid; + if (!tt.isSingle1Trigger()) return; break; - } - } + } + } */ //nathans code for trigger end Modified: java/trunk/users/src/main/java/org/hps/users/luca/ratesim.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/luca/ratesim.java (original) +++ java/trunk/users/src/main/java/org/hps/users/luca/ratesim.java Wed Mar 9 11:43:24 2016 @@ -238,15 +238,15 @@ nevents++; - /* natha's code for trigger - List <AbstractIntData> aids = event.get(AbstractIntData.class, "TriggerBank"); - for (AbstractIntData aid : aids) { - if (aid.getTag() == TIData.BANK_TAG) { - TIData tt=(TIData)aid; - if (!tt.isSingle1Trigger()) return; + /* natha's code for trigger + List <AbstractIntData> aids = event.get(AbstractIntData.class, "TriggerBank"); + for (AbstractIntData aid : aids) { + if (aid.getTag() == TIData.BANK_TAG) { + TIData tt=(TIData)aid; + if (!tt.isSingle1Trigger()) return; break; - } - } + } + } */ //nathans code for trigger end Modified: java/trunk/users/src/main/java/org/hps/users/meeg/HPSEcalAnalogPrintDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/meeg/HPSEcalAnalogPrintDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/meeg/HPSEcalAnalogPrintDriver.java Wed Mar 9 11:43:24 2016 @@ -22,67 +22,67 @@ */ public class HPSEcalAnalogPrintDriver extends Driver { - Subdetector ecal; - IDDecoder dec; - String ecalName; - String ecalReadoutName = "EcalHits"; - String ecalCollectionName = null; - String outputFileName; - PrintWriter outputStream = null; - int flags; + Subdetector ecal; + IDDecoder dec; + String ecalName; + String ecalReadoutName = "EcalHits"; + String ecalCollectionName = null; + String outputFileName; + PrintWriter outputStream = null; + int flags; - public HPSEcalAnalogPrintDriver() { - } + public HPSEcalAnalogPrintDriver() { + } - public void setEcalCollectionName(String ecalCollectionName) { - this.ecalCollectionName = ecalCollectionName; - } + public void setEcalCollectionName(String ecalCollectionName) { + this.ecalCollectionName = ecalCollectionName; + } - public void setEcalName(String ecalName) { - this.ecalName = ecalName; - } + public void setEcalName(String ecalName) { + this.ecalName = ecalName; + } - public void setOutputFileName(String outputFileName) { - this.outputFileName = outputFileName; - } + public void setOutputFileName(String outputFileName) { + this.outputFileName = outputFileName; + } - @Override - public void startOfData() { - if (ecalCollectionName == null) { - throw new RuntimeException("The parameter ecalCollectionName was not set!"); - } + @Override + public void startOfData() { + if (ecalCollectionName == null) { + throw new RuntimeException("The parameter ecalCollectionName was not set!"); + } - if (ecalName == null) { - throw new RuntimeException("The parameter ecalName was not set!"); - } + if (ecalName == null) { + throw new RuntimeException("The parameter ecalName was not set!"); + } - if (outputFileName != null) { - try { - outputStream = new PrintWriter(outputFileName); - } catch (IOException ex) { - throw new RuntimeException("Invalid outputFilePath!"); - } - } else { - outputStream = new PrintWriter(System.out, true); - } - } + if (outputFileName != null) { + try { + outputStream = new PrintWriter(outputFileName); + } catch (IOException ex) { + throw new RuntimeException("Invalid outputFilePath!"); + } + } else { + outputStream = new PrintWriter(System.out, true); + } + } - public void detectorChanged(Detector detector) { - // Get the Subdetector. - ecal = (Subdetector) detector.getSubdetector(ecalName); - dec = ecal.getIDDecoder(); - } + public void detectorChanged(Detector detector) { + // Get the Subdetector. + ecal = (Subdetector) detector.getSubdetector(ecalName); + dec = ecal.getIDDecoder(); + } - @Override - public void process(EventHeader event) { - // Get the list of ECal hits. - if (event.hasCollection(CalorimeterHit.class, ecalCollectionName)) { - //outputStream.println("Reading RawTrackerHits from event " + event.getEventNumber()); - List<CalorimeterHit> hits = event.get(CalorimeterHit.class, ecalCollectionName); - for (CalorimeterHit hit : hits) { - dec.setID(hit.getCellID()); - outputStream.printf("%d\t%d\t%f\t%f\n", dec.getValue("ix"), dec.getValue("iy"), hit.getTime(), hit.getRawEnergy()); - } - } - } + @Override + public void process(EventHeader event) { + // Get the list of ECal hits. + if (event.hasCollection(CalorimeterHit.class, ecalCollectionName)) { + //outputStream.println("Reading RawTrackerHits from event " + event.getEventNumber()); + List<CalorimeterHit> hits = event.get(CalorimeterHit.class, ecalCollectionName); + for (CalorimeterHit hit : hits) { + dec.setID(hit.getCellID()); + outputStream.printf("%d\t%d\t%f\t%f\n", dec.getValue("ix"), dec.getValue("iy"), hit.getTime(), hit.getRawEnergy()); + } + } + } } Modified: java/trunk/users/src/main/java/org/hps/users/meeg/HPSEcalDigitalPrintDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/meeg/HPSEcalDigitalPrintDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/meeg/HPSEcalDigitalPrintDriver.java Wed Mar 9 11:43:24 2016 @@ -22,70 +22,70 @@ */ public class HPSEcalDigitalPrintDriver extends Driver { - Subdetector ecal; - IDDecoder dec; - String ecalName = "Ecal"; - String ecalReadoutName = "EcalHits"; - String ecalCollectionName = "EcalRawHits"; - String outputFileName; - PrintWriter outputStream = null; - int timeScale = 1; - int flags; + Subdetector ecal; + IDDecoder dec; + String ecalName = "Ecal"; + String ecalReadoutName = "EcalHits"; + String ecalCollectionName = "EcalRawHits"; + String outputFileName; + PrintWriter outputStream = null; + int timeScale = 1; + int flags; - public HPSEcalDigitalPrintDriver() { - } + public HPSEcalDigitalPrintDriver() { + } - public void setTimeScale(int timeScale) { - this.timeScale = timeScale; - } + public void setTimeScale(int timeScale) { + this.timeScale = timeScale; + } - public void setEcalCollectionName(String ecalCollectionName) { - this.ecalCollectionName = ecalCollectionName; - } + public void setEcalCollectionName(String ecalCollectionName) { + this.ecalCollectionName = ecalCollectionName; + } - public void setEcalName(String ecalName) { - this.ecalName = ecalName; - } + public void setEcalName(String ecalName) { + this.ecalName = ecalName; + } - public void setOutputFileName(String outputFileName) { - this.outputFileName = outputFileName; - } + public void setOutputFileName(String outputFileName) { + this.outputFileName = outputFileName; + } - public void startOfData() { - if (ecalCollectionName == null) { - throw new RuntimeException("The parameter ecalCollectionName was not set!"); - } + public void startOfData() { + if (ecalCollectionName == null) { + throw new RuntimeException("The parameter ecalCollectionName was not set!"); + } - if (ecalName == null) { - throw new RuntimeException("The parameter ecalName was not set!"); - } + if (ecalName == null) { + throw new RuntimeException("The parameter ecalName was not set!"); + } - if (outputFileName != null) { - try { - outputStream = new PrintWriter(outputFileName); - } catch (IOException ex) { - throw new RuntimeException("Invalid outputFilePath!"); - } - } else { - outputStream = new PrintWriter(System.out, true); - } - } + if (outputFileName != null) { + try { + outputStream = new PrintWriter(outputFileName); + } catch (IOException ex) { + throw new RuntimeException("Invalid outputFilePath!"); + } + } else { + outputStream = new PrintWriter(System.out, true); + } + } - public void detectorChanged(Detector detector) { - // Get the Subdetector. - ecal = (Subdetector) detector.getSubdetector(ecalName); - dec = ecal.getIDDecoder(); - } + public void detectorChanged(Detector detector) { + // Get the Subdetector. + ecal = (Subdetector) detector.getSubdetector(ecalName); + dec = ecal.getIDDecoder(); + } - public void process(EventHeader event) { - // Get the list of ECal hits. - if (event.hasCollection(RawCalorimeterHit.class, ecalCollectionName)) { - List<RawCalorimeterHit> hits = event.get(RawCalorimeterHit.class, ecalCollectionName); - //outputStream.println("Reading RawCalorimeterHit from event " + event.getEventNumber()); - for (RawCalorimeterHit hit : hits) { - dec.setID(hit.getCellID()); - outputStream.printf("%d\t%d\t%d\t%d\n", dec.getValue("ix"), dec.getValue("iy"), hit.getTimeStamp() * timeScale, hit.getAmplitude()); - } - } - } + public void process(EventHeader event) { + // Get the list of ECal hits. + if (event.hasCollection(RawCalorimeterHit.class, ecalCollectionName)) { + List<RawCalorimeterHit> hits = event.get(RawCalorimeterHit.class, ecalCollectionName); + //outputStream.println("Reading RawCalorimeterHit from event " + event.getEventNumber()); + for (RawCalorimeterHit hit : hits) { + dec.setID(hit.getCellID()); + outputStream.printf("%d\t%d\t%d\t%d\n", dec.getValue("ix"), dec.getValue("iy"), hit.getTimeStamp() * timeScale, hit.getAmplitude()); + } + } + } } Modified: java/trunk/users/src/main/java/org/hps/users/meeg/HPSEcalRawTrackerHitPrintDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/meeg/HPSEcalRawTrackerHitPrintDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/meeg/HPSEcalRawTrackerHitPrintDriver.java Wed Mar 9 11:43:24 2016 @@ -22,68 +22,68 @@ */ public class HPSEcalRawTrackerHitPrintDriver extends Driver { - Subdetector ecal; - IDDecoder dec; - String ecalName = "Ecal"; - String ecalReadoutName = "EcalHits"; - String ecalCollectionName = "EcalRawHits"; - String outputFileName; - PrintWriter outputStream = null; - int flags; + Subdetector ecal; + IDDecoder dec; + String ecalName = "Ecal"; + String ecalReadoutName = "EcalHits"; + String ecalCollectionName = "EcalRawHits"; + String outputFileName; + PrintWriter outputStream = null; + int flags; - public HPSEcalRawTrackerHitPrintDriver() { - } + public HPSEcalRawTrackerHitPrintDriver() { + } - public void setEcalCollectionName(String ecalCollectionName) { - this.ecalCollectionName = ecalCollectionName; - } + public void setEcalCollectionName(String ecalCollectionName) { + this.ecalCollectionName = ecalCollectionName; + } - public void setEcalName(String ecalName) { - this.ecalName = ecalName; - } + public void setEcalName(String ecalName) { + this.ecalName = ecalName; + } - public void setOutputFileName(String outputFileName) { - this.outputFileName = outputFileName; - } + public void setOutputFileName(String outputFileName) { + this.outputFileName = outputFileName; + } - public void startOfData() { - if (ecalCollectionName == null) { - throw new RuntimeException("The parameter ecalCollectionName was not set!"); - } + public void startOfData() { + if (ecalCollectionName == null) { + throw new RuntimeException("The parameter ecalCollectionName was not set!"); + } - if (ecalName == null) { - throw new RuntimeException("The parameter ecalName was not set!"); - } + if (ecalName == null) { + throw new RuntimeException("The parameter ecalName was not set!"); + } - if (outputFileName != null) { - try { - outputStream = new PrintWriter(outputFileName); - } catch (IOException ex) { - throw new RuntimeException("Invalid outputFilePath!"); - } - } else { - outputStream = new PrintWriter(System.out, true); - } - } + if (outputFileName != null) { + try { + outputStream = new PrintWriter(outputFileName); + } catch (IOException ex) { + throw new RuntimeException("Invalid outputFilePath!"); + } + } else { + outputStream = new PrintWriter(System.out, true); + } + } - public void detectorChanged(Detector detector) { - // Get the Subdetector. - ecal = (Subdetector) detector.getSubdetector(ecalName); - dec = ecal.getIDDecoder(); - } + public void detectorChanged(Detector detector) { + // Get the Subdetector. + ecal = (Subdetector) detector.getSubdetector(ecalName); + dec = ecal.getIDDecoder(); + } - public void process(EventHeader event) { - // Get the list of ECal hits. - if (event.hasCollection(RawTrackerHit.class, ecalCollectionName)) { - //outputStream.println("Reading RawTrackerHits from event " + event.getEventNumber()); - List<RawTrackerHit> hits = event.get(RawTrackerHit.class, ecalCollectionName); - for (RawTrackerHit hit : hits) { - dec.setID(hit.getCellID()); - outputStream.printf("%d\t%d\t%d\t%d\n", dec.getValue("ix"), dec.getValue("iy"), hit.getTime(), hit.getADCValues().length); - for (int i = 0; i < hit.getADCValues().length; i++) { - outputStream.printf("%d\n", hit.getADCValues()[i]); - } - } - } - } + public void process(EventHeader event) { + // Get the list of ECal hits. + if (event.hasCollection(RawTrackerHit.class, ecalCollectionName)) { + //outputStream.println("Reading RawTrackerHits from event " + event.getEventNumber()); + List<RawTrackerHit> hits = event.get(RawTrackerHit.class, ecalCollectionName); + for (RawTrackerHit hit : hits) { + dec.setID(hit.getCellID()); + outputStream.printf("%d\t%d\t%d\t%d\n", dec.getValue("ix"), dec.getValue("iy"), hit.getTime(), hit.getADCValues().length); + for (int i = 0; i < hit.getADCValues().length; i++) { + outputStream.printf("%d\n", hit.getADCValues()[i]); + } + } + } + } } Modified: java/trunk/users/src/main/java/org/hps/users/meeg/HPSGenericRawTrackerHitPrintDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/meeg/HPSGenericRawTrackerHitPrintDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/meeg/HPSGenericRawTrackerHitPrintDriver.java Wed Mar 9 11:43:24 2016 @@ -20,42 +20,42 @@ */ public class HPSGenericRawTrackerHitPrintDriver extends Driver { - String outputFileName; - PrintWriter outputStream = null; + String outputFileName; + PrintWriter outputStream = null; - public HPSGenericRawTrackerHitPrintDriver() { - } + public HPSGenericRawTrackerHitPrintDriver() { + } - public void setOutputFileName(String outputFileName) { - this.outputFileName = outputFileName; - } + public void setOutputFileName(String outputFileName) { + this.outputFileName = outputFileName; + } - public void startOfData() { - if (outputFileName != null) { - try { - outputStream = new PrintWriter(outputFileName); - } catch (IOException ex) { - throw new RuntimeException("Invalid outputFilePath!"); - } - } else { - outputStream = new PrintWriter(System.out, true); - } - } + public void startOfData() { + if (outputFileName != null) { + try { + outputStream = new PrintWriter(outputFileName); + } catch (IOException ex) { + throw new RuntimeException("Invalid outputFilePath!"); + } + } else { + outputStream = new PrintWriter(System.out, true); + } + } - public void process(EventHeader event) { - // Get the list of ECal hits. - if (event.hasCollection(RawTrackerHit.class)) { - //outputStream.println("Reading RawTrackerHits from event " + event.getEventNumber()); - List<List<RawTrackerHit>> listOfLists = event.get(RawTrackerHit.class); - for (List<RawTrackerHit> hits : listOfLists) { - outputStream.printf("List with %d RawTrackerHits:\n", hits.size()); - for (RawTrackerHit hit : hits) { - outputStream.printf("%d\t%d\n", hit.getCellID(), hit.getADCValues().length); - for (int i = 0; i < hit.getADCValues().length; i++) { - outputStream.printf("%d\n", hit.getADCValues()[i]); - } - } - } - } - } + public void process(EventHeader event) { + // Get the list of ECal hits. + if (event.hasCollection(RawTrackerHit.class)) { + //outputStream.println("Reading RawTrackerHits from event " + event.getEventNumber()); + List<List<RawTrackerHit>> listOfLists = event.get(RawTrackerHit.class); + for (List<RawTrackerHit> hits : listOfLists) { + outputStream.printf("List with %d RawTrackerHits:\n", hits.size()); + for (RawTrackerHit hit : hits) { + outputStream.printf("%d\t%d\n", hit.getCellID(), hit.getADCValues().length); + for (int i = 0; i < hit.getADCValues().length; i++) { + outputStream.printf("%d\n", hit.getADCValues()[i]); + } + } + } + } + } } Modified: java/trunk/users/src/main/java/org/hps/users/meeg/LCIOTrackAnalysis.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/meeg/LCIOTrackAnalysis.java (original) +++ java/trunk/users/src/main/java/org/hps/users/meeg/LCIOTrackAnalysis.java Wed Mar 9 11:43:24 2016 @@ -24,7 +24,7 @@ * @author Sho Uemura <[log in to unmask]> */ // TODO: This is an exact duplicate of the class in the analysis.example package. -// One of them should be sandboxed +// One of them should be sandboxed public class LCIOTrackAnalysis { protected Track track; Modified: java/trunk/users/src/main/java/org/hps/users/mgraham/HPSTrackerHit.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/mgraham/HPSTrackerHit.java (original) +++ java/trunk/users/src/main/java/org/hps/users/mgraham/HPSTrackerHit.java Wed Mar 9 11:43:24 2016 @@ -16,23 +16,23 @@ double t0; double amp; public HPSTrackerHit( - long id, - int time, - short[] adcValues, double t0, double Amp) { - this.cellId = id; - this.packedID = new Identifier(id); - this.time = time; - this.adcValues = adcValues; + long id, + int time, + short[] adcValues, double t0, double Amp) { + this.cellId = id; + this.packedID = new Identifier(id); + this.time = time; + this.adcValues = adcValues; this.t0=t0; this.amp=Amp; } public HPSTrackerHit( - RawTrackerHit rth, double t0, double Amp) { - this.cellId = rth.getCellID(); - this.packedID = new Identifier(rth.getCellID()); - this.time = rth.getTime(); - this.adcValues = rth.getADCValues(); + RawTrackerHit rth, double t0, double Amp) { + this.cellId = rth.getCellID(); + this.packedID = new Identifier(rth.getCellID()); + this.time = rth.getTime(); + this.adcValues = rth.getADCValues(); this.t0=t0; this.amp=Amp; } Modified: java/trunk/users/src/main/java/org/hps/users/mgraham/SVTRawTrackerHitThresholdDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/mgraham/SVTRawTrackerHitThresholdDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/mgraham/SVTRawTrackerHitThresholdDriver.java Wed Mar 9 11:43:24 2016 @@ -15,7 +15,7 @@ * @author Matt Graham */ // TODO: Check that this Driver works as expected after it was updated to use -// the database conditions system. +// the database conditions system. public class SVTRawTrackerHitThresholdDriver extends Driver { private String rawTrackerHitCollectionName = "RawTrackerHitMaker_RawTrackerHits"; Modified: java/trunk/users/src/main/java/org/hps/users/omoreno/EcalScoringPlaneDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/omoreno/EcalScoringPlaneDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/omoreno/EcalScoringPlaneDriver.java Wed Mar 9 11:43:24 2016 @@ -23,136 +23,136 @@ */ public class EcalScoringPlaneDriver extends Driver { - boolean verbose = false; - - // Collection Names - String ecalScoringPlaneHitsCollectionName = "TrackerHitsECal"; - String tracksCollectionName = "MatchedTracks"; - String trackToScoringPlaneHitRelationsName = "TrackToEcalScoringPlaneHitRelations"; - String trackToMCParticleRelationsName = "TrackToMCParticleRelations"; - - /** - * Enable/disable verbose mode - * - * @param verbose : set true to enable, false otherwise - */ - public void setVerbose(boolean verbose){ - this.verbose = verbose; - } - - @Override - protected void process(EventHeader event){ - - // If the event doesn't have a collection of Tracks, skip it - if(!event.hasCollection(Track.class, tracksCollectionName)) return; - - // If the event doesn't have a collection of Ecal scoring plane hits, - // skip it - if(!event.hasCollection(SimTrackerHit.class, ecalScoringPlaneHitsCollectionName)) return; - - // Get the collection of tracks from the event - List<Track> tracks = event.get(Track.class, tracksCollectionName); - - // Get the collection of Ecal scoring plane hits from the event - List<SimTrackerHit> scoringPlaneHits = event.get(SimTrackerHit.class, ecalScoringPlaneHitsCollectionName); - - // Create a collection to hold the scoring plane hits that were found to match - // a track - List<SimTrackerHit> matchedScoringPlaneHits = new ArrayList<SimTrackerHit>(); - - // Create a collection of LCRelations between a track and the scoring plane hit - List<LCRelation> trackToScoringPlaneHitRelations = new ArrayList<LCRelation>(); - - // Create a collection of LCRelations between a track and its corresponding MC particle - List<LCRelation> trackToMCParticleRelations = new ArrayList<LCRelation>(); - - MCParticle particle = null; - for(Track track : tracks){ - - // Get the MC particle associated with this track - particle = this.getMCParticleAssociatedWithTrack(track); - // If the MC particle is null, then the hits associated with the - // track did not have an MC particle associated with them - // TODO: Find out why some hits don't have any MC particles associated with them - if(particle == null) continue; - - // Add an LCRelation between the track and the corresponding MC particle - trackToMCParticleRelations.add(new BaseLCRelation(track, particle)); - - // Loop over all of the scoring plane hits and check if the associated MC particle - // matches the one from the track - for(SimTrackerHit scoringPlaneHit : scoringPlaneHits){ - - // If the MC particles don't match, move on to the next particle - if(!(scoringPlaneHit.getMCParticle() == particle)) continue; - - this.printVerbose("Found a match between a track and a scoring plane hit."); - - // If a match is found, add the scoring plane hit to the list of matched hits and - // an LCRelation between the track and the scoring plane. - matchedScoringPlaneHits.add(scoringPlaneHit); - trackToScoringPlaneHitRelations.add(new BaseLCRelation(track, scoringPlaneHit)); - - // Once a match is found, there is no need to loop through the rest of the list - break; - } - } - - // Store all of the collections in the event - event.put(ecalScoringPlaneHitsCollectionName, matchedScoringPlaneHits, SimTrackerHit.class, 0); - event.put(trackToScoringPlaneHitRelationsName, trackToScoringPlaneHitRelations, LCRelation.class, 0); - event.put(trackToMCParticleRelationsName, trackToMCParticleRelations, LCRelation.class, 0); - } - - /** - * Print a message if verbose has been enabled. - * - * @param message : message to print. - */ - private void printVerbose(String message){ - if(verbose) - System.out.println(this.getClass().getSimpleName() + ": " + message); - } - - /** - * Get the MC particle associated with a track. - * - * @param track : Track to get the MC particle for - * @return The MC particle associated with the track - */ - private MCParticle getMCParticleAssociatedWithTrack(Track track){ - - Map <MCParticle, int[]>mcParticleMultiplicity = new HashMap<MCParticle, int[]>(); - MCParticle particle; - for(TrackerHit hit : track.getTrackerHits()){ - - // If one of the tracker hits doesn't have any MC particles associated - // with it, return null for now. - if(((HelicalTrackHit) hit).getMCParticles().size() == 0){ - this.printVerbose("HelicalTrackHit is not associated with any MC particles."); - return null; - } - - particle = ((HelicalTrackHit) hit).getMCParticles().get(0); - if(!mcParticleMultiplicity.containsKey(particle)){ - mcParticleMultiplicity.put(particle, new int[1]); - mcParticleMultiplicity.get(particle)[0] = 0; - } - - mcParticleMultiplicity.get(particle)[0]++; - - } - - // Look for the MC particle that occurs the most of the track - int maxValue = 0; - particle = null; - for(Map.Entry<MCParticle, int[]> entry : mcParticleMultiplicity.entrySet()){ - if(maxValue < entry.getValue()[0]){ - particle = entry.getKey(); - maxValue = entry.getValue()[0]; - } - } - - return particle; - } + boolean verbose = false; + + // Collection Names + String ecalScoringPlaneHitsCollectionName = "TrackerHitsECal"; + String tracksCollectionName = "MatchedTracks"; + String trackToScoringPlaneHitRelationsName = "TrackToEcalScoringPlaneHitRelations"; + String trackToMCParticleRelationsName = "TrackToMCParticleRelations"; + + /** + * Enable/disable verbose mode + * + * @param verbose : set true to enable, false otherwise + */ + public void setVerbose(boolean verbose){ + this.verbose = verbose; + } + + @Override + protected void process(EventHeader event){ + + // If the event doesn't have a collection of Tracks, skip it + if(!event.hasCollection(Track.class, tracksCollectionName)) return; + + // If the event doesn't have a collection of Ecal scoring plane hits, + // skip it + if(!event.hasCollection(SimTrackerHit.class, ecalScoringPlaneHitsCollectionName)) return; + + // Get the collection of tracks from the event + List<Track> tracks = event.get(Track.class, tracksCollectionName); + + // Get the collection of Ecal scoring plane hits from the event + List<SimTrackerHit> scoringPlaneHits = event.get(SimTrackerHit.class, ecalScoringPlaneHitsCollectionName); + + // Create a collection to hold the scoring plane hits that were found to match + // a track + List<SimTrackerHit> matchedScoringPlaneHits = new ArrayList<SimTrackerHit>(); + + // Create a collection of LCRelations between a track and the scoring plane hit + List<LCRelation> trackToScoringPlaneHitRelations = new ArrayList<LCRelation>(); + + // Create a collection of LCRelations between a track and its corresponding MC particle + List<LCRelation> trackToMCParticleRelations = new ArrayList<LCRelation>(); + + MCParticle particle = null; + for(Track track : tracks){ + + // Get the MC particle associated with this track + particle = this.getMCParticleAssociatedWithTrack(track); + // If the MC particle is null, then the hits associated with the + // track did not have an MC particle associated with them + // TODO: Find out why some hits don't have any MC particles associated with them + if(particle == null) continue; + + // Add an LCRelation between the track and the corresponding MC particle + trackToMCParticleRelations.add(new BaseLCRelation(track, particle)); + + // Loop over all of the scoring plane hits and check if the associated MC particle + // matches the one from the track + for(SimTrackerHit scoringPlaneHit : scoringPlaneHits){ + + // If the MC particles don't match, move on to the next particle + if(!(scoringPlaneHit.getMCParticle() == particle)) continue; + + this.printVerbose("Found a match between a track and a scoring plane hit."); + + // If a match is found, add the scoring plane hit to the list of matched hits and + // an LCRelation between the track and the scoring plane. + matchedScoringPlaneHits.add(scoringPlaneHit); + trackToScoringPlaneHitRelations.add(new BaseLCRelation(track, scoringPlaneHit)); + + // Once a match is found, there is no need to loop through the rest of the list + break; + } + } + + // Store all of the collections in the event + event.put(ecalScoringPlaneHitsCollectionName, matchedScoringPlaneHits, SimTrackerHit.class, 0); + event.put(trackToScoringPlaneHitRelationsName, trackToScoringPlaneHitRelations, LCRelation.class, 0); + event.put(trackToMCParticleRelationsName, trackToMCParticleRelations, LCRelation.class, 0); + } + + /** + * Print a message if verbose has been enabled. + * + * @param message : message to print. + */ + private void printVerbose(String message){ + if(verbose) + System.out.println(this.getClass().getSimpleName() + ": " + message); + } + + /** + * Get the MC particle associated with a track. + * + * @param track : Track to get the MC particle for + * @return The MC particle associated with the track + */ + private MCParticle getMCParticleAssociatedWithTrack(Track track){ + + Map <MCParticle, int[]>mcParticleMultiplicity = new HashMap<MCParticle, int[]>(); + MCParticle particle; + for(TrackerHit hit : track.getTrackerHits()){ + + // If one of the tracker hits doesn't have any MC particles associated + // with it, return null for now. + if(((HelicalTrackHit) hit).getMCParticles().size() == 0){ + this.printVerbose("HelicalTrackHit is not associated with any MC particles."); + return null; + } + + particle = ((HelicalTrackHit) hit).getMCParticles().get(0); + if(!mcParticleMultiplicity.containsKey(particle)){ + mcParticleMultiplicity.put(particle, new int[1]); + mcParticleMultiplicity.get(particle)[0] = 0; + } + + mcParticleMultiplicity.get(particle)[0]++; + + } + + // Look for the MC particle that occurs the most of the track + int maxValue = 0; + particle = null; + for(Map.Entry<MCParticle, int[]> entry : mcParticleMultiplicity.entrySet()){ + if(maxValue < entry.getValue()[0]){ + particle = entry.getKey(); + maxValue = entry.getValue()[0]; + } + } + + return particle; + } } Modified: java/trunk/users/src/main/java/org/hps/users/omoreno/ExtrapolationAnalysis.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/omoreno/ExtrapolationAnalysis.java (original) +++ java/trunk/users/src/main/java/org/hps/users/omoreno/ExtrapolationAnalysis.java Wed Mar 9 11:43:24 2016 @@ -30,312 +30,312 @@ */ public class ExtrapolationAnalysis extends Driver { - AIDA aida = null; - List<IPlotter> plotters; - - Hep3Vector bField = null; - - boolean verbose = false; - - // Collection Names - String matchedEcalScoringPlaneHitsCollectionName = "MatchedTrackerHitsEcal"; - String trackToScoringPlaneHitRelationsName = "TrackToEcalScoringPlaneHitRelations"; - String trackToMCParticleRelationsName = "TrackToMCParticleRelations"; - - /** - * Enable/disable verbose mode - * - * @param verbose : true to enable, false otherwise - */ - public void setVerbose(boolean verbose){ - this.verbose = verbose; - } - - public void detectorChanged(Detector detector){ - - // Get the magnetic field from the geometry - bField = detector.getFieldMap().getField(new BasicHep3Vector(0,0,0)); - - //-----------------------// - //--- Setup all plots ---// - //-----------------------// - - // Setup AIDA - aida = AIDA.defaultInstance(); - aida.tree().cd("/"); - - // Instantiate a list to hold the collection of plotters - plotters = new ArrayList<IPlotter>(); - IPlotter plotter = null; - - //--- Plots of scoring plane positions ---// - //----------------------------------------// - plotter = PlotUtils.setupPlotter("Positions of Scoring plane hits matched to tracks", 2, 2); - PlotUtils.setup1DRegion(plotter, "Scoring plane hit position - x", 0, "x (mm)", - aida.histogram1D("Scoring plane hit position - x", 100, -400, 400)); - PlotUtils.setup1DRegion(plotter, "Scoring plane hit position - y", 1, "y (mm)", - aida.histogram1D("Scoring plane hit position - y", 100, -200, 200)); - PlotUtils.setup1DRegion(plotter, "Scoring plane hit position - z", 2, "z (mm)", - aida.histogram1D("Scoring plane hit position - z", 100, 1000, 1500)); - PlotUtils.setup2DRegion(plotter, "Scoring plane hit position - x-y", 3, "x (mm)", "y (mm)", - aida.histogram2D("Scoring plane hit position - x-y", 100, -400, 400, 100, -200, 200)); - plotters.add(plotter); - - //--- Plots of residuals at scoring plane ---// - //-------------------------------------------// - plotter = PlotUtils.setupPlotter("Residuals at scoring plane", 3, 3); - PlotUtils.setup1DRegion(plotter, "Top tracks - Bend plane residuals at scoring plane", 0, "x_{ep} - x_{sp} (mm)", - aida.histogram1D("Top electron tracks - Bend plane residual at scoring plane", 60, -30, 30)); - PlotUtils.setup1DRegion(plotter, "Top tracks - Bend plane residuals at scoring plane", 0, "x_{ep} - x_{sp} (mm)", - aida.histogram1D("Top positron tracks - Bend plane residual at scoring plane", 60, -30, 30)); - PlotUtils.setup1DRegion(plotter, "Bottom tracks - Bend plane residuals at scoring plane", 1, "x_{ep} - x_{sp} (mm)", - aida.histogram1D("Bottom electron tracks - Bend plane residuals at scoring plane", 60, -30, 30)); - PlotUtils.setup1DRegion(plotter, "Bottom tracks - Bend plane residuals at scoring plane", 1, "x_{ep} - x_{sp} (mm)", - aida.histogram1D("Bottom positron tracks - Bend plane residuals at scoring plane", 60, -30, 30)); - PlotUtils.setup1DRegion(plotter, "Bend plane residuals at scoring plane", 2, "x_{ep} - x_{sp} (mm)", - aida.histogram1D("Bend plane residuals at scoring plane", 60, -30, 30)); - PlotUtils.setup1DRegion(plotter, "Bend plane residuals at scoring plane", 2, "x_{ep} - x_{sp} (mm)", - aida.histogram1D("Bend plane residuals at scoring plane", 60, -30, 30)); - PlotUtils.setup1DRegion(plotter, "Top tracks - Non-bend plane residuals at scoring plane", 3,"y_{ep} - y_{sp} (mm)", - aida.histogram1D("Top electron tracks - Non-bend plane residuals at scoring plane", 30, -15, 15)); - PlotUtils.setup1DRegion(plotter, "Top tracks - Non-bend plane residuals at scoring plane", 3,"y_{ep} - y_{sp} (mm)", - aida.histogram1D("Top positron tracks - Non-bend plane residuals at scoring plane", 30, -15, 15)); - PlotUtils.setup1DRegion(plotter, "Bottom tracks - Non-bend plane residuals at scoring plane", 4,"y_{ep} - y_{sp} (mm)", - aida.histogram1D("Bottom electron tracks - Non-bend plane residuals at scoring plane", 30, -15, 15)); - PlotUtils.setup1DRegion(plotter, "Bottom tracks - Non-bend plane residuals at scoring plane", 4,"y_{ep} - y_{sp} (mm)", - aida.histogram1D("Bottom positron tracks - Non-bend plane residuals at scoring plane", 30, -15, 15)); - PlotUtils.setup1DRegion(plotter, "Non-bend plane residuals at scoring plane", 5,"y_{ep} - y_{sp} (mm)", - aida.histogram1D("Non-bend plane residuals at scoring plane", 30, -15, 15)); - PlotUtils.setup1DRegion(plotter, "Top tracks - z residuals at scoring plane", 6, "z_{ep} - z_{sp} (mm)", - aida.histogram1D("Top electron tracks - z residuals at scoring plane", 10, -5, 5)); - PlotUtils.setup1DRegion(plotter, "Top tracks - z residuals at scoring plane", 6, "z_{ep} - z_{sp} (mm)", - aida.histogram1D("Top positron tracks - z residuals at scoring plane", 10, -5, 5)); - PlotUtils.setup1DRegion(plotter, "Bottom tracks - z residuals at scoring plane", 7, "z_{ep} - z_{sp} (mm)", - aida.histogram1D("Bottom electron tracks - z residuals at scoring plane", 10, -5, 5)); - PlotUtils.setup1DRegion(plotter, "Bottom tracks - z residuals at scoring plane", 7, "z_{ep} - z_{sp} (mm)", - aida.histogram1D("Bottom positron tracks - z residuals at scoring plane", 10, -5, 5)); - PlotUtils.setup1DRegion(plotter, "z residuals at scoring plane", 7, "z_{ep} - z_{sp} (mm)", - aida.histogram1D("z residuals at scoring plane", 10, -5, 5)); - plotters.add(plotter); - - //--- Plots of residuals at target ---// - //------------------------------------// - plotter = PlotUtils.setupPlotter("Residuals at target", 3, 3); - PlotUtils.setup1DRegion(plotter, "Top tracks - Bend plane residuals at target", 0, "x_{ep} - x_{t} (mm)", - aida.histogram1D("Top electron tracks - Bend plane residual at target", 40, -4, 4)); - PlotUtils.setup1DRegion(plotter, "Top tracks - Bend plane residuals at target", 0, "x_{ep} - x_{t} (mm)", - aida.histogram1D("Top positron tracks - Bend plane residual at target", 40, -4, 4)); - PlotUtils.setup1DRegion(plotter, "Bottom tracks - Bend plane residuals at target", 1, "x_{ep} - x_{t} (mm)", - aida.histogram1D("Bottom electron tracks - Bend plane residuals at target", 40, -4, 4)); - PlotUtils.setup1DRegion(plotter, "Bottom tracks - Bend plane residuals at target", 1, "x_{ep} - x_{t} (mm)", - aida.histogram1D("Bottom positron tracks - Bend plane residuals at target", 40, -4, 4)); - PlotUtils.setup1DRegion(plotter, "Bend plane residuals at target", 2, "x_{ep} - x_{t} (mm)", - aida.histogram1D("Bend plane residuals at target", 40, -4, 4)); - PlotUtils.setup1DRegion(plotter, "Top tracks - Non-bend plane residuals at target", 3, "y_{ep} - y_{t} (mm)", - aida.histogram1D("Top electron tracks - Non-bend plane residuals at target", 20, -2, 2)); - PlotUtils.setup1DRegion(plotter, "Top tracks - Non-bend plane residuals at target", 3, "y_{ep} - y_{t} (mm)", - aida.histogram1D("Top positron tracks - Non-bend plane residuals at target", 20, -2, 2)); - PlotUtils.setup1DRegion(plotter, "Bottom tracks - Non-bend plane residuals at target", 4, "y_{ep} - y_{t} (mm)", - aida.histogram1D("Bottom electron tracks - Non-bend plane residuals at target", 20, -2, 2)); - PlotUtils.setup1DRegion(plotter, "Bottom tracks - Non-bend plane residuals at target", 4, "y_{ep} - y_{t} (mm)", - aida.histogram1D("Bottom positron tracks - Non-bend plane residuals at target", 20, -2, 2)); - PlotUtils.setup1DRegion(plotter, "Non-bend plane residuals at target", 5, "y_{ep} - y_{t} (mm)", - aida.histogram1D("Non-bend plane residuals at target", 20, -2, 2)); - PlotUtils.setup1DRegion(plotter, "Top tracks - z residuals at target", 6, "z_{ep} - z_{t} (mm)", - aida.histogram1D("Top electron tracks - z residuals at target", 50, -5, 5)); - PlotUtils.setup1DRegion(plotter, "Top tracks - z residuals at target", 6, "z_{ep} - z_{t} (mm)", - aida.histogram1D("Top positron tracks - z residuals at target", 50, -5, 5)); - PlotUtils.setup1DRegion(plotter, "Bottom tracks - z residuals at target", 7, "z_{ep} - z_{t} (mm)", - aida.histogram1D("Bottom electron tracks - z residuals at target", 50, -5, 5)); - PlotUtils.setup1DRegion(plotter, "Bottom tracks - z residuals at target", 7, "z_{ep} - z_{t} (mm)", - aida.histogram1D("Bottom positron tracks - z residuals at target", 50, -5, 5)); - PlotUtils.setup1DRegion(plotter, "z residuals at target", 8, "z_{ep} - z_{t} (mm)", - aida.histogram1D("z residuals at target", 50, -5, 5)); - plotters.add(plotter); - - //--- Plot of residuals at scoring plane vs momentum ---// - //------------------------------------------------------// - plotter = PlotUtils.setupPlotter("Residuals vs Momentum", 2, 2); - PlotUtils.setup2DRegion(plotter, "Bend plane residuals vs momentum at scoring plane", 0, - "Momentum (GeV)", "x_{ep} - x_{sp} (mm)", - aida.histogram2D("Bend plane residuals vs momentum at scoring plane", 5, 0, 2.5, 60, -30, 30)); - PlotUtils.setup2DRegion(plotter, "Non-bend plane residuals vs momentum at scoring plane", 1, - "Momentum (GeV)", "y_{ep} - y_{sp} (mm)", - aida.histogram2D("Non-bend plane residuals vs momentum at scoring plane", 5, 0, 2.5, 60, -30, 30)); - PlotUtils.setup2DRegion(plotter, "Bend plane residuals vs momentum at target", 2, - "Momentum (GeV)", "x_{ep} - x_{t} (mm)", - aida.histogram2D("Bend plane residuals vs momentum at target", 5, 0, 2.5, 60, -3, 3)); - PlotUtils.setup2DRegion(plotter, "Non-bend plane residuals vs momentum at target", 3, - "Momentum (GeV)", "y_{ep} - y_{t} (mm)", - aida.histogram2D("Non-bend plane residuals vs momentum at target", 5, 0, 2.5, 50, -2.5, 2.5)); - plotters.add(plotter); - - for(IPlotter iPlotter : plotters){ - iPlotter.show(); - } - - } - - public void process(EventHeader event){ - - // If the event doesn't contain an LCRelation between a track and its - // corresponding ECal scoring plane hit, skip the event. - if(!event.hasCollection(LCRelation.class, trackToScoringPlaneHitRelationsName)) return; - - List<LCRelation> trackToScoringPlaneHitRelations = event.get(LCRelation.class, trackToScoringPlaneHitRelationsName); - - for(LCRelation trackToScoringPlaneHitRelation : trackToScoringPlaneHitRelations){ - - // Get the track - Track track = (Track) trackToScoringPlaneHitRelation.getFrom(); - - // Get the track momentum - double[] momentum = BaseTrackState.computeMomentum(track.getTrackStates().get(0), bField.y()); - double p = Math.sqrt(momentum[0]*momentum[0] + momentum[1]*momentum[1] + momentum[2]*momentum[2]); - this.printVerbose("Track momentum: " + p); - - // Get the corresponding scoring plane hit - SimTrackerHit scoringPlaneHit = (SimTrackerHit) trackToScoringPlaneHitRelation.getTo(); - Hep3Vector scoringPlaneHitPosition = scoringPlaneHit.getPositionVec(); - this.printVerbose("Scoring plane hit position: " + scoringPlaneHitPosition.toString()); - - // Fill the scoring plane position histograms - aida.histogram1D("Scoring plane hit position - x").fill(scoringPlaneHitPosition.x()); - aida.histogram1D("Scoring plane hit position - y").fill(scoringPlaneHitPosition.y()); - aida.histogram1D("Scoring plane hit position - z").fill(scoringPlaneHitPosition.z()); - aida.histogram2D("Scoring plane hit position - x-y").fill(scoringPlaneHitPosition.x(), scoringPlaneHitPosition.y()); - - // Extrapolate the track to the scoring plane position - Hep3Vector trackPositionAtScoringPlane = TrackUtils.extrapolateTrack(track, scoringPlaneHitPosition.z()); - this.printVerbose("Extrapolated track position: " + trackPositionAtScoringPlane.toString()); - - // Find the residual between the extrapolated track position and the scoring plane hit position - double deltaX = trackPositionAtScoringPlane.x() - scoringPlaneHitPosition.x(); - double deltaY = trackPositionAtScoringPlane.y() - scoringPlaneHitPosition.y(); - // This should be 0 but it serves as a sanity check. - double deltaZ = trackPositionAtScoringPlane.z() - scoringPlaneHitPosition.z(); - - if(track.getTrackerHits().get(0).getPosition()[2] > 0){ - if(track.getTrackStates().get(0).getOmega() > 0){ - aida.histogram1D("Top positron tracks - Bend plane residual at scoring plane").fill(deltaX); - aida.histogram1D("Top positron tracks - Non-bend plane residuals at scoring plane").fill(deltaY); - aida.histogram1D("Top positron tracks - z residuals at scoring plane").fill(deltaZ); - } else { - aida.histogram1D("Top electron tracks - Bend plane residual at scoring plane").fill(deltaX); - aida.histogram1D("Top electron tracks - Non-bend plane residuals at scoring plane").fill(deltaY); - aida.histogram1D("Top electron tracks - z residuals at scoring plane").fill(deltaZ); - } - } else { - if(track.getTrackStates().get(0).getOmega() > 0){ - aida.histogram1D("Bottom positron tracks - Bend plane residuals at scoring plane").fill(deltaX); - aida.histogram1D("Bottom positron tracks - Non-bend plane residuals at scoring plane").fill(deltaY); - aida.histogram1D("Bottom positron tracks - z residuals at scoring plane").fill(deltaZ); - } else { - aida.histogram1D("Bottom electron tracks - Bend plane residuals at scoring plane").fill(deltaX); - aida.histogram1D("Bottom electron tracks - Non-bend plane residuals at scoring plane").fill(deltaY); - aida.histogram1D("Bottom electron tracks - z residuals at scoring plane").fill(deltaZ); - } - } - - aida.histogram1D("Bend plane residuals at scoring plane").fill(deltaX); - aida.histogram1D("Non-bend plane residuals at scoring plane").fill(deltaY); - aida.histogram1D("z residuals at target").fill(deltaZ); - aida.histogram2D("Bend plane residuals vs momentum at scoring plane").fill(p, deltaX); - aida.histogram2D("Non-bend plane residuals vs momentum at scoring plane").fill(p, deltaY); - } - - if(!event.hasCollection(LCRelation.class, trackToMCParticleRelationsName)) return; - - List<LCRelation> trackToMCParticleRelations = event.get(LCRelation.class, trackToMCParticleRelationsName); - - for(LCRelation trackToMCParticleRelation : trackToMCParticleRelations){ - - // Get the track - Track track = (Track) trackToMCParticleRelation.getFrom(); - - // Get the track momentum - double[] momentum = BaseTrackState.computeMomentum(track.getTrackStates().get(0), bField.y()); - double p = Math.sqrt(momentum[0]*momentum[0] + momentum[1]*momentum[1] + momentum[2]*momentum[2]); - this.printVerbose("Track momentum: " + p); - - // Get the corresponding MC particle - MCParticle particle = (MCParticle) trackToMCParticleRelation.getTo(); - - // Extrapolate the track to the origin - Hep3Vector trackPositionAtOrigin = TrackUtils.extrapolateTrack(track, particle.getOriginZ()); - - // Find the residual between the extrapolated track and the position of the scoring plane at the origin - double deltaX = trackPositionAtOrigin.x() - particle.getOriginX(); - double deltaY = trackPositionAtOrigin.y() - particle.getOriginY(); - double deltaZ = trackPositionAtOrigin.z() - particle.getOriginZ(); - - if(track.getTrackerHits().get(0).getPosition()[2] > 0){ - if(track.getTrackStates().get(0).getOmega() > 0){ - aida.histogram1D("Top positron tracks - Bend plane residual at target").fill(deltaX); - aida.histogram1D("Top positron tracks - Non-bend plane residuals at target").fill(deltaY); - aida.histogram1D("Top positron tracks - z residuals at target").fill(deltaZ); - } else { - aida.histogram1D("Top electron tracks - Bend plane residual at target").fill(deltaX); - aida.histogram1D("Top electron tracks - Non-bend plane residuals at target").fill(deltaY); - aida.histogram1D("Top electron tracks - z residuals at target").fill(deltaZ); - } - } else { - - if(track.getTrackStates().get(0).getOmega() > 0){ - aida.histogram1D("Bottom positron tracks - Bend plane residuals at target").fill(deltaX); - aida.histogram1D("Bottom positron tracks - Non-bend plane residuals at target").fill(deltaY); - aida.histogram1D("Bottom positron tracks - z residuals at target").fill(deltaZ); - } else { - aida.histogram1D("Bottom electron tracks - Bend plane residuals at target").fill(deltaX); - aida.histogram1D("Bottom electron tracks - Non-bend plane residuals at target").fill(deltaY); - aida.histogram1D("Bottom electron tracks - z residuals at target").fill(deltaZ); - } - } - - aida.histogram1D("Bend plane residuals at target").fill(deltaX); - aida.histogram1D("Non-bend plane residuals at target").fill(deltaY); - aida.histogram1D("z residuals at target").fill(deltaZ); - aida.histogram2D("Bend plane residuals vs momentum at target").fill(p, deltaX); - aida.histogram2D("Non-bend plane residuals vs momentum at target").fill(p, deltaY); - } - } - - @Override - protected void endOfData(){ - - IHistogram2D histogram = aida.histogram2D("Bend plane residuals vs momentum at scoring plane"); - int binsX = histogram.xAxis().bins(); - for(int binX = 0; binX < binsX; binX++){ - PlotUtils.getYProjection(binX, histogram); - } - - histogram = aida.histogram2D("Non-bend plane residuals vs momentum at scoring plane"); - binsX = histogram.xAxis().bins(); - for(int binX = 0; binX < binsX; binX++){ - PlotUtils.getYProjection(binX, histogram); - } - - histogram = aida.histogram2D("Bend plane residuals vs momentum at target"); - binsX = histogram.xAxis().bins(); - for(int binX = 0; binX < binsX; binX++){ - PlotUtils.getYProjection(binX, histogram); - } - - histogram = aida.histogram2D("Non-bend plane residuals vs momentum at target"); - binsX = histogram.xAxis().bins(); - for(int binX = 0; binX < binsX; binX++){ - PlotUtils.getYProjection(binX, histogram); - } - } - - /** - * Print a message if verbose has been enabled. - * - * @param message : message to print. - */ - private void printVerbose(String message){ - if(verbose) - System.out.println(this.getClass().getSimpleName() + ": " + message); - } - + AIDA aida = null; + List<IPlotter> plotters; + + Hep3Vector bField = null; + + boolean verbose = false; + + // Collection Names + String matchedEcalScoringPlaneHitsCollectionName = "MatchedTrackerHitsEcal"; + String trackToScoringPlaneHitRelationsName = "TrackToEcalScoringPlaneHitRelations"; + String trackToMCParticleRelationsName = "TrackToMCParticleRelations"; + + /** + * Enable/disable verbose mode + * + * @param verbose : true to enable, false otherwise + */ + public void setVerbose(boolean verbose){ + this.verbose = verbose; + } + + public void detectorChanged(Detector detector){ + + // Get the magnetic field from the geometry + bField = detector.getFieldMap().getField(new BasicHep3Vector(0,0,0)); + + //-----------------------// + //--- Setup all plots ---// + //-----------------------// + + // Setup AIDA + aida = AIDA.defaultInstance(); + aida.tree().cd("/"); + + // Instantiate a list to hold the collection of plotters + plotters = new ArrayList<IPlotter>(); + IPlotter plotter = null; + + //--- Plots of scoring plane positions ---// + //----------------------------------------// + plotter = PlotUtils.setupPlotter("Positions of Scoring plane hits matched to tracks", 2, 2); + PlotUtils.setup1DRegion(plotter, "Scoring plane hit position - x", 0, "x (mm)", + aida.histogram1D("Scoring plane hit position - x", 100, -400, 400)); + PlotUtils.setup1DRegion(plotter, "Scoring plane hit position - y", 1, "y (mm)", + aida.histogram1D("Scoring plane hit position - y", 100, -200, 200)); + PlotUtils.setup1DRegion(plotter, "Scoring plane hit position - z", 2, "z (mm)", + aida.histogram1D("Scoring plane hit position - z", 100, 1000, 1500)); + PlotUtils.setup2DRegion(plotter, "Scoring plane hit position - x-y", 3, "x (mm)", "y (mm)", + aida.histogram2D("Scoring plane hit position - x-y", 100, -400, 400, 100, -200, 200)); + plotters.add(plotter); + + //--- Plots of residuals at scoring plane ---// + //-------------------------------------------// + plotter = PlotUtils.setupPlotter("Residuals at scoring plane", 3, 3); + PlotUtils.setup1DRegion(plotter, "Top tracks - Bend plane residuals at scoring plane", 0, "x_{ep} - x_{sp} (mm)", + aida.histogram1D("Top electron tracks - Bend plane residual at scoring plane", 60, -30, 30)); + PlotUtils.setup1DRegion(plotter, "Top tracks - Bend plane residuals at scoring plane", 0, "x_{ep} - x_{sp} (mm)", + aida.histogram1D("Top positron tracks - Bend plane residual at scoring plane", 60, -30, 30)); + PlotUtils.setup1DRegion(plotter, "Bottom tracks - Bend plane residuals at scoring plane", 1, "x_{ep} - x_{sp} (mm)", + aida.histogram1D("Bottom electron tracks - Bend plane residuals at scoring plane", 60, -30, 30)); + PlotUtils.setup1DRegion(plotter, "Bottom tracks - Bend plane residuals at scoring plane", 1, "x_{ep} - x_{sp} (mm)", + aida.histogram1D("Bottom positron tracks - Bend plane residuals at scoring plane", 60, -30, 30)); + PlotUtils.setup1DRegion(plotter, "Bend plane residuals at scoring plane", 2, "x_{ep} - x_{sp} (mm)", + aida.histogram1D("Bend plane residuals at scoring plane", 60, -30, 30)); + PlotUtils.setup1DRegion(plotter, "Bend plane residuals at scoring plane", 2, "x_{ep} - x_{sp} (mm)", + aida.histogram1D("Bend plane residuals at scoring plane", 60, -30, 30)); + PlotUtils.setup1DRegion(plotter, "Top tracks - Non-bend plane residuals at scoring plane", 3,"y_{ep} - y_{sp} (mm)", + aida.histogram1D("Top electron tracks - Non-bend plane residuals at scoring plane", 30, -15, 15)); + PlotUtils.setup1DRegion(plotter, "Top tracks - Non-bend plane residuals at scoring plane", 3,"y_{ep} - y_{sp} (mm)", + aida.histogram1D("Top positron tracks - Non-bend plane residuals at scoring plane", 30, -15, 15)); + PlotUtils.setup1DRegion(plotter, "Bottom tracks - Non-bend plane residuals at scoring plane", 4,"y_{ep} - y_{sp} (mm)", + aida.histogram1D("Bottom electron tracks - Non-bend plane residuals at scoring plane", 30, -15, 15)); + PlotUtils.setup1DRegion(plotter, "Bottom tracks - Non-bend plane residuals at scoring plane", 4,"y_{ep} - y_{sp} (mm)", + aida.histogram1D("Bottom positron tracks - Non-bend plane residuals at scoring plane", 30, -15, 15)); + PlotUtils.setup1DRegion(plotter, "Non-bend plane residuals at scoring plane", 5,"y_{ep} - y_{sp} (mm)", + aida.histogram1D("Non-bend plane residuals at scoring plane", 30, -15, 15)); + PlotUtils.setup1DRegion(plotter, "Top tracks - z residuals at scoring plane", 6, "z_{ep} - z_{sp} (mm)", + aida.histogram1D("Top electron tracks - z residuals at scoring plane", 10, -5, 5)); + PlotUtils.setup1DRegion(plotter, "Top tracks - z residuals at scoring plane", 6, "z_{ep} - z_{sp} (mm)", + aida.histogram1D("Top positron tracks - z residuals at scoring plane", 10, -5, 5)); + PlotUtils.setup1DRegion(plotter, "Bottom tracks - z residuals at scoring plane", 7, "z_{ep} - z_{sp} (mm)", + aida.histogram1D("Bottom electron tracks - z residuals at scoring plane", 10, -5, 5)); + PlotUtils.setup1DRegion(plotter, "Bottom tracks - z residuals at scoring plane", 7, "z_{ep} - z_{sp} (mm)", + aida.histogram1D("Bottom positron tracks - z residuals at scoring plane", 10, -5, 5)); + PlotUtils.setup1DRegion(plotter, "z residuals at scoring plane", 7, "z_{ep} - z_{sp} (mm)", + aida.histogram1D("z residuals at scoring plane", 10, -5, 5)); + plotters.add(plotter); + + //--- Plots of residuals at target ---// + //------------------------------------// + plotter = PlotUtils.setupPlotter("Residuals at target", 3, 3); + PlotUtils.setup1DRegion(plotter, "Top tracks - Bend plane residuals at target", 0, "x_{ep} - x_{t} (mm)", + aida.histogram1D("Top electron tracks - Bend plane residual at target", 40, -4, 4)); + PlotUtils.setup1DRegion(plotter, "Top tracks - Bend plane residuals at target", 0, "x_{ep} - x_{t} (mm)", + aida.histogram1D("Top positron tracks - Bend plane residual at target", 40, -4, 4)); + PlotUtils.setup1DRegion(plotter, "Bottom tracks - Bend plane residuals at target", 1, "x_{ep} - x_{t} (mm)", + aida.histogram1D("Bottom electron tracks - Bend plane residuals at target", 40, -4, 4)); + PlotUtils.setup1DRegion(plotter, "Bottom tracks - Bend plane residuals at target", 1, "x_{ep} - x_{t} (mm)", + aida.histogram1D("Bottom positron tracks - Bend plane residuals at target", 40, -4, 4)); + PlotUtils.setup1DRegion(plotter, "Bend plane residuals at target", 2, "x_{ep} - x_{t} (mm)", + aida.histogram1D("Bend plane residuals at target", 40, -4, 4)); + PlotUtils.setup1DRegion(plotter, "Top tracks - Non-bend plane residuals at target", 3, "y_{ep} - y_{t} (mm)", + aida.histogram1D("Top electron tracks - Non-bend plane residuals at target", 20, -2, 2)); + PlotUtils.setup1DRegion(plotter, "Top tracks - Non-bend plane residuals at target", 3, "y_{ep} - y_{t} (mm)", + aida.histogram1D("Top positron tracks - Non-bend plane residuals at target", 20, -2, 2)); + PlotUtils.setup1DRegion(plotter, "Bottom tracks - Non-bend plane residuals at target", 4, "y_{ep} - y_{t} (mm)", + aida.histogram1D("Bottom electron tracks - Non-bend plane residuals at target", 20, -2, 2)); + PlotUtils.setup1DRegion(plotter, "Bottom tracks - Non-bend plane residuals at target", 4, "y_{ep} - y_{t} (mm)", + aida.histogram1D("Bottom positron tracks - Non-bend plane residuals at target", 20, -2, 2)); + PlotUtils.setup1DRegion(plotter, "Non-bend plane residuals at target", 5, "y_{ep} - y_{t} (mm)", + aida.histogram1D("Non-bend plane residuals at target", 20, -2, 2)); + PlotUtils.setup1DRegion(plotter, "Top tracks - z residuals at target", 6, "z_{ep} - z_{t} (mm)", + aida.histogram1D("Top electron tracks - z residuals at target", 50, -5, 5)); + PlotUtils.setup1DRegion(plotter, "Top tracks - z residuals at target", 6, "z_{ep} - z_{t} (mm)", + aida.histogram1D("Top positron tracks - z residuals at target", 50, -5, 5)); + PlotUtils.setup1DRegion(plotter, "Bottom tracks - z residuals at target", 7, "z_{ep} - z_{t} (mm)", + aida.histogram1D("Bottom electron tracks - z residuals at target", 50, -5, 5)); + PlotUtils.setup1DRegion(plotter, "Bottom tracks - z residuals at target", 7, "z_{ep} - z_{t} (mm)", + aida.histogram1D("Bottom positron tracks - z residuals at target", 50, -5, 5)); + PlotUtils.setup1DRegion(plotter, "z residuals at target", 8, "z_{ep} - z_{t} (mm)", + aida.histogram1D("z residuals at target", 50, -5, 5)); + plotters.add(plotter); + + //--- Plot of residuals at scoring plane vs momentum ---// + //------------------------------------------------------// + plotter = PlotUtils.setupPlotter("Residuals vs Momentum", 2, 2); + PlotUtils.setup2DRegion(plotter, "Bend plane residuals vs momentum at scoring plane", 0, + "Momentum (GeV)", "x_{ep} - x_{sp} (mm)", + aida.histogram2D("Bend plane residuals vs momentum at scoring plane", 5, 0, 2.5, 60, -30, 30)); + PlotUtils.setup2DRegion(plotter, "Non-bend plane residuals vs momentum at scoring plane", 1, + "Momentum (GeV)", "y_{ep} - y_{sp} (mm)", + aida.histogram2D("Non-bend plane residuals vs momentum at scoring plane", 5, 0, 2.5, 60, -30, 30)); + PlotUtils.setup2DRegion(plotter, "Bend plane residuals vs momentum at target", 2, + "Momentum (GeV)", "x_{ep} - x_{t} (mm)", + aida.histogram2D("Bend plane residuals vs momentum at target", 5, 0, 2.5, 60, -3, 3)); + PlotUtils.setup2DRegion(plotter, "Non-bend plane residuals vs momentum at target", 3, + "Momentum (GeV)", "y_{ep} - y_{t} (mm)", + aida.histogram2D("Non-bend plane residuals vs momentum at target", 5, 0, 2.5, 50, -2.5, 2.5)); + plotters.add(plotter); + + for(IPlotter iPlotter : plotters){ + iPlotter.show(); + } + + } + + public void process(EventHeader event){ + + // If the event doesn't contain an LCRelation between a track and its + // corresponding ECal scoring plane hit, skip the event. + if(!event.hasCollection(LCRelation.class, trackToScoringPlaneHitRelationsName)) return; + + List<LCRelation> trackToScoringPlaneHitRelations = event.get(LCRelation.class, trackToScoringPlaneHitRelationsName); + + for(LCRelation trackToScoringPlaneHitRelation : trackToScoringPlaneHitRelations){ + + // Get the track + Track track = (Track) trackToScoringPlaneHitRelation.getFrom(); + + // Get the track momentum + double[] momentum = BaseTrackState.computeMomentum(track.getTrackStates().get(0), bField.y()); + double p = Math.sqrt(momentum[0]*momentum[0] + momentum[1]*momentum[1] + momentum[2]*momentum[2]); + this.printVerbose("Track momentum: " + p); + + // Get the corresponding scoring plane hit + SimTrackerHit scoringPlaneHit = (SimTrackerHit) trackToScoringPlaneHitRelation.getTo(); + Hep3Vector scoringPlaneHitPosition = scoringPlaneHit.getPositionVec(); + this.printVerbose("Scoring plane hit position: " + scoringPlaneHitPosition.toString()); + + // Fill the scoring plane position histograms + aida.histogram1D("Scoring plane hit position - x").fill(scoringPlaneHitPosition.x()); + aida.histogram1D("Scoring plane hit position - y").fill(scoringPlaneHitPosition.y()); + aida.histogram1D("Scoring plane hit position - z").fill(scoringPlaneHitPosition.z()); + aida.histogram2D("Scoring plane hit position - x-y").fill(scoringPlaneHitPosition.x(), scoringPlaneHitPosition.y()); + + // Extrapolate the track to the scoring plane position + Hep3Vector trackPositionAtScoringPlane = TrackUtils.extrapolateTrack(track, scoringPlaneHitPosition.z()); + this.printVerbose("Extrapolated track position: " + trackPositionAtScoringPlane.toString()); + + // Find the residual between the extrapolated track position and the scoring plane hit position + double deltaX = trackPositionAtScoringPlane.x() - scoringPlaneHitPosition.x(); + double deltaY = trackPositionAtScoringPlane.y() - scoringPlaneHitPosition.y(); + // This should be 0 but it serves as a sanity check. + double deltaZ = trackPositionAtScoringPlane.z() - scoringPlaneHitPosition.z(); + + if(track.getTrackerHits().get(0).getPosition()[2] > 0){ + if(track.getTrackStates().get(0).getOmega() > 0){ + aida.histogram1D("Top positron tracks - Bend plane residual at scoring plane").fill(deltaX); + aida.histogram1D("Top positron tracks - Non-bend plane residuals at scoring plane").fill(deltaY); + aida.histogram1D("Top positron tracks - z residuals at scoring plane").fill(deltaZ); + } else { + aida.histogram1D("Top electron tracks - Bend plane residual at scoring plane").fill(deltaX); + aida.histogram1D("Top electron tracks - Non-bend plane residuals at scoring plane").fill(deltaY); + aida.histogram1D("Top electron tracks - z residuals at scoring plane").fill(deltaZ); + } + } else { + if(track.getTrackStates().get(0).getOmega() > 0){ + aida.histogram1D("Bottom positron tracks - Bend plane residuals at scoring plane").fill(deltaX); + aida.histogram1D("Bottom positron tracks - Non-bend plane residuals at scoring plane").fill(deltaY); + aida.histogram1D("Bottom positron tracks - z residuals at scoring plane").fill(deltaZ); + } else { + aida.histogram1D("Bottom electron tracks - Bend plane residuals at scoring plane").fill(deltaX); + aida.histogram1D("Bottom electron tracks - Non-bend plane residuals at scoring plane").fill(deltaY); + aida.histogram1D("Bottom electron tracks - z residuals at scoring plane").fill(deltaZ); + } + } + + aida.histogram1D("Bend plane residuals at scoring plane").fill(deltaX); + aida.histogram1D("Non-bend plane residuals at scoring plane").fill(deltaY); + aida.histogram1D("z residuals at target").fill(deltaZ); + aida.histogram2D("Bend plane residuals vs momentum at scoring plane").fill(p, deltaX); + aida.histogram2D("Non-bend plane residuals vs momentum at scoring plane").fill(p, deltaY); + } + + if(!event.hasCollection(LCRelation.class, trackToMCParticleRelationsName)) return; + + List<LCRelation> trackToMCParticleRelations = event.get(LCRelation.class, trackToMCParticleRelationsName); + + for(LCRelation trackToMCParticleRelation : trackToMCParticleRelations){ + + // Get the track + Track track = (Track) trackToMCParticleRelation.getFrom(); + + // Get the track momentum + double[] momentum = BaseTrackState.computeMomentum(track.getTrackStates().get(0), bField.y()); + double p = Math.sqrt(momentum[0]*momentum[0] + momentum[1]*momentum[1] + momentum[2]*momentum[2]); + this.printVerbose("Track momentum: " + p); + + // Get the corresponding MC particle + MCParticle particle = (MCParticle) trackToMCParticleRelation.getTo(); + + // Extrapolate the track to the origin + Hep3Vector trackPositionAtOrigin = TrackUtils.extrapolateTrack(track, particle.getOriginZ()); + + // Find the residual between the extrapolated track and the position of the scoring plane at the origin + double deltaX = trackPositionAtOrigin.x() - particle.getOriginX(); + double deltaY = trackPositionAtOrigin.y() - particle.getOriginY(); + double deltaZ = trackPositionAtOrigin.z() - particle.getOriginZ(); + + if(track.getTrackerHits().get(0).getPosition()[2] > 0){ + if(track.getTrackStates().get(0).getOmega() > 0){ + aida.histogram1D("Top positron tracks - Bend plane residual at target").fill(deltaX); + aida.histogram1D("Top positron tracks - Non-bend plane residuals at target").fill(deltaY); + aida.histogram1D("Top positron tracks - z residuals at target").fill(deltaZ); + } else { + aida.histogram1D("Top electron tracks - Bend plane residual at target").fill(deltaX); + aida.histogram1D("Top electron tracks - Non-bend plane residuals at target").fill(deltaY); + aida.histogram1D("Top electron tracks - z residuals at target").fill(deltaZ); + } + } else { + + if(track.getTrackStates().get(0).getOmega() > 0){ + aida.histogram1D("Bottom positron tracks - Bend plane residuals at target").fill(deltaX); + aida.histogram1D("Bottom positron tracks - Non-bend plane residuals at target").fill(deltaY); + aida.histogram1D("Bottom positron tracks - z residuals at target").fill(deltaZ); + } else { + aida.histogram1D("Bottom electron tracks - Bend plane residuals at target").fill(deltaX); + aida.histogram1D("Bottom electron tracks - Non-bend plane residuals at target").fill(deltaY); + aida.histogram1D("Bottom electron tracks - z residuals at target").fill(deltaZ); + } + } + + aida.histogram1D("Bend plane residuals at target").fill(deltaX); + aida.histogram1D("Non-bend plane residuals at target").fill(deltaY); + aida.histogram1D("z residuals at target").fill(deltaZ); + aida.histogram2D("Bend plane residuals vs momentum at target").fill(p, deltaX); + aida.histogram2D("Non-bend plane residuals vs momentum at target").fill(p, deltaY); + } + } + + @Override + protected void endOfData(){ + + IHistogram2D histogram = aida.histogram2D("Bend plane residuals vs momentum at scoring plane"); + int binsX = histogram.xAxis().bins(); + for(int binX = 0; binX < binsX; binX++){ + PlotUtils.getYProjection(binX, histogram); + } + + histogram = aida.histogram2D("Non-bend plane residuals vs momentum at scoring plane"); + binsX = histogram.xAxis().bins(); + for(int binX = 0; binX < binsX; binX++){ + PlotUtils.getYProjection(binX, histogram); + } + + histogram = aida.histogram2D("Bend plane residuals vs momentum at target"); + binsX = histogram.xAxis().bins(); + for(int binX = 0; binX < binsX; binX++){ + PlotUtils.getYProjection(binX, histogram); + } + + histogram = aida.histogram2D("Non-bend plane residuals vs momentum at target"); + binsX = histogram.xAxis().bins(); + for(int binX = 0; binX < binsX; binX++){ + PlotUtils.getYProjection(binX, histogram); + } + } + + /** + * Print a message if verbose has been enabled. + * + * @param message : message to print. + */ + private void printVerbose(String message){ + if(verbose) + System.out.println(this.getClass().getSimpleName() + ": " + message); + } + } Modified: java/trunk/users/src/main/java/org/hps/users/omoreno/LheToStdhep.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/omoreno/LheToStdhep.java (original) +++ java/trunk/users/src/main/java/org/hps/users/omoreno/LheToStdhep.java Wed Mar 9 11:43:24 2016 @@ -32,248 +32,248 @@ * TODO: Make this converter more generic. */ public class LheToStdhep { - - private static final int N_PARTICLE_INDEX = 0; - private static final int PDG_ID_INDEX = 1; - private static final int STATUS_INDEX = 2; - private static final int FIRST_MOTHER_INDEX = 3; - private static final int SECOND_MOTHER_INDEX = 4; - private static final int FIRST_DAUGHTER_INDEX = 5; - private static final int SECOND_DAUGHTER_INDEX = 6; - - private static double sigmaX = 0.2; - private static double sigmaY = 0.02; - private static double sigmaZ = 0.0; - - private static double offsetX = 0; - private static double offsetY = 0; - private static double offsetZ = 0.03; - - static int eventNumber = 0; - - - public static void main(String[] args) throws IOException{ - - String lheFileName = null; - String stdhepFileName = "output.stdhep"; - - // Instantiate te command line parser - CommandLineParser parser = new PosixParser(); - - // Create the Options - // TODO: Add ability to parse list of files. - // Allow a user to pass tag.gz files - Options options = new Options(); - options.addOption("i", "input", true, "Input LHE file name"); - options.addOption("o", "output", true, "Output Stdhep file name"); - - try { - // Parse the command line arguments - CommandLine line = parser.parse(options, args); - - // If the file is not specified, notify the user and exit the program - if(!line.hasOption("i")){ - System.out.println("Please specify an LHE file to process"); - System.exit(0); - } - lheFileName = line.getOptionValue("i"); - - // Check if the user has specified the output file name and that the - // extension is stdhep. If not, add the extension - if(line.hasOption("o")){ - stdhepFileName = line.getOptionValue("o"); - } - } catch(ParseException e){ - System.out.println("Unexpected exception: " + e.getMessage()); - } - - convertToStdhep(lheFileName, stdhepFileName); - - } - - /** - * - */ - static private void convertToStdhep(String lheFileName, String stdhepFileName) throws IOException{ - List<Element> events = readLhe(lheFileName); - - StdhepWriter writer = new StdhepWriter( - stdhepFileName, - "Import Stdhep Events", - "Imported from LHE generated from MadGraph", - events.size() - ); - writer.setCompatibilityMode(false); - - for(Element event : events){ - writeEvent(event, writer); - } - writer.close(); - } - - /** - * - */ - private static List<Element> readLhe(String lheFileName){ - - // Instantiate the SAX parser used to build the JDOM document - SAXBuilder builder = new SAXBuilder(); - - // Open the lhe file - File lheFile = new File(lheFileName); - - // Parse the lhe file and build the JDOM document - Document document = null; - List<Element> eventNodes = null; - try { - - document = (Document) builder.build(lheFile); - - // Get the root node - Element rootNode = document.getRootElement(); - - // Get a list of all nodes of type event - eventNodes = rootNode.getChildren("event"); - - } catch (JDOMException e) { - e.printStackTrace(); - - } catch (IOException e) { - e.printStackTrace(); - } - - return eventNodes; - } - - /** - * - */ - private static void writeEvent(Element event, StdhepWriter writer) throws IOException{ - - int numberOfParticles = 0; - int particleIndex = 0; - int pdgID[] = null; - int particleStatus[] = null; - int motherParticles[] = null; - int daughterParticles[] = null; - double particleMomentum[] = null; - double particleVertex[] = null; - - Random generator = new Random(); - - eventNumber++; - - System.out.println("#================================================#\n#"); - System.out.println("# Event: " + eventNumber); - - - // Get the text within the event element node. An element node contains - // information describing the event and it's particles. The PDG ID of - // a particle along with it's kinematics is listed on it's own line. - // In order to parse the information for each particle, the text is - // split using the newline character as a delimiter. - String[] eventData = event.getTextTrim().split("\n"); - - for(int datumIndex = 0; datumIndex < eventData.length; datumIndex++){ - - // Split a line by whitespace - String[] eventTokens = eventData[datumIndex].split("\\s+"); - - if(datumIndex == 0){ - - numberOfParticles = Integer.valueOf(eventTokens[N_PARTICLE_INDEX]); - System.out.println("# Number of particles: " + numberOfParticles + "\n#"); - System.out.println("#================================================#"); - - // Reset all arrays used to build the Stdhep event - particleIndex = 0; - particleStatus = new int[numberOfParticles]; - pdgID = new int[numberOfParticles]; - motherParticles = new int[numberOfParticles*2]; - daughterParticles = new int[numberOfParticles*2]; - particleMomentum = new double[numberOfParticles*5]; - particleVertex = new double[numberOfParticles*4]; - - continue; - } - - // Get the PDG ID of the particle - pdgID[particleIndex] = Integer.valueOf(eventTokens[PDG_ID_INDEX]); - - - System.out.println(">>> PDG ID: " + pdgID[particleIndex]); - - // Get the status of the particle (initial state = -1, final state = 1, resonance = 2) - particleStatus[particleIndex] = Integer.valueOf(eventTokens[STATUS_INDEX]); - if(particleStatus[particleIndex] == -1) particleStatus[particleIndex] = 3; - System.out.println(">>>> Particle Status: " + particleStatus[particleIndex]); - - // Get the mothers of a particle. If the particle is a trident electron, then assign it - // a mother value of 10 so it's distinguishable from the beam electron. - if(pdgID[particleIndex] == 611){ - motherParticles[particleIndex*2] = 10; - // If the PDG ID is equal to 611/-611 (trident electron) change it back to 11/-11. - // Otherwise, SLIC won't do anything with them. - pdgID[particleIndex] = 11; - } else if(pdgID[particleIndex] == -611){ - motherParticles[particleIndex*2] = 10; - pdgID[particleIndex] = -11; - } else { - motherParticles[particleIndex*2] = Integer.valueOf(eventTokens[FIRST_MOTHER_INDEX]); - } - motherParticles[particleIndex*2 + 1] = Integer.valueOf(eventTokens[SECOND_MOTHER_INDEX]); - System.out.println(">>>> Mothers: 1) " + motherParticles[particleIndex*2] + " 2) " + motherParticles[particleIndex*2 + 1]); - - // Get the daughter particles - daughterParticles[particleIndex*2] = Integer.valueOf(eventTokens[FIRST_DAUGHTER_INDEX]); - daughterParticles[particleIndex*2 + 1] = Integer.valueOf(eventTokens[SECOND_DAUGHTER_INDEX]); - System.out.println(">>>> Daughter: 1) " + daughterParticles[particleIndex*2] + " 2) " + daughterParticles[particleIndex*2 + 1]); - - // Get the particle momentum, its mass and energy - particleMomentum[particleIndex*5] = Double.valueOf(eventTokens[7]); // px - particleMomentum[particleIndex*5 + 1] = Double.valueOf(eventTokens[8]); // py - particleMomentum[particleIndex*5 + 2] = Double.valueOf(eventTokens[9]); // pz - particleMomentum[particleIndex*5 + 3] = Double.valueOf(eventTokens[10]); // Particle Energy - particleMomentum[particleIndex*5 + 4] = Double.valueOf(eventTokens[11]); // Particle Mass - - // Rotate the particle by 30 mrad around the beam axis - Hep3Vector rotatedMomentum = - rotateToDetector(particleMomentum[particleIndex*5], - particleMomentum[particleIndex*5+1], - particleMomentum[particleIndex*5+1]); - - particleMomentum[particleIndex*5] = rotatedMomentum.x(); - particleMomentum[particleIndex*5 + 1] = rotatedMomentum.y(); - particleMomentum[particleIndex*5 + 2] = rotatedMomentum.z(); - - // Set the origin of the particle - Hep3Vector rotatedVertex = rotateToDetector(sigmaX*generator.nextGaussian() + offsetX, - sigmaY*generator.nextGaussian() + offsetY, - sigmaZ*generator.nextGaussian() + offsetZ); - particleVertex[particleIndex*4] = rotatedVertex.x(); - particleVertex[particleIndex*4+1] = rotatedVertex.y(); - particleVertex[particleIndex*4+2] = rotatedVertex.z(); - particleVertex[particleIndex*4+3] = 0; - - // Increment the particle number - particleIndex++; - - System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); - } - - // Create the Stdhep event and write it - StdhepEvent stdhepEvent = new StdhepEvent(eventNumber, numberOfParticles, particleStatus, - pdgID, motherParticles, daughterParticles, particleMomentum, particleVertex); - writer.writeRecord(stdhepEvent); - } - - /** - * - */ - private static Hep3Vector rotateToDetector(double x, double y, double z){ - IRotation3D rotation = new RotationGeant(0.0, 0.03, 0.0); - Hep3Vector vector = new BasicHep3Vector(x, y, z); - return rotation.rotated(vector); - } + + private static final int N_PARTICLE_INDEX = 0; + private static final int PDG_ID_INDEX = 1; + private static final int STATUS_INDEX = 2; + private static final int FIRST_MOTHER_INDEX = 3; + private static final int SECOND_MOTHER_INDEX = 4; + private static final int FIRST_DAUGHTER_INDEX = 5; + private static final int SECOND_DAUGHTER_INDEX = 6; + + private static double sigmaX = 0.2; + private static double sigmaY = 0.02; + private static double sigmaZ = 0.0; + + private static double offsetX = 0; + private static double offsetY = 0; + private static double offsetZ = 0.03; + + static int eventNumber = 0; + + + public static void main(String[] args) throws IOException{ + + String lheFileName = null; + String stdhepFileName = "output.stdhep"; + + // Instantiate te command line parser + CommandLineParser parser = new PosixParser(); + + // Create the Options + // TODO: Add ability to parse list of files. + // Allow a user to pass tag.gz files + Options options = new Options(); + options.addOption("i", "input", true, "Input LHE file name"); + options.addOption("o", "output", true, "Output Stdhep file name"); + + try { + // Parse the command line arguments + CommandLine line = parser.parse(options, args); + + // If the file is not specified, notify the user and exit the program + if(!line.hasOption("i")){ + System.out.println("Please specify an LHE file to process"); + System.exit(0); + } + lheFileName = line.getOptionValue("i"); + + // Check if the user has specified the output file name and that the + // extension is stdhep. If not, add the extension + if(line.hasOption("o")){ + stdhepFileName = line.getOptionValue("o"); + } + } catch(ParseException e){ + System.out.println("Unexpected exception: " + e.getMessage()); + } + + convertToStdhep(lheFileName, stdhepFileName); + + } + + /** + * + */ + static private void convertToStdhep(String lheFileName, String stdhepFileName) throws IOException{ + List<Element> events = readLhe(lheFileName); + + StdhepWriter writer = new StdhepWriter( + stdhepFileName, + "Import Stdhep Events", + "Imported from LHE generated from MadGraph", + events.size() + ); + writer.setCompatibilityMode(false); + + for(Element event : events){ + writeEvent(event, writer); + } + writer.close(); + } + + /** + * + */ + private static List<Element> readLhe(String lheFileName){ + + // Instantiate the SAX parser used to build the JDOM document + SAXBuilder builder = new SAXBuilder(); + + // Open the lhe file + File lheFile = new File(lheFileName); + + // Parse the lhe file and build the JDOM document + Document document = null; + List<Element> eventNodes = null; + try { + + document = (Document) builder.build(lheFile); + + // Get the root node + Element rootNode = document.getRootElement(); + + // Get a list of all nodes of type event + eventNodes = rootNode.getChildren("event"); + + } catch (JDOMException e) { + e.printStackTrace(); + + } catch (IOException e) { + e.printStackTrace(); + } + + return eventNodes; + } + + /** + * + */ + private static void writeEvent(Element event, StdhepWriter writer) throws IOException{ + + int numberOfParticles = 0; + int particleIndex = 0; + int pdgID[] = null; + int particleStatus[] = null; + int motherParticles[] = null; + int daughterParticles[] = null; + double particleMomentum[] = null; + double particleVertex[] = null; + + Random generator = new Random(); + + eventNumber++; + + System.out.println("#================================================#\n#"); + System.out.println("# Event: " + eventNumber); + + + // Get the text within the event element node. An element node contains + // information describing the event and it's particles. The PDG ID of + // a particle along with it's kinematics is listed on it's own line. + // In order to parse the information for each particle, the text is + // split using the newline character as a delimiter. + String[] eventData = event.getTextTrim().split("\n"); + + for(int datumIndex = 0; datumIndex < eventData.length; datumIndex++){ + + // Split a line by whitespace + String[] eventTokens = eventData[datumIndex].split("\\s+"); + + if(datumIndex == 0){ + + numberOfParticles = Integer.valueOf(eventTokens[N_PARTICLE_INDEX]); + System.out.println("# Number of particles: " + numberOfParticles + "\n#"); + System.out.println("#================================================#"); + + // Reset all arrays used to build the Stdhep event + particleIndex = 0; + particleStatus = new int[numberOfParticles]; + pdgID = new int[numberOfParticles]; + motherParticles = new int[numberOfParticles*2]; + daughterParticles = new int[numberOfParticles*2]; + particleMomentum = new double[numberOfParticles*5]; + particleVertex = new double[numberOfParticles*4]; + + continue; + } + + // Get the PDG ID of the particle + pdgID[particleIndex] = Integer.valueOf(eventTokens[PDG_ID_INDEX]); + + + System.out.println(">>> PDG ID: " + pdgID[particleIndex]); + + // Get the status of the particle (initial state = -1, final state = 1, resonance = 2) + particleStatus[particleIndex] = Integer.valueOf(eventTokens[STATUS_INDEX]); + if(particleStatus[particleIndex] == -1) particleStatus[particleIndex] = 3; + System.out.println(">>>> Particle Status: " + particleStatus[particleIndex]); + + // Get the mothers of a particle. If the particle is a trident electron, then assign it + // a mother value of 10 so it's distinguishable from the beam electron. + if(pdgID[particleIndex] == 611){ + motherParticles[particleIndex*2] = 10; + // If the PDG ID is equal to 611/-611 (trident electron) change it back to 11/-11. + // Otherwise, SLIC won't do anything with them. + pdgID[particleIndex] = 11; + } else if(pdgID[particleIndex] == -611){ + motherParticles[particleIndex*2] = 10; + pdgID[particleIndex] = -11; + } else { + motherParticles[particleIndex*2] = Integer.valueOf(eventTokens[FIRST_MOTHER_INDEX]); + } + motherParticles[particleIndex*2 + 1] = Integer.valueOf(eventTokens[SECOND_MOTHER_INDEX]); + System.out.println(">>>> Mothers: 1) " + motherParticles[particleIndex*2] + " 2) " + motherParticles[particleIndex*2 + 1]); + + // Get the daughter particles + daughterParticles[particleIndex*2] = Integer.valueOf(eventTokens[FIRST_DAUGHTER_INDEX]); + daughterParticles[particleIndex*2 + 1] = Integer.valueOf(eventTokens[SECOND_DAUGHTER_INDEX]); + System.out.println(">>>> Daughter: 1) " + daughterParticles[particleIndex*2] + " 2) " + daughterParticles[particleIndex*2 + 1]); + + // Get the particle momentum, its mass and energy + particleMomentum[particleIndex*5] = Double.valueOf(eventTokens[7]); // px + particleMomentum[particleIndex*5 + 1] = Double.valueOf(eventTokens[8]); // py + particleMomentum[particleIndex*5 + 2] = Double.valueOf(eventTokens[9]); // pz + particleMomentum[particleIndex*5 + 3] = Double.valueOf(eventTokens[10]); // Particle Energy + particleMomentum[particleIndex*5 + 4] = Double.valueOf(eventTokens[11]); // Particle Mass + + // Rotate the particle by 30 mrad around the beam axis + Hep3Vector rotatedMomentum = + rotateToDetector(particleMomentum[particleIndex*5], + particleMomentum[particleIndex*5+1], + particleMomentum[particleIndex*5+1]); + + particleMomentum[particleIndex*5] = rotatedMomentum.x(); + particleMomentum[particleIndex*5 + 1] = rotatedMomentum.y(); + particleMomentum[particleIndex*5 + 2] = rotatedMomentum.z(); + + // Set the origin of the particle + Hep3Vector rotatedVertex = rotateToDetector(sigmaX*generator.nextGaussian() + offsetX, + sigmaY*generator.nextGaussian() + offsetY, + sigmaZ*generator.nextGaussian() + offsetZ); + particleVertex[particleIndex*4] = rotatedVertex.x(); + particleVertex[particleIndex*4+1] = rotatedVertex.y(); + particleVertex[particleIndex*4+2] = rotatedVertex.z(); + particleVertex[particleIndex*4+3] = 0; + + // Increment the particle number + particleIndex++; + + System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); + } + + // Create the Stdhep event and write it + StdhepEvent stdhepEvent = new StdhepEvent(eventNumber, numberOfParticles, particleStatus, + pdgID, motherParticles, daughterParticles, particleMomentum, particleVertex); + writer.writeRecord(stdhepEvent); + } + + /** + * + */ + private static Hep3Vector rotateToDetector(double x, double y, double z){ + IRotation3D rotation = new RotationGeant(0.0, 0.03, 0.0); + Hep3Vector vector = new BasicHep3Vector(x, y, z); + return rotation.rotated(vector); + } } Modified: java/trunk/users/src/main/java/org/hps/users/omoreno/PlotUtils.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/omoreno/PlotUtils.java (original) +++ java/trunk/users/src/main/java/org/hps/users/omoreno/PlotUtils.java Wed Mar 9 11:43:24 2016 @@ -20,71 +20,71 @@ */ public class PlotUtils { - // Default ctor - public PlotUtils(){} + // Default ctor + public PlotUtils(){} - public static IPlotter setupPlotter(String title, int regionX, int regionY){ - IPlotter plotter = AIDA.defaultInstance().analysisFactory().createPlotterFactory().create(title); - plotter.setTitle(title); - - if(regionX < 0 || regionY < 0) throw new RuntimeException("Region dimensions need to be greater than 0!"); - else if(regionX != 0 || regionY != 0) plotter.createRegions(regionX, regionY); - - plotter.style().statisticsBoxStyle().setVisible(false); - plotter.style().dataStyle().errorBarStyle().setVisible(false); - plotter.setParameter("plotterWidth", "800"); - plotter.setParameter("plotterHeight", "800"); - - return plotter; - - } + public static IPlotter setupPlotter(String title, int regionX, int regionY){ + IPlotter plotter = AIDA.defaultInstance().analysisFactory().createPlotterFactory().create(title); + plotter.setTitle(title); + + if(regionX < 0 || regionY < 0) throw new RuntimeException("Region dimensions need to be greater than 0!"); + else if(regionX != 0 || regionY != 0) plotter.createRegions(regionX, regionY); + + plotter.style().statisticsBoxStyle().setVisible(false); + plotter.style().dataStyle().errorBarStyle().setVisible(false); + plotter.setParameter("plotterWidth", "800"); + plotter.setParameter("plotterHeight", "800"); + + return plotter; + + } public static void setup2DRegion(IPlotter plotter, String title, int region, String xTitle, String yTitle, IHistogram2D histo){ - - // Check if the specified region is valid - if(region > plotter.numberOfRegions()) - throw new RuntimeException("Region is invalid! " + title + " contains " + plotter.numberOfRegions() + " regions"); - - plotter.region(region).style().xAxisStyle().setLabel(xTitle); - plotter.region(region).style().xAxisStyle().labelStyle().setFontSize(14); - plotter.region(region).style().yAxisStyle().setLabel(yTitle); - plotter.region(region).style().yAxisStyle().labelStyle().setFontSize(14); - plotter.region(region).style().xAxisStyle().setVisible(true); - plotter.region(region).style().yAxisStyle().setVisible(true); - plotter.region(region).style().setParameter("hist2DStyle", "colorMap"); - plotter.region(region).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); - - if(histo != null) plotter.region(region).plot(histo); + + // Check if the specified region is valid + if(region > plotter.numberOfRegions()) + throw new RuntimeException("Region is invalid! " + title + " contains " + plotter.numberOfRegions() + " regions"); + + plotter.region(region).style().xAxisStyle().setLabel(xTitle); + plotter.region(region).style().xAxisStyle().labelStyle().setFontSize(14); + plotter.region(region).style().yAxisStyle().setLabel(yTitle); + plotter.region(region).style().yAxisStyle().labelStyle().setFontSize(14); + plotter.region(region).style().xAxisStyle().setVisible(true); + plotter.region(region).style().yAxisStyle().setVisible(true); + plotter.region(region).style().setParameter("hist2DStyle", "colorMap"); + plotter.region(region).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); + + if(histo != null) plotter.region(region).plot(histo); } public static void setup2DRegion(IPlotter plotter, String title, int region, String xTitle, String yTitle, ICloud2D cloud, IPlotterStyle style){ - - // Check if the specified region is valid - if(region > plotter.numberOfRegions()) - throw new RuntimeException("Region is invalid! " + title + " contains " + plotter.numberOfRegions() + " regions"); - - plotter.region(region).style().xAxisStyle().setLabel(xTitle); - plotter.region(region).style().xAxisStyle().labelStyle().setFontSize(14); - String[] pars = plotter.region(region).style().xAxisStyle().availableParameters(); - plotter.region(region).style().yAxisStyle().setLabel(yTitle); - plotter.region(region).style().yAxisStyle().labelStyle().setFontSize(14); - plotter.region(region).style().xAxisStyle().setVisible(true); - plotter.region(region).style().yAxisStyle().setVisible(true); - plotter.region(region).style().setParameter("showAsScatterPlot", "true"); - - if(cloud != null) plotter.region(region).plot(cloud, style); + + // Check if the specified region is valid + if(region > plotter.numberOfRegions()) + throw new RuntimeException("Region is invalid! " + title + " contains " + plotter.numberOfRegions() + " regions"); + + plotter.region(region).style().xAxisStyle().setLabel(xTitle); + plotter.region(region).style().xAxisStyle().labelStyle().setFontSize(14); + String[] pars = plotter.region(region).style().xAxisStyle().availableParameters(); + plotter.region(region).style().yAxisStyle().setLabel(yTitle); + plotter.region(region).style().yAxisStyle().labelStyle().setFontSize(14); + plotter.region(region).style().xAxisStyle().setVisible(true); + plotter.region(region).style().yAxisStyle().setVisible(true); + plotter.region(region).style().setParameter("showAsScatterPlot", "true"); + + if(cloud != null) plotter.region(region).plot(cloud, style); } public static void setup1DRegion(IPlotter plotter, String title, int region, String xTitle, IHistogram1D histo){ - - plotter.region(region).style().xAxisStyle().setLabel(xTitle); - plotter.region(region).style().xAxisStyle().labelStyle().setFontSize(14); - plotter.region(region).style().xAxisStyle().setVisible(true); - plotter.region(region).style().dataStyle().fillStyle().setVisible(false); - plotter.region(region).style().dataStyle().lineStyle().setThickness(3); - - if(histo != null) plotter.region(region).plot(histo); + + plotter.region(region).style().xAxisStyle().setLabel(xTitle); + plotter.region(region).style().xAxisStyle().labelStyle().setFontSize(14); + plotter.region(region).style().xAxisStyle().setVisible(true); + plotter.region(region).style().dataStyle().fillStyle().setVisible(false); + plotter.region(region).style().dataStyle().lineStyle().setThickness(3); + + if(histo != null) plotter.region(region).plot(histo); } /** @@ -98,7 +98,7 @@ int ix = (layer - 1) / 2; int iy = 0; if (!((HpsSiSensor) sensor).isTopLayer()){ - iy += 2; + iy += 2; } if (layer % 2 == 0) { iy += 1; @@ -108,35 +108,35 @@ } public static IHistogram1D getYProjection(int binX, IHistogram2D histogram){ - int binsY = histogram.yAxis().bins(); - double yMin = histogram.yAxis().lowerEdge(); - double yMax = histogram.yAxis().upperEdge(); - - IHistogram1D projection - = AIDA.defaultInstance().histogram1D(histogram.title() + "_" + binX, binsY, yMin, yMax); - projection.reset(); - - double dataY = 0; - for(int binY = 0; binY < binsY; binY++){ - dataY = histogram.binEntries(binX, binY); - projection.fill(yMin, dataY); - yMin++; - } - - return projection; + int binsY = histogram.yAxis().bins(); + double yMin = histogram.yAxis().lowerEdge(); + double yMax = histogram.yAxis().upperEdge(); + + IHistogram1D projection + = AIDA.defaultInstance().histogram1D(histogram.title() + "_" + binX, binsY, yMin, yMax); + projection.reset(); + + double dataY = 0; + for(int binY = 0; binY < binsY; binY++){ + dataY = histogram.binEntries(binX, binY); + projection.fill(yMin, dataY); + yMin++; + } + + return projection; } public static double[] fitToGuassian(IHistogram1D histogram){ - - double[] fitParameters = {0, 0}; - IFitter fitter = AIDA.defaultInstance().analysisFactory().createFitFactory().createFitter(); - IFitResult fitResult = fitter.fit(histogram, "g"); - int meanIndex = fitResult.fittedFunction().indexOfParameter("mean"); - fitParameters[0] = fitResult.fittedParameters()[meanIndex]; + + double[] fitParameters = {0, 0}; + IFitter fitter = AIDA.defaultInstance().analysisFactory().createFitFactory().createFitter(); + IFitResult fitResult = fitter.fit(histogram, "g"); + int meanIndex = fitResult.fittedFunction().indexOfParameter("mean"); + fitParameters[0] = fitResult.fittedParameters()[meanIndex]; - int sigmaIndex = fitResult.fittedFunction().indexOfParameter("sigma"); - fitParameters[1] = fitResult.fittedParameters()[sigmaIndex]; - - return fitParameters; + int sigmaIndex = fitResult.fittedFunction().indexOfParameter("sigma"); + fitParameters[1] = fitResult.fittedParameters()[sigmaIndex]; + + return fitParameters; } } Modified: java/trunk/users/src/main/java/org/hps/users/omoreno/ReconstructedParticleChecker.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/omoreno/ReconstructedParticleChecker.java (original) +++ java/trunk/users/src/main/java/org/hps/users/omoreno/ReconstructedParticleChecker.java Wed Mar 9 11:43:24 2016 @@ -29,92 +29,92 @@ * */ public class ReconstructedParticleChecker extends Driver { - - private AIDA aida; - private List<IPlotter> plotters = new ArrayList<IPlotter>(); + + private AIDA aida; + private List<IPlotter> plotters = new ArrayList<IPlotter>(); - IHistogram1D xPositionResidual; - IHistogram1D yPositionResidual; - IHistogram1D zPositionResidual; - IHistogram1D r; - - // Collection Names - private String finalStateParticlesCollectionName = "FinalStateParticles"; - - boolean debug = true; - int plotterIndex = 0; - - public ReconstructedParticleChecker(){} - - protected void detectorChanged(Detector detector){ - super.detectorChanged(detector); - - // Setup AIDA - aida = AIDA.defaultInstance(); - aida.tree().cd("/"); - - plotters.add(PlotUtils.setupPlotter("Track-Cluster Position Residual", 2, 2)); - xPositionResidual = aida.histogram1D("x Residual", 100, -100, 100); - yPositionResidual = aida.histogram1D("y Residual", 100, -100, 100); - zPositionResidual = aida.histogram1D("z Residual", 100, -100, 100); - r = aida.histogram1D("r", 100, -100, 100); - PlotUtils.setup1DRegion(plotters.get(plotterIndex), "x Residual", 0, "delta x [mm]", xPositionResidual); - PlotUtils.setup1DRegion(plotters.get(plotterIndex), "y Residual", 1, "delta y [mm]", yPositionResidual); - PlotUtils.setup1DRegion(plotters.get(plotterIndex), "z Residual", 2, "delta z [mm]", zPositionResidual); - PlotUtils.setup1DRegion(plotters.get(plotterIndex), "r", 3, "r [mm]", r); - - - for(IPlotter plotter : plotters){ - plotter.show(); - } - } - - public void process(EventHeader event){ - - // If the event doesn't contain any final state reconstructed - // particles, skip the event - if(!event.hasCollection(ReconstructedParticle.class, finalStateParticlesCollectionName)){ - this.printDebug("Event does not contain ReconstructedParticles"); - return; - } - - // Get the collections of reconstructed final state particles from the - // event - List<ReconstructedParticle> finalStateParticles - = event.get(ReconstructedParticle.class, finalStateParticlesCollectionName); - - - // Loop over all of the reconstructed particles in the event - for(ReconstructedParticle finalStateParticle : finalStateParticles){ - - // Get the list of clusters from the event - List<Cluster> ecalClusters = finalStateParticle.getClusters(); - this.printDebug("Number of Ecal clusters: " + ecalClusters.size()); - if(ecalClusters.isEmpty()){ - this.printDebug("Number of Ecal clusters: " + ecalClusters.size()); - this.printDebug("List of Ecal cluster is empty ... skipping"); - continue; - } - - // Get the list of tracks from the event - List<Track> tracks = finalStateParticle.getTracks(); - if(tracks.isEmpty()){ - this.printDebug("List of tracks is empty ... skipping"); - continue; - } - - Hep3Vector ecalPosition = new BasicHep3Vector(ecalClusters.get(0).getPosition()); - Hep3Vector trackPositionAtEcal = TrackUtils.extrapolateTrack(tracks.get(0),ecalPosition.z()); - xPositionResidual.fill(trackPositionAtEcal.x() - ecalPosition.x()); - yPositionResidual.fill(trackPositionAtEcal.y() - ecalPosition.y()); - zPositionResidual.fill(trackPositionAtEcal.z() - ecalPosition.z()); - r.fill(VecOp.sub(trackPositionAtEcal, ecalPosition).magnitude()); - } - - } - - private void printDebug(String debugMessage){ - if(debug) - System.out.println(this.getClass().getSimpleName() + ": " + debugMessage); - } + IHistogram1D xPositionResidual; + IHistogram1D yPositionResidual; + IHistogram1D zPositionResidual; + IHistogram1D r; + + // Collection Names + private String finalStateParticlesCollectionName = "FinalStateParticles"; + + boolean debug = true; + int plotterIndex = 0; + + public ReconstructedParticleChecker(){} + + protected void detectorChanged(Detector detector){ + super.detectorChanged(detector); + + // Setup AIDA + aida = AIDA.defaultInstance(); + aida.tree().cd("/"); + + plotters.add(PlotUtils.setupPlotter("Track-Cluster Position Residual", 2, 2)); + xPositionResidual = aida.histogram1D("x Residual", 100, -100, 100); + yPositionResidual = aida.histogram1D("y Residual", 100, -100, 100); + zPositionResidual = aida.histogram1D("z Residual", 100, -100, 100); + r = aida.histogram1D("r", 100, -100, 100); + PlotUtils.setup1DRegion(plotters.get(plotterIndex), "x Residual", 0, "delta x [mm]", xPositionResidual); + PlotUtils.setup1DRegion(plotters.get(plotterIndex), "y Residual", 1, "delta y [mm]", yPositionResidual); + PlotUtils.setup1DRegion(plotters.get(plotterIndex), "z Residual", 2, "delta z [mm]", zPositionResidual); + PlotUtils.setup1DRegion(plotters.get(plotterIndex), "r", 3, "r [mm]", r); + + + for(IPlotter plotter : plotters){ + plotter.show(); + } + } + + public void process(EventHeader event){ + + // If the event doesn't contain any final state reconstructed + // particles, skip the event + if(!event.hasCollection(ReconstructedParticle.class, finalStateParticlesCollectionName)){ + this.printDebug("Event does not contain ReconstructedParticles"); + return; + } + + // Get the collections of reconstructed final state particles from the + // event + List<ReconstructedParticle> finalStateParticles + = event.get(ReconstructedParticle.class, finalStateParticlesCollectionName); + + + // Loop over all of the reconstructed particles in the event + for(ReconstructedParticle finalStateParticle : finalStateParticles){ + + // Get the list of clusters from the event + List<Cluster> ecalClusters = finalStateParticle.getClusters(); + this.printDebug("Number of Ecal clusters: " + ecalClusters.size()); + if(ecalClusters.isEmpty()){ + this.printDebug("Number of Ecal clusters: " + ecalClusters.size()); + this.printDebug("List of Ecal cluster is empty ... skipping"); + continue; + } + + // Get the list of tracks from the event + List<Track> tracks = finalStateParticle.getTracks(); + if(tracks.isEmpty()){ + this.printDebug("List of tracks is empty ... skipping"); + continue; + } + + Hep3Vector ecalPosition = new BasicHep3Vector(ecalClusters.get(0).getPosition()); + Hep3Vector trackPositionAtEcal = TrackUtils.extrapolateTrack(tracks.get(0),ecalPosition.z()); + xPositionResidual.fill(trackPositionAtEcal.x() - ecalPosition.x()); + yPositionResidual.fill(trackPositionAtEcal.y() - ecalPosition.y()); + zPositionResidual.fill(trackPositionAtEcal.z() - ecalPosition.z()); + r.fill(VecOp.sub(trackPositionAtEcal, ecalPosition).magnitude()); + } + + } + + private void printDebug(String debugMessage){ + if(debug) + System.out.println(this.getClass().getSimpleName() + ": " + debugMessage); + } } Modified: java/trunk/users/src/main/java/org/hps/users/omoreno/SharedHitAnalysis.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/omoreno/SharedHitAnalysis.java (original) +++ java/trunk/users/src/main/java/org/hps/users/omoreno/SharedHitAnalysis.java Wed Mar 9 11:43:24 2016 @@ -98,14 +98,14 @@ } - protected void detectorChanged(Detector detector){ - - for (int layer = 1; layer <= 6; layer++) { - - topLayerToStereoHit.put(layer, new ArrayList<TrackerHit>()); - bottomLayerToStereoHit.put(layer, new ArrayList<TrackerHit>()); - } - + protected void detectorChanged(Detector detector){ + + for (int layer = 1; layer <= 6; layer++) { + + topLayerToStereoHit.put(layer, new ArrayList<TrackerHit>()); + bottomLayerToStereoHit.put(layer, new ArrayList<TrackerHit>()); + } + tree = IAnalysisFactory.create().createTreeFactory().create(); histogramFactory = IAnalysisFactory.create().createHistogramFactory(tree); @@ -159,18 +159,18 @@ plotters.get("Track Parameters").region(4).plot(trackPlots.get("tan_lambda"), this.createStyle(1, "", "")); plotters.get("Track Parameters").region(4).plot(trackPlots.get("tan_lambda - shared strip hit"), this.createStyle(2, "", "")); plotters.get("Track Parameters").region(4).plot(trackPlots.get("tan_lambda - l1 Isolation"), this.createStyle(3, "", "")); - - for (IPlotter plotter : plotters.values()) { - plotter.show(); - } - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) + + for (IPlotter plotter : plotters.values()) { + plotter.show(); + } + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) public void process(EventHeader event){ // If the event doesn't have any tracks, skip it - if(!event.hasCollection(Track.class, trackCollectionName)) return; - + if(!event.hasCollection(Track.class, trackCollectionName)) return; + // Get the collection of tracks from the event List<Track> tracks = event.get(Track.class, trackCollectionName); @@ -198,13 +198,13 @@ this.mapStereoHits(stereoHits); // Loop over all of the tracks in the event - for(Track track : tracks){ - - boolean sharedHitTrack = false; + for(Track track : tracks){ + + boolean sharedHitTrack = false; boolean l1Isolation = true; - - // Fill the track parameter plots - + + // Fill the track parameter plots + // Loop through all of the stereo hits associated with a track for (TrackerHit rotatedStereoHit : track.getTrackerHits()) { @@ -277,15 +277,15 @@ trackPlots.get("tan_lambda - l1 Isolation").fill(TrackUtils.getTanLambda(track)); trackPlots.get("chi2 - l1 Isolation").fill(track.getChi2()); } - } - } - + } + } + private void mapStereoHits(List<TrackerHit> stereoHits) { - for (int layer = 1; layer <= 6; layer++) { - topLayerToStereoHit.get(layer).clear(); - bottomLayerToStereoHit.get(layer).clear();; - } + for (int layer = 1; layer <= 6; layer++) { + topLayerToStereoHit.get(layer).clear(); + bottomLayerToStereoHit.get(layer).clear();; + } for (TrackerHit stereoHit : stereoHits) { HpsSiSensor sensor = (HpsSiSensor) ((RawTrackerHit) stereoHit.getRawHits().get(0)).getDetectorElement(); Modified: java/trunk/users/src/main/java/org/hps/users/omoreno/SvtClusterAnalysis.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/omoreno/SvtClusterAnalysis.java (original) +++ java/trunk/users/src/main/java/org/hps/users/omoreno/SvtClusterAnalysis.java Wed Mar 9 11:43:24 2016 @@ -50,28 +50,28 @@ // Plotting ITree tree; IHistogramFactory histogramFactory; - IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory(); - protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>(); - - // All clusters - private Map<String, IHistogram1D> clusterChargePlots = new HashMap<String, IHistogram1D>(); - private Map<String, IHistogram1D> singleHitClusterChargePlots = new HashMap<String, IHistogram1D>(); - private Map<String, IHistogram1D> multHitClusterChargePlots = new HashMap<String, IHistogram1D>(); - private Map<String, IHistogram1D> signalToNoisePlots = new HashMap<String, IHistogram1D>(); - private Map<String, IHistogram1D> singleHitSignalToNoisePlots = new HashMap<String, IHistogram1D>(); - private Map<String, IHistogram1D> multHitSignalToNoisePlots = new HashMap<String, IHistogram1D>(); - private Map<String, IHistogram1D> clusterSizePlots = new HashMap<String, IHistogram1D>(); - private Map<String, IHistogram1D> clusterTimePlots = new HashMap<String, IHistogram1D>(); - private Map<String, IHistogram2D> clusterChargeVsTimePlots = new HashMap<String, IHistogram2D>(); - - // Clusters on track - private Map<String, IHistogram1D> trackClusterChargePlots = new HashMap<String, IHistogram1D>(); - private Map<String, IHistogram1D> trackHitSignalToNoisePlots = new HashMap<String, IHistogram1D>(); - private Map<String, IHistogram1D> trackClusterTimePlots = new HashMap<String, IHistogram1D>(); - private Map<String, IHistogram2D> trackClusterChargeVsMomentum = new HashMap<String, IHistogram2D>(); - private Map<String, IHistogram2D> trackClusterChargeVsCosTheta = new HashMap<String, IHistogram2D>(); - private Map<String, IHistogram2D> trackClusterChargeVsSinPhi = new HashMap<String, IHistogram2D>(); - + IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory(); + protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>(); + + // All clusters + private Map<String, IHistogram1D> clusterChargePlots = new HashMap<String, IHistogram1D>(); + private Map<String, IHistogram1D> singleHitClusterChargePlots = new HashMap<String, IHistogram1D>(); + private Map<String, IHistogram1D> multHitClusterChargePlots = new HashMap<String, IHistogram1D>(); + private Map<String, IHistogram1D> signalToNoisePlots = new HashMap<String, IHistogram1D>(); + private Map<String, IHistogram1D> singleHitSignalToNoisePlots = new HashMap<String, IHistogram1D>(); + private Map<String, IHistogram1D> multHitSignalToNoisePlots = new HashMap<String, IHistogram1D>(); + private Map<String, IHistogram1D> clusterSizePlots = new HashMap<String, IHistogram1D>(); + private Map<String, IHistogram1D> clusterTimePlots = new HashMap<String, IHistogram1D>(); + private Map<String, IHistogram2D> clusterChargeVsTimePlots = new HashMap<String, IHistogram2D>(); + + // Clusters on track + private Map<String, IHistogram1D> trackClusterChargePlots = new HashMap<String, IHistogram1D>(); + private Map<String, IHistogram1D> trackHitSignalToNoisePlots = new HashMap<String, IHistogram1D>(); + private Map<String, IHistogram1D> trackClusterTimePlots = new HashMap<String, IHistogram1D>(); + private Map<String, IHistogram2D> trackClusterChargeVsMomentum = new HashMap<String, IHistogram2D>(); + private Map<String, IHistogram2D> trackClusterChargeVsCosTheta = new HashMap<String, IHistogram2D>(); + private Map<String, IHistogram2D> trackClusterChargeVsSinPhi = new HashMap<String, IHistogram2D>(); + // Detector name private static final String SUBDETECTOR_NAME = "Tracker"; @@ -92,29 +92,29 @@ private int computePlotterRegion(HpsSiSensor sensor) { - if (sensor.getLayerNumber() < 7) { - if (sensor.isTopLayer()) { - return 6*(sensor.getLayerNumber() - 1); - } else { - return 6*(sensor.getLayerNumber() - 1) + 1; - } - } else { - - if (sensor.isTopLayer()) { - if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) { - return 6*(sensor.getLayerNumber() - 7) + 2; - } else { - return 6*(sensor.getLayerNumber() - 7) + 3; - } - } else if (sensor.isBottomLayer()) { - if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) { - return 6*(sensor.getLayerNumber() - 7) + 4; - } else { - return 6*(sensor.getLayerNumber() - 7) + 5; - } - } - } - return -1; + if (sensor.getLayerNumber() < 7) { + if (sensor.isTopLayer()) { + return 6*(sensor.getLayerNumber() - 1); + } else { + return 6*(sensor.getLayerNumber() - 1) + 1; + } + } else { + + if (sensor.isTopLayer()) { + if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) { + return 6*(sensor.getLayerNumber() - 7) + 2; + } else { + return 6*(sensor.getLayerNumber() - 7) + 3; + } + } else if (sensor.isBottomLayer()) { + if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) { + return 6*(sensor.getLayerNumber() - 7) + 4; + } else { + return 6*(sensor.getLayerNumber() - 7) + 5; + } + } + } + return -1; } protected void detectorChanged(Detector detector) { @@ -249,12 +249,12 @@ .get(sensor.getName())); } - for (IPlotter plotter : plotters.values()) { - plotter.show(); - } - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) + for (IPlotter plotter : plotters.values()) { + plotter.show(); + } + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) public void process(EventHeader event) { if (runNumber == -1) runNumber = event.getRunNumber(); @@ -354,18 +354,18 @@ this.mapReconstructedParticlesToTracks(tracks, fsParticles); // Loop over all of the tracks in the event - for(Track track : tracks){ + for(Track track : tracks){ // Calculate the momentum of the track double p = this.getReconstructedParticle(track).getMomentum().magnitude(); - - for (TrackerHit rotatedStereoHit : track.getTrackerHits()) { - - // Get the HelicalTrackHit corresponding to the RotatedHelicalTrackHit - // associated with a track + + for (TrackerHit rotatedStereoHit : track.getTrackerHits()) { + + // Get the HelicalTrackHit corresponding to the RotatedHelicalTrackHit + // associated with a track Set<TrackerHit> trackClusters = stereoHitToClusters.allFrom(hthToRotatedHth.from(rotatedStereoHit)); - - for (TrackerHit trackCluster : trackClusters) { + + for (TrackerHit trackCluster : trackClusters) { // Get the raw hits composing this cluster and use them to calculate the amplitude of the hit double amplitudeSum = 0; @@ -405,9 +405,9 @@ trackClusterChargeVsCosTheta.get(sensor.getName()).fill(TrackUtils.getCosTheta(track), amplitudeSum); trackClusterChargeVsSinPhi.get(sensor.getName()).fill(Math.sin(TrackUtils.getPhi0(track)), amplitudeSum); //trackClusterTimePlots.get(sensor.getName()).fill(trackCluster.time()); - } - } - } + } + } + } } public void endOfData() { Modified: java/trunk/users/src/main/java/org/hps/users/omoreno/SvtDataRates.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/omoreno/SvtDataRates.java (original) +++ java/trunk/users/src/main/java/org/hps/users/omoreno/SvtDataRates.java Wed Mar 9 11:43:24 2016 @@ -12,81 +12,81 @@ public class SvtDataRates extends Driver { - //Map<VOLUMES, double[]> rawHitsPerLayer = new HashMap<VOLUMES, double[]>(); - double[][] rawHitsPerLayer = new double[12][4]; - - //public enum VOLUMES { TOP, BOTTOM }; - - // Collection Names - String rawTrackerHitCollectionName = "SVTRawTrackerHits"; + //Map<VOLUMES, double[]> rawHitsPerLayer = new HashMap<VOLUMES, double[]>(); + double[][] rawHitsPerLayer = new double[12][4]; + + //public enum VOLUMES { TOP, BOTTOM }; + + // Collection Names + String rawTrackerHitCollectionName = "SVTRawTrackerHits"; - double totalEvents = 0; - int totalLayersPerVolume = 0; - - public SvtDataRates(){} - - //static { - // hep.aida.jfree.AnalysisFactory.register(); - //} - - protected void detectorChanged(Detector detector){ - - List<HpsSiSensor> sensors = detector.getDetectorElement().findDescendants(HpsSiSensor.class); - for(HpsSiSensor sensor : sensors){ - this.printDebug("Layer: " + sensor.getLayerNumber() + " Module: " + sensor.getModuleNumber()); - } - totalLayersPerVolume = sensors.size()/2; - //for(VOLUMES volume : VOLUMES.values()){ - // rawHitsPerLayer.put(volume, new double[totalLayersPerVolume]); - //} - } - - protected void process(EventHeader event){ - - if(!event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)){ - return; - } - - totalEvents++; - - List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName); - for(RawTrackerHit rawHit : rawHits){ - - HpsSiSensor sensor = (HpsSiSensor) rawHit.getDetectorElement(); - int layer = sensor.getLayerNumber(); - int module = sensor.getModuleNumber(); - //if(sensor.isTopLayer()){ - // rawHitsPerLayer.get(VOLUMES.TOP)[layer]++; - //} else { - // rawHitsPerLayer.get(VOLUMES.BOTTOM)[layer]++; - //} - - rawHitsPerLayer[layer-1][module]++; - } - } - - protected void endOfData(){ - - //for(VOLUMES volume : VOLUMES.values()){ - //System.out.println("Volume: " + volume); - //System.out.println("Hits per layer per event: "); - //for(int layer = 0; layer < totalLayersPerVolume; layer++){ - // System.out.println("Layer: " + (layer+1) + ": " + rawHitsPerLayer.get(volume)[layer]/totalEvents); - //} - //} - - for(int layer = 0; layer < 12; layer++){ - - for(int module = 0; module < 4; module++){ - System.out.println("Layer: " + layer + - " Module: " + module + - " Hits Per Layer: " + rawHitsPerLayer[layer][module]/totalEvents); - } - } - } + double totalEvents = 0; + int totalLayersPerVolume = 0; + + public SvtDataRates(){} + + //static { + // hep.aida.jfree.AnalysisFactory.register(); + //} + + protected void detectorChanged(Detector detector){ + + List<HpsSiSensor> sensors = detector.getDetectorElement().findDescendants(HpsSiSensor.class); + for(HpsSiSensor sensor : sensors){ + this.printDebug("Layer: " + sensor.getLayerNumber() + " Module: " + sensor.getModuleNumber()); + } + totalLayersPerVolume = sensors.size()/2; + //for(VOLUMES volume : VOLUMES.values()){ + // rawHitsPerLayer.put(volume, new double[totalLayersPerVolume]); + //} + } + + protected void process(EventHeader event){ + + if(!event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)){ + return; + } + + totalEvents++; + + List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName); + for(RawTrackerHit rawHit : rawHits){ + + HpsSiSensor sensor = (HpsSiSensor) rawHit.getDetectorElement(); + int layer = sensor.getLayerNumber(); + int module = sensor.getModuleNumber(); + //if(sensor.isTopLayer()){ + // rawHitsPerLayer.get(VOLUMES.TOP)[layer]++; + //} else { + // rawHitsPerLayer.get(VOLUMES.BOTTOM)[layer]++; + //} + + rawHitsPerLayer[layer-1][module]++; + } + } + + protected void endOfData(){ + + //for(VOLUMES volume : VOLUMES.values()){ + //System.out.println("Volume: " + volume); + //System.out.println("Hits per layer per event: "); + //for(int layer = 0; layer < totalLayersPerVolume; layer++){ + // System.out.println("Layer: " + (layer+1) + ": " + rawHitsPerLayer.get(volume)[layer]/totalEvents); + //} + //} + + for(int layer = 0; layer < 12; layer++){ + + for(int module = 0; module < 4; module++){ + System.out.println("Layer: " + layer + + " Module: " + module + + " Hits Per Layer: " + rawHitsPerLayer[layer][module]/totalEvents); + } + } + } - private void printDebug(String debugMessage){ - System.out.println(this.getClass().getSimpleName() + ": " + debugMessage); - } - + private void printDebug(String debugMessage){ + System.out.println(this.getClass().getSimpleName() + ": " + debugMessage); + } + } Modified: java/trunk/users/src/main/java/org/hps/users/omoreno/SvtHitCorrelations.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/omoreno/SvtHitCorrelations.java (original) +++ java/trunk/users/src/main/java/org/hps/users/omoreno/SvtHitCorrelations.java Wed Mar 9 11:43:24 2016 @@ -28,12 +28,12 @@ */ public class SvtHitCorrelations extends Driver { - // TODO: Add documentation - static { - hep.aida.jfree.AnalysisFactory.register(); - } + // TODO: Add documentation + static { + hep.aida.jfree.AnalysisFactory.register(); + } - // Plotting + // Plotting ITree tree; IHistogramFactory histogramFactory; IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory(); @@ -59,46 +59,46 @@ boolean enableBottomAxialAxial = false; boolean enableBottomAxialStereo = false; - /** - * - */ - public void setEnableTopAxialAxial(boolean enableTopAxialAxial){ - this.enableTopAxialAxial = enableTopAxialAxial; - } - - /** - * - */ - public void setEnableTopAxialStereo(boolean enableTopAxialStereo){ - this.enableTopAxialStereo = enableTopAxialStereo; - } - - /** - * - */ - public void setEnableBottomAxialAxial(boolean enableBottomAxialAxial){ - this.enableBottomAxialAxial = enableBottomAxialAxial; - } - - /** - * - */ - public void setEnableBottomAxialStereo(boolean enableBottomAxialStereo){ - this.enableBottomAxialStereo = enableBottomAxialStereo; - } - - /** - * - */ - private int computePlotterRegion(HpsSiSensor firstSensor, HpsSiSensor secondSensor) { - return (this.getLayerNumber(firstSensor) - 1) + (this.getLayerNumber(secondSensor) - 1)*6; - } - - protected void detectorChanged(Detector detector){ - + /** + * + */ + public void setEnableTopAxialAxial(boolean enableTopAxialAxial){ + this.enableTopAxialAxial = enableTopAxialAxial; + } + + /** + * + */ + public void setEnableTopAxialStereo(boolean enableTopAxialStereo){ + this.enableTopAxialStereo = enableTopAxialStereo; + } + + /** + * + */ + public void setEnableBottomAxialAxial(boolean enableBottomAxialAxial){ + this.enableBottomAxialAxial = enableBottomAxialAxial; + } + + /** + * + */ + public void setEnableBottomAxialStereo(boolean enableBottomAxialStereo){ + this.enableBottomAxialStereo = enableBottomAxialStereo; + } + + /** + * + */ + private int computePlotterRegion(HpsSiSensor firstSensor, HpsSiSensor secondSensor) { + return (this.getLayerNumber(firstSensor) - 1) + (this.getLayerNumber(secondSensor) - 1)*6; + } + + protected void detectorChanged(Detector detector){ + tree = IAnalysisFactory.create().createTreeFactory().create(); histogramFactory = IAnalysisFactory.create().createHistogramFactory(tree); - + sensors = detector.getSubdetector(SUBDETECTOR_NAME).getDetectorElement().findDescendants(HpsSiSensor.class); if (sensors.size() == 0) { @@ -178,55 +178,55 @@ } for (IPlotter plotter : plotters.values()) plotter.show(); - } - - public void process(EventHeader event){ - + } + + public void process(EventHeader event){ + if (runNumber == -1) runNumber = event.getRunNumber(); - - if(!event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) return; - - List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName); - - String plotName = ""; - for(RawTrackerHit firstRawHit : rawHits){ - - HpsSiSensor firstSensor = (HpsSiSensor) firstRawHit.getDetectorElement(); - int firstChannel = firstRawHit.getIdentifierFieldValue("strip"); - - for(RawTrackerHit secondRawHit : rawHits){ - - HpsSiSensor secondSensor = (HpsSiSensor) secondRawHit.getDetectorElement(); - int secondChannel = secondRawHit.getIdentifierFieldValue("strip"); - - if(firstSensor.isTopLayer() && secondSensor.isTopLayer()){ - if(enableTopAxialAxial && firstSensor.isAxial() && secondSensor.isAxial()){ - - plotName = "Top Axial Layer " + this.getLayerNumber(firstSensor) - + " vs Top Axial Layer " + this.getLayerNumber(secondSensor); - topAxialAxialPlots.get(plotName).fill(firstChannel, secondChannel); - } else if (enableTopAxialStereo && firstSensor.isAxial() && secondSensor.isStereo()) { - - plotName = "Top Axial Layer " + this.getLayerNumber(firstSensor) - + " vs Top Stereo Layer " + this.getLayerNumber(secondSensor); - topAxialStereoPlots.get(plotName).fill(firstChannel, secondChannel); - } - } else if (firstSensor.isBottomLayer() && secondSensor.isBottomLayer()) { - if(enableBottomAxialAxial && firstSensor.isAxial() && secondSensor.isAxial()){ - - plotName = "Bottom Axial Layer " + this.getLayerNumber(firstSensor) - + " vs Bottom Axial Layer " + this.getLayerNumber(secondSensor); - bottomAxialAxialPlots.get(plotName).fill(firstChannel, secondChannel); - } else if (enableBottomAxialStereo && firstSensor.isAxial() && secondSensor.isStereo()) { - - plotName = "Bottom Axial Layer " + this.getLayerNumber(firstSensor) - + " vs Bottom Stereo Layer " + this.getLayerNumber(secondSensor); - bottomAxialStereoPlots.get(plotName).fill(firstChannel, secondChannel); - } - } - } - } - } + + if(!event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) return; + + List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName); + + String plotName = ""; + for(RawTrackerHit firstRawHit : rawHits){ + + HpsSiSensor firstSensor = (HpsSiSensor) firstRawHit.getDetectorElement(); + int firstChannel = firstRawHit.getIdentifierFieldValue("strip"); + + for(RawTrackerHit secondRawHit : rawHits){ + + HpsSiSensor secondSensor = (HpsSiSensor) secondRawHit.getDetectorElement(); + int secondChannel = secondRawHit.getIdentifierFieldValue("strip"); + + if(firstSensor.isTopLayer() && secondSensor.isTopLayer()){ + if(enableTopAxialAxial && firstSensor.isAxial() && secondSensor.isAxial()){ + + plotName = "Top Axial Layer " + this.getLayerNumber(firstSensor) + + " vs Top Axial Layer " + this.getLayerNumber(secondSensor); + topAxialAxialPlots.get(plotName).fill(firstChannel, secondChannel); + } else if (enableTopAxialStereo && firstSensor.isAxial() && secondSensor.isStereo()) { + + plotName = "Top Axial Layer " + this.getLayerNumber(firstSensor) + + " vs Top Stereo Layer " + this.getLayerNumber(secondSensor); + topAxialStereoPlots.get(plotName).fill(firstChannel, secondChannel); + } + } else if (firstSensor.isBottomLayer() && secondSensor.isBottomLayer()) { + if(enableBottomAxialAxial && firstSensor.isAxial() && secondSensor.isAxial()){ + + plotName = "Bottom Axial Layer " + this.getLayerNumber(firstSensor) + + " vs Bottom Axial Layer " + this.getLayerNumber(secondSensor); + bottomAxialAxialPlots.get(plotName).fill(firstChannel, secondChannel); + } else if (enableBottomAxialStereo && firstSensor.isAxial() && secondSensor.isStereo()) { + + plotName = "Bottom Axial Layer " + this.getLayerNumber(firstSensor) + + " vs Bottom Stereo Layer " + this.getLayerNumber(secondSensor); + bottomAxialStereoPlots.get(plotName).fill(firstChannel, secondChannel); + } + } + } + } + } public void endOfData() { @@ -240,12 +240,12 @@ e.printStackTrace(); } } - - - private int getLayerNumber(HpsSiSensor sensor) { - return (int) Math.ceil(((double) sensor.getLayerNumber())/2); - } - + + + private int getLayerNumber(HpsSiSensor sensor) { + return (int) Math.ceil(((double) sensor.getLayerNumber())/2); + } + IPlotterStyle createStyle(String xAxisTitle, String yAxisTitle) { // Create a default style @@ -279,5 +279,5 @@ return style; } - + } Modified: java/trunk/users/src/main/java/org/hps/users/omoreno/SvtQA.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/omoreno/SvtQA.java (original) +++ java/trunk/users/src/main/java/org/hps/users/omoreno/SvtQA.java Wed Mar 9 11:43:24 2016 @@ -54,7 +54,7 @@ int channelNumber = 0; int plotterIndex = 0; - int apvNumber = 0; + int apvNumber = 0; double totalNumberEvents = 0; double totalNumberOfRawHitEvents = 0; double[] totalTopSamples = new double[6]; @@ -210,7 +210,7 @@ * */ public void setEnableTotalNumberOfHitsPlots(boolean enableTotalNumberOfHitsPlots){ - this.enableTotalNumberOfHitsPlots = enableTotalNumberOfHitsPlots; + this.enableTotalNumberOfHitsPlots = enableTotalNumberOfHitsPlots; } /** @@ -391,13 +391,13 @@ } if(enableTotalNumberOfHitsPlots){ - title = "Total Number of RawTrackerHits"; - plotters.add(PlotUtils.setupPlotter(title, 0, 0)); - plotters.get(plotterIndex).style().statisticsBoxStyle().setVisible(true); - histo1D = aida.histogram1D(title, 100, 0, 75); - histos1D.add(histo1D); - PlotUtils.setup1DRegion(plotters.get(plotterIndex), title, 0, "Number of RawTrackerHits", histo1D); - plotterIndex++; + title = "Total Number of RawTrackerHits"; + plotters.add(PlotUtils.setupPlotter(title, 0, 0)); + plotters.get(plotterIndex).style().statisticsBoxStyle().setVisible(true); + histo1D = aida.histogram1D(title, 100, 0, 75); + histos1D.add(histo1D); + PlotUtils.setup1DRegion(plotters.get(plotterIndex), title, 0, "Number of RawTrackerHits", histo1D); + plotterIndex++; } for(IPlotter plotter : plotters) plotter.show(); @@ -488,7 +488,7 @@ aida.histogram1D(title).fill(sample); } title = "Shaper Signal Amplitude"; - aida.histogram1D(title).fill(fit.getAmp()); + aida.histogram1D(title).fill(fit.getAmp()); System.out.println("Amplitude: " + fit.getAmp()); title="t0"; aida.histogram1D(title).fill(fit.getT0()); @@ -595,9 +595,9 @@ topSamples[sampleN-1] += samples[sampleN-1] - sensor.getPedestal(channel, sampleN-1); } else{ - aida.histogram2D("APV Sample Number vs Sample Amplitude - Bottom").fill(sampleN, samples[sampleN-1] - sensor.getPedestal(channel, sampleN-1)); - totalBottomSamples[sampleN-1]++; - bottomSamples[sampleN-1] += samples[sampleN - 1] - sensor.getPedestal(channel, sampleN-1); + aida.histogram2D("APV Sample Number vs Sample Amplitude - Bottom").fill(sampleN, samples[sampleN-1] - sensor.getPedestal(channel, sampleN-1)); + totalBottomSamples[sampleN-1]++; + bottomSamples[sampleN-1] += samples[sampleN - 1] - sensor.getPedestal(channel, sampleN-1); } } } @@ -659,7 +659,7 @@ int channel = ((RawTrackerHit) hts.rawhits().get(0)).getIdentifierFieldValue("strip"); if(sensorName.equals("all")){ - aida.histogram2D(sensor.getName() + " - t0 Resolution vs Channel #").fill(channel, meanT0 - hts.time()); + aida.histogram2D(sensor.getName() + " - t0 Resolution vs Channel #").fill(channel, meanT0 - hts.time()); } else { if(sensor.getName().equals(sensorName)){ aida.histogram1D(sensorName + " - Hit Time Resolution").fill(meanT0 - hts.time()); @@ -675,67 +675,67 @@ @Override public void endOfData(){ - String title; - - - + String title; + + + String plotName; - if(enableOccupancy){ - for(HpsSiSensor sensor : sensors){ - title = sensor.getName() + " - Occupancy"; - // Scale the hits per channel by the number of events - aida.histogram1D(title).scale(1/totalNumberEvents); - - // Write the occupancies to a file - if(sensor.isTopLayer()){ - plotName = outputFile + "_top_"; - } else { - plotName = outputFile + "_bottom_"; - } - - if(sensor.getLayerNumber() < 10){ - plotName += "0" + sensor.getLayerNumber() + ".dat"; - } else { - plotName += sensor.getLayerNumber() + ".dat"; - } - - // Open the output files stream - if(plotName != null){ - try{ - output = new BufferedWriter(new FileWriter(plotName)); - for(int channel = 0; channel < 640; channel++){ - output.write(channel + " " + aida.histogram1D(title).binHeight(channel) + "\n"); - } - output.close(); - } catch(Exception e) { - System.out.println(this.getClass().getSimpleName() + " :Error! " + e.getMessage()); - } - } - } - } - - if(enableT0Plots){ - int bins = aida.histogram1D(sensorName + " - Hit Time Resolution").axis().bins(); - for(int bin = 0; bin < bins; bin++){ - System.out.println(bin + " " + aida.histogram1D(sensorName + " - Hit Time Resolution").binHeight(bin)); - } - } - - - /* + if(enableOccupancy){ for(HpsSiSensor sensor : sensors){ - if(outputFile != null && sensorName.equals(sensor.getName())){ - try{ - for(int channel = 0; channel < 639; channel++){ - output.write(channel + " " + this.getOccupancy(sensor, channel) + "\n"); - } - output.close(); - } catch(IOException e){ - System.out.println(this.getClass().getSimpleName() + ": Error! " + e.getMessage()); - } - } - - System.out.println("%===================================================================%"); + title = sensor.getName() + " - Occupancy"; + // Scale the hits per channel by the number of events + aida.histogram1D(title).scale(1/totalNumberEvents); + + // Write the occupancies to a file + if(sensor.isTopLayer()){ + plotName = outputFile + "_top_"; + } else { + plotName = outputFile + "_bottom_"; + } + + if(sensor.getLayerNumber() < 10){ + plotName += "0" + sensor.getLayerNumber() + ".dat"; + } else { + plotName += sensor.getLayerNumber() + ".dat"; + } + + // Open the output files stream + if(plotName != null){ + try{ + output = new BufferedWriter(new FileWriter(plotName)); + for(int channel = 0; channel < 640; channel++){ + output.write(channel + " " + aida.histogram1D(title).binHeight(channel) + "\n"); + } + output.close(); + } catch(Exception e) { + System.out.println(this.getClass().getSimpleName() + " :Error! " + e.getMessage()); + } + } + } + } + + if(enableT0Plots){ + int bins = aida.histogram1D(sensorName + " - Hit Time Resolution").axis().bins(); + for(int bin = 0; bin < bins; bin++){ + System.out.println(bin + " " + aida.histogram1D(sensorName + " - Hit Time Resolution").binHeight(bin)); + } + } + + + /* + for(HpsSiSensor sensor : sensors){ + if(outputFile != null && sensorName.equals(sensor.getName())){ + try{ + for(int channel = 0; channel < 639; channel++){ + output.write(channel + " " + this.getOccupancy(sensor, channel) + "\n"); + } + output.close(); + } catch(IOException e){ + System.out.println(this.getClass().getSimpleName() + ": Error! " + e.getMessage()); + } + } + + System.out.println("%===================================================================%"); System.out.println(sensor.getName() + " Bad Channels"); System.out.println("%===================================================================%"); for(int index = 0; index < 640; index++){ @@ -769,21 +769,21 @@ } if(enableSamples){ - double sigma = 0; - double[] topMean = new double[6]; - double[] bottomMean = new double[6]; - + double sigma = 0; + double[] topMean = new double[6]; + double[] bottomMean = new double[6]; + System.out.println("%===================================================================% \n"); - for(int index = 0; index < topSamples.length; index++){ - topMean[index] = topSamples[index]/totalTopSamples[index]; - System.out.println("Top sample " + index + " mean: " + topMean[index]); - } - + for(int index = 0; index < topSamples.length; index++){ + topMean[index] = topSamples[index]/totalTopSamples[index]; + System.out.println("Top sample " + index + " mean: " + topMean[index]); + } + System.out.println("\n%===================================================================% \n"); - for(int index = 0; index < bottomSamples.length; index++){ - bottomMean[index] = bottomSamples[index]/totalBottomSamples[index]; - System.out.println("Bottom sample " + index + " mean: " + bottomMean[index]); - } + for(int index = 0; index < bottomSamples.length; index++){ + bottomMean[index] = bottomSamples[index]/totalBottomSamples[index]; + System.out.println("Bottom sample " + index + " mean: " + bottomMean[index]); + } System.out.println("\n%===================================================================% \n"); } } Modified: java/trunk/users/src/main/java/org/hps/users/omoreno/SvtTrackAnalysis.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/omoreno/SvtTrackAnalysis.java (original) +++ java/trunk/users/src/main/java/org/hps/users/omoreno/SvtTrackAnalysis.java Wed Mar 9 11:43:24 2016 @@ -46,8 +46,8 @@ IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory(); protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>(); private Map<String, IHistogram1D> trackPlots = new HashMap<String, IHistogram1D>(); - private Map<String, IHistogram1D> clusterChargePlots = new HashMap<String, IHistogram1D>(); - private Map<String, IHistogram1D> clusterSizePlots = new HashMap<String, IHistogram1D>(); + private Map<String, IHistogram1D> clusterChargePlots = new HashMap<String, IHistogram1D>(); + private Map<String, IHistogram1D> clusterSizePlots = new HashMap<String, IHistogram1D>(); private List<HpsSiSensor> sensors; private Map<RawTrackerHit, LCRelation> fittedRawTrackerHitMap @@ -64,67 +64,67 @@ private int runNumber = -1; - int npositive = 0; - int nnegative = 0; - double ntracks = 0; - double ntracksTop = 0; - double ntracksBottom = 0; - double nTwoTracks = 0; - double nevents = 0; - - double d0Cut = -9999; - - // Flags - boolean electronCut = false; - boolean positronCut = false; - + int npositive = 0; + int nnegative = 0; + double ntracks = 0; + double ntracksTop = 0; + double ntracksBottom = 0; + double nTwoTracks = 0; + double nevents = 0; + + double d0Cut = -9999; + + // Flags + boolean electronCut = false; + boolean positronCut = false; + /** * Default Constructor */ - public SvtTrackAnalysis(){ - } - - public void setEnableElectronCut(boolean electronCut) { - this.electronCut = electronCut; - } - - public void setEnablePositronCut(boolean positronCut) { - this.positronCut = positronCut; - } - - public void setD0Cut(double d0Cut) { - this.d0Cut = d0Cut; - } - - private int computePlotterRegion(HpsSiSensor sensor) { - - if (sensor.getLayerNumber() < 7) { - if (sensor.isTopLayer()) { - return 6*(sensor.getLayerNumber() - 1); - } else { - return 6*(sensor.getLayerNumber() - 1) + 1; - } - } else { - - if (sensor.isTopLayer()) { - if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) { - return 6*(sensor.getLayerNumber() - 7) + 2; - } else { - return 6*(sensor.getLayerNumber() - 7) + 3; - } - } else if (sensor.isBottomLayer()) { - if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) { - return 6*(sensor.getLayerNumber() - 7) + 4; - } else { - return 6*(sensor.getLayerNumber() - 7) + 5; - } - } - } - return -1; - } - - protected void detectorChanged(Detector detector){ - + public SvtTrackAnalysis(){ + } + + public void setEnableElectronCut(boolean electronCut) { + this.electronCut = electronCut; + } + + public void setEnablePositronCut(boolean positronCut) { + this.positronCut = positronCut; + } + + public void setD0Cut(double d0Cut) { + this.d0Cut = d0Cut; + } + + private int computePlotterRegion(HpsSiSensor sensor) { + + if (sensor.getLayerNumber() < 7) { + if (sensor.isTopLayer()) { + return 6*(sensor.getLayerNumber() - 1); + } else { + return 6*(sensor.getLayerNumber() - 1) + 1; + } + } else { + + if (sensor.isTopLayer()) { + if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) { + return 6*(sensor.getLayerNumber() - 7) + 2; + } else { + return 6*(sensor.getLayerNumber() - 7) + 3; + } + } else if (sensor.isBottomLayer()) { + if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) { + return 6*(sensor.getLayerNumber() - 7) + 4; + } else { + return 6*(sensor.getLayerNumber() - 7) + 5; + } + } + } + return -1; + } + + protected void detectorChanged(Detector detector){ + tree = IAnalysisFactory.create().createTreeFactory().create(); histogramFactory = IAnalysisFactory.create().createHistogramFactory(tree); @@ -195,66 +195,66 @@ } - //--- Track Extrapolation ---// - //---------------------------// - /*plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Ecal")); - plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Ecal", 200, -350, 350, 200, -100, 100)); - plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap"); - plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); + //--- Track Extrapolation ---// + //---------------------------// + /*plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Ecal")); + plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Ecal", 200, -350, 350, 200, -100, 100)); + plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap"); + plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); plotters.get(nPlotters).style(); - nPlotters++; + nPlotters++; plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Harp")); plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Harp", 200, -200, 200, 100, -50, 50)); - plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap"); - plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); - plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); - nPlotters++; + plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap"); + plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); + plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); + nPlotters++; plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Ecal: curvature < 0")); plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Ecal: curvature < 0",200, -350, 350, 200, -100, 100)); - plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap"); - plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); - plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); - nPlotters++; - + plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap"); + plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); + plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); + nPlotters++; + plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Harp: curvature < 0")); plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Harp: curvature < 0", 200, -200, 200, 100, -50, 50)); - plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap"); - plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); - plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); - nPlotters++; - + plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap"); + plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); + plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); + nPlotters++; + plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Ecal: curvature > 0")); plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Ecal: curvature > 0", 200, -350, 350, 200, -100, 100)); - plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap"); - plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); - plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); - nPlotters++; - + plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap"); + plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); + plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); + nPlotters++; + plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Harp: curvature > 0")); plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Harp: curvature > 0", 200, -200, 200, 100, -50, 50)); - plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap"); - plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); - plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); - nPlotters++; - - plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Ecal: Two Tracks")); - plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Ecal: Two Tracks", 200, -350, 350, 200, -100, 100)); - plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap"); - plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); + plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap"); + plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); + plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); + nPlotters++; + + plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Ecal: Two Tracks")); + plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Ecal: Two Tracks", 200, -350, 350, 200, -100, 100)); + plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap"); + plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); plotters.get(nPlotters).style(); - nPlotters++; + nPlotters++; plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Harp: Two Tracks")); plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Harp: Two Tracks", 200, -200, 200, 100, -50, 50)); - plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap"); - plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); - plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); - nPlotters++; - + plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap"); + plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); + plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); + nPlotters++; + //--- Momentum ---// //----------------// @@ -262,99 +262,99 @@ plotters.get(nPlotters).region(0).plot(aida.histogram1D("Px", 100, 0, 5)); plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false); - nPlotters++; + nPlotters++; plotters.add(aida.analysisFactory().createPlotterFactory().create("Py")); plotters.get(nPlotters).region(0).plot(aida.histogram1D("Py", 100, 0, 5)); plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false); - nPlotters++; + nPlotters++; plotters.add(aida.analysisFactory().createPlotterFactory().create("Pz")); plotters.get(nPlotters).region(0).plot(aida.histogram1D("Pz", 100, 0, 5)); plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false); - nPlotters++; - + nPlotters++; + plotters.add(aida.analysisFactory().createPlotterFactory().create("Px: C > 0")); plotters.get(nPlotters).region(0).plot(aida.histogram1D("Px: C > 0", 100, 0, 5)); plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false); - nPlotters++; + nPlotters++; plotters.add(aida.analysisFactory().createPlotterFactory().create("Py: C > 0")); plotters.get(nPlotters).region(0).plot(aida.histogram1D("Py: C > 0", 100, 0, 5)); plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false); - nPlotters++; + nPlotters++; plotters.add(aida.analysisFactory().createPlotterFactory().create("Pz: C > 0")); plotters.get(nPlotters).region(0).plot(aida.histogram1D("Pz: C > 0", 100, 0, 5)); plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false); - nPlotters++; - + nPlotters++; + plotters.add(aida.analysisFactory().createPlotterFactory().create("Px: C < 0")); plotters.get(nPlotters).region(0).plot(aida.histogram1D("Px: C < 0", 100, 0, 5)); plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false); - nPlotters++; + nPlotters++; plotters.add(aida.analysisFactory().createPlotterFactory().create("Py: C < 0")); plotters.get(nPlotters).region(0).plot(aida.histogram1D("Py: C < 0", 100, 0, 5)); plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false); - nPlotters++; + nPlotters++; plotters.add(aida.analysisFactory().createPlotterFactory().create("Pz: C < 0")); plotters.get(nPlotters).region(0).plot(aida.histogram1D("Pz: C < 0", 100, 0, 5)); plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false); - nPlotters++; - + nPlotters++; + plotters.add(aida.analysisFactory().createPlotterFactory().create("Px: Two Tracks")); plotters.get(nPlotters).region(0).plot(aida.histogram1D("Px: Two Tracks", 100, 0, 5)); plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false); - nPlotters++; + nPlotters++; plotters.add(aida.analysisFactory().createPlotterFactory().create("E over P")); plotters.get(nPlotters).region(0).plot(aida.histogram1D("E over P", 100, 0, 5)); plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); plotters.get(nPlotters).style().dataStyle().errorBarStyle().setVisible(false); - nPlotters++; - - plotters.add(aida.analysisFactory().createPlotterFactory().create("E versus P")); - plotters.get(nPlotters).region(0).plot(aida.histogram2D("E versus P", 100, 0, 1500, 100, 0, 4000)); - plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap"); - plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); - plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); - nPlotters++; + nPlotters++; + + plotters.add(aida.analysisFactory().createPlotterFactory().create("E versus P")); + plotters.get(nPlotters).region(0).plot(aida.histogram2D("E versus P", 100, 0, 1500, 100, 0, 4000)); + plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap"); + plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); + plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); + nPlotters++; //--- Cluster Matching ---// //------------------------// plotters.add(aida.analysisFactory().createPlotterFactory().create("XY Difference between Ecal Cluster and Track Position")); plotters.get(nPlotters).region(0).plot(aida.histogram2D("XY Difference between Ecal Cluster and Track Position", 200, -200, 200, 100, -50, 50)); - plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap"); - plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); - plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); - nPlotters++; - */ - for (IPlotter plotter : plotters.values()) { - plotter.show(); - } - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) + plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap"); + plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); + plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false); + nPlotters++; + */ + for (IPlotter plotter : plotters.values()) { + plotter.show(); + } + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) public void process(EventHeader event){ - nevents++; - - // Get the run number from the event + nevents++; + + // Get the run number from the event if (runNumber == -1) runNumber = event.getRunNumber(); - + // If the event doesn't have any tracks, skip it - if(!event.hasCollection(Track.class, trackCollectionName)) return; - + if(!event.hasCollection(Track.class, trackCollectionName)) return; + // Get the collection of tracks from the event List<Track> tracks = event.get(Track.class, trackCollectionName); @@ -386,17 +386,17 @@ trackPlots.get("Number of tracks").fill(tracks.size()); // Loop over all of the tracks in the event - for(Track track : tracks){ - - if (TrackUtils.getR(track) < 0 && electronCut) continue; - - if (TrackUtils.getR(track) > 0 && positronCut) continue; - - if (d0Cut != -9999 && Math.abs(TrackUtils.getDoca(track)) < d0Cut) continue; - - trackPlots.get("Track charge").fill(TrackUtils.getR(track), 1); - - // Fill the track parameter plots + for(Track track : tracks){ + + if (TrackUtils.getR(track) < 0 && electronCut) continue; + + if (TrackUtils.getR(track) > 0 && positronCut) continue; + + if (d0Cut != -9999 && Math.abs(TrackUtils.getDoca(track)) < d0Cut) continue; + + trackPlots.get("Track charge").fill(TrackUtils.getR(track), 1); + + // Fill the track parameter plots trackPlots.get("doca").fill(TrackUtils.getDoca(track)); trackPlots.get("z0").fill(TrackUtils.getZ0(track)); trackPlots.get("sin(phi0)").fill(TrackUtils.getPhi0(track)); @@ -444,8 +444,8 @@ } } } - - public void endOfData() { + + public void endOfData() { String rootFile = "run" + runNumber + "_track_analysis.root"; RootFileStore store = new RootFileStore(rootFile); @@ -473,7 +473,7 @@ fittedRawTrackerHitMap.put(FittedRawTrackerHit.getRawTrackerHit(fittedHit), fittedHit); } } - + /** * * @param rawHit @@ -489,101 +489,101 @@ /* ntracks++; - Hep3Vector positionEcal = TrackUtils.getTrackPositionAtEcal(track); - System.out.println("Position at Ecal: " + positionEcal); - Hep3Vector positionConverter = TrackUtils.extrapolateTrack(track,-700); - - aida.histogram2D("Track Position at Ecal").fill(positionEcal.y(), positionEcal.z()); - aida.histogram2D("Track Position at Harp").fill(positionConverter.y(), positionConverter.z()); - - if(positionEcal.z() > 0 ) ntracksTop++; - else if(positionEcal.z() < 0) ntracksBottom++; + Hep3Vector positionEcal = TrackUtils.getTrackPositionAtEcal(track); + System.out.println("Position at Ecal: " + positionEcal); + Hep3Vector positionConverter = TrackUtils.extrapolateTrack(track,-700); + + aida.histogram2D("Track Position at Ecal").fill(positionEcal.y(), positionEcal.z()); + aida.histogram2D("Track Position at Harp").fill(positionConverter.y(), positionConverter.z()); + + if(positionEcal.z() > 0 ) ntracksTop++; + else if(positionEcal.z() < 0) ntracksBottom++; */ - - + + /* - aida.histogram1D("Px").fill(track.getTrackStates().get(0).getMomentum()[0]); - aida.histogram1D("Py").fill(track.getTrackStates().get(0).getMomentum()[1]); - aida.histogram1D("Pz").fill(track.getTrackStates().get(0).getMomentum()[2]); - aida.histogram1D("ChiSquared").fill(track.getChi2()); - - if(Math.signum(TrackUtils.getR(track)) < 0){ - aida.histogram2D("Track Position at Ecal: curvature < 0").fill(positionEcal.y(), positionEcal.z()); - aida.histogram2D("Track Position at Harp: curvature < 0").fill(positionConverter.y(), positionConverter.z()); - aida.histogram1D("Px: C < 0").fill(track.getTrackStates().get(0).getMomentum()[0]); - aida.histogram1D("Py: C < 0").fill(track.getTrackStates().get(0).getMomentum()[1]); - aida.histogram1D("Pz: C < 0").fill(track.getTrackStates().get(0).getMomentum()[2]); - nnegative++; - } else if(Math.signum(TrackUtils.getR(track)) > 0){ - aida.histogram2D("Track Position at Ecal: curvature > 0").fill(positionEcal.y(), positionEcal.z()); - aida.histogram2D("Track Position at Harp: curvature > 0").fill(positionConverter.y(), positionConverter.z()); - aida.histogram1D("Px: C > 0").fill(track.getTrackStates().get(0).getMomentum()[0]); - aida.histogram1D("Px: C > 0").fill(track.getTrackStates().get(0).getMomentum()[1]); - aida.histogram1D("Px: C > 0").fill(track.getTrackStates().get(0).getMomentum()[2]); - npositive++; - } - - if(tracks.size() > 1){ - aida.histogram2D("Track Position at Ecal: Two Tracks").fill(positionEcal.y(), positionEcal.z()); - aida.histogram2D("Track Position at Harp: Two Tracks").fill(positionConverter.y(), positionConverter.z()); - aida.histogram1D("Px: Two Tracks").fill(track.getTrackStates().get(0).getMomentum()[0]); - if(tracks.size() == 2) nTwoTracks++; - } - - trackToEcalPosition.put(positionEcal, track); - ecalPos.add(positionEcal); - } - - if(!event.hasCollection(Cluster.class, "EcalClusters")) return; - List<Cluster> clusters = event.get(Cluster.class, "EcalClusters"); - - - for(Hep3Vector ecalP : ecalPos){ - double xdiff = 1000; - double ydiff = 1000; - for(Cluster cluster : clusters){ - double xd = ecalP.y() - cluster.getPosition()[0]; - double yd = ecalP.z() - cluster.getPosition()[1]; - if(yd < ydiff){ - xdiff = xd; - ydiff = yd; - trackToCluster.put(trackToEcalPosition.get(ecalP),cluster); - } - } - clusters.remove(trackToCluster.get(trackToEcalPosition.get(ecalP))); - aida.histogram2D("XY Difference between Ecal Cluster and Track Position").fill(xdiff, ydiff); - } - - for(Map.Entry<Track, Cluster> entry : trackToCluster.entrySet()){ - double Energy = entry.getValue().getEnergy(); - Track track = entry.getKey(); - double pTotal = Math.sqrt(track.getTrackStates().get(0).getMomentum()[0]*track.getTrackStates().get(0).getMomentum()[0] + track.getTrackStates().get(0).getMomentum()[1]*track.getTrackStates().get(0).getMomentum()[1] + track.getTrackStates().get(0).getMomentum()[2]*track.getTrackStates().get(0).getMomentum()[2]); - - double ep = Energy/(pTotal*1000); - - System.out.println("Energy: " + Energy + "P: " + pTotal + " E over P: " + ep); - - aida.histogram1D("E over P").fill(ep); - aida.histogram2D("E versus P").fill(Energy, pTotal*1000); - } - - for(Cluster cluster : clusters){ - double[] clusterPosition = cluster.getPosition(); - - System.out.println("Cluster Position: [" + clusterPosition[0] + ", " + clusterPosition[1] + ", " + clusterPosition[2]+ "]"); - } - - double ratio = nnegative/npositive; - System.out.println("Ratio of Negative to Position Tracks: " + ratio); - - double tracksRatio = ntracks/nevents; - double tracksTopRatio = ntracksTop/nevents; - double tracksBottomRatio = ntracksBottom/nevents; - double twoTrackRatio = nTwoTracks/nevents; - System.out.println("Number of tracks per event: " + tracksRatio); - System.out.println("Number of top tracks per event: " + tracksTopRatio); - System.out.println("Number of bottom tracks per event: " + tracksBottomRatio); - System.out.println("Number of two track events: " + twoTrackRatio); - }*/ - - + aida.histogram1D("Px").fill(track.getTrackStates().get(0).getMomentum()[0]); + aida.histogram1D("Py").fill(track.getTrackStates().get(0).getMomentum()[1]); + aida.histogram1D("Pz").fill(track.getTrackStates().get(0).getMomentum()[2]); + aida.histogram1D("ChiSquared").fill(track.getChi2()); + + if(Math.signum(TrackUtils.getR(track)) < 0){ + aida.histogram2D("Track Position at Ecal: curvature < 0").fill(positionEcal.y(), positionEcal.z()); + aida.histogram2D("Track Position at Harp: curvature < 0").fill(positionConverter.y(), positionConverter.z()); + aida.histogram1D("Px: C < 0").fill(track.getTrackStates().get(0).getMomentum()[0]); + aida.histogram1D("Py: C < 0").fill(track.getTrackStates().get(0).getMomentum()[1]); + aida.histogram1D("Pz: C < 0").fill(track.getTrackStates().get(0).getMomentum()[2]); + nnegative++; + } else if(Math.signum(TrackUtils.getR(track)) > 0){ + aida.histogram2D("Track Position at Ecal: curvature > 0").fill(positionEcal.y(), positionEcal.z()); + aida.histogram2D("Track Position at Harp: curvature > 0").fill(positionConverter.y(), positionConverter.z()); + aida.histogram1D("Px: C > 0").fill(track.getTrackStates().get(0).getMomentum()[0]); + aida.histogram1D("Px: C > 0").fill(track.getTrackStates().get(0).getMomentum()[1]); + aida.histogram1D("Px: C > 0").fill(track.getTrackStates().get(0).getMomentum()[2]); + npositive++; + } + + if(tracks.size() > 1){ + aida.histogram2D("Track Position at Ecal: Two Tracks").fill(positionEcal.y(), positionEcal.z()); + aida.histogram2D("Track Position at Harp: Two Tracks").fill(positionConverter.y(), positionConverter.z()); + aida.histogram1D("Px: Two Tracks").fill(track.getTrackStates().get(0).getMomentum()[0]); + if(tracks.size() == 2) nTwoTracks++; + } + + trackToEcalPosition.put(positionEcal, track); + ecalPos.add(positionEcal); + } + + if(!event.hasCollection(Cluster.class, "EcalClusters")) return; + List<Cluster> clusters = event.get(Cluster.class, "EcalClusters"); + + + for(Hep3Vector ecalP : ecalPos){ + double xdiff = 1000; + double ydiff = 1000; + for(Cluster cluster : clusters){ + double xd = ecalP.y() - cluster.getPosition()[0]; + double yd = ecalP.z() - cluster.getPosition()[1]; + if(yd < ydiff){ + xdiff = xd; + ydiff = yd; + trackToCluster.put(trackToEcalPosition.get(ecalP),cluster); + } + } + clusters.remove(trackToCluster.get(trackToEcalPosition.get(ecalP))); + aida.histogram2D("XY Difference between Ecal Cluster and Track Position").fill(xdiff, ydiff); + } + + for(Map.Entry<Track, Cluster> entry : trackToCluster.entrySet()){ + double Energy = entry.getValue().getEnergy(); + Track track = entry.getKey(); + double pTotal = Math.sqrt(track.getTrackStates().get(0).getMomentum()[0]*track.getTrackStates().get(0).getMomentum()[0] + track.getTrackStates().get(0).getMomentum()[1]*track.getTrackStates().get(0).getMomentum()[1] + track.getTrackStates().get(0).getMomentum()[2]*track.getTrackStates().get(0).getMomentum()[2]); + + double ep = Energy/(pTotal*1000); + + System.out.println("Energy: " + Energy + "P: " + pTotal + " E over P: " + ep); + + aida.histogram1D("E over P").fill(ep); + aida.histogram2D("E versus P").fill(Energy, pTotal*1000); + } + + for(Cluster cluster : clusters){ + double[] clusterPosition = cluster.getPosition(); + + System.out.println("Cluster Position: [" + clusterPosition[0] + ", " + clusterPosition[1] + ", " + clusterPosition[2]+ "]"); + } + + double ratio = nnegative/npositive; + System.out.println("Ratio of Negative to Position Tracks: " + ratio); + + double tracksRatio = ntracks/nevents; + double tracksTopRatio = ntracksTop/nevents; + double tracksBottomRatio = ntracksBottom/nevents; + double twoTrackRatio = nTwoTracks/nevents; + System.out.println("Number of tracks per event: " + tracksRatio); + System.out.println("Number of top tracks per event: " + tracksTopRatio); + System.out.println("Number of bottom tracks per event: " + tracksBottomRatio); + System.out.println("Number of two track events: " + twoTrackRatio); + }*/ + + Modified: java/trunk/users/src/main/java/org/hps/users/omoreno/SvtTrackRecoEfficiency.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/omoreno/SvtTrackRecoEfficiency.java (original) +++ java/trunk/users/src/main/java/org/hps/users/omoreno/SvtTrackRecoEfficiency.java Wed Mar 9 11:43:24 2016 @@ -100,7 +100,7 @@ * Set the name of the file to output efficiency data to */ public void setEfficiencyOutputFile(String efficiencyOutputFile){ - this.efficiencyOutputFile = efficiencyOutputFile; + this.efficiencyOutputFile = efficiencyOutputFile; } /** @@ -124,31 +124,31 @@ * @param message : debug message */ private void printDebug(String message){ - if(debug){ - System.out.println(this.getClass().getSimpleName() + ": " + message); - } + if(debug){ + System.out.println(this.getClass().getSimpleName() + ": " + message); + } } /** * */ protected void detectorChanged(Detector detector){ - super.detectorChanged(detector); - - sensors = detector.getSubdetector("Tracker").getDetectorElement().findDescendants(HpsSiSensor.class); - + super.detectorChanged(detector); + + sensors = detector.getSubdetector("Tracker").getDetectorElement().findDescendants(HpsSiSensor.class); + // setup AIDA aida = AIDA.defaultInstance(); aida.tree().cd("/"); // Open the output file stream if(efficiencyOutputFile != null && momentumOutputFile != null){ - try{ - efficiencyOutput = new BufferedWriter(new FileWriter(efficiencyOutputFile)); + try{ + efficiencyOutput = new BufferedWriter(new FileWriter(efficiencyOutputFile)); momentumOutput = new BufferedWriter(new FileWriter(momentumOutputFile)); - } catch(Exception e){ - System.out.println(this.getClass().getSimpleName() + ": Error! " + e.getMessage()); - } + } catch(Exception e){ + System.out.println(this.getClass().getSimpleName() + ": Error! " + e.getMessage()); + } } // Get the total number of SVT layers @@ -164,28 +164,28 @@ } if(trackingEfficiencyPlots){ - plotters.add(PlotUtils.setupPlotter("Track Momentum", 0, 0)); - histo1D.add(aida.histogram1D("Momentum - Reconstructed Tracks", 14, 0, 5.6)); - PlotUtils.setup1DRegion(plotters.get(plotterIndex), "Reconstructed Tracks", 0, "Momentum [GeV]", histo1D.get(histo1DIndex)); + plotters.add(PlotUtils.setupPlotter("Track Momentum", 0, 0)); + histo1D.add(aida.histogram1D("Momentum - Reconstructed Tracks", 14, 0, 5.6)); + PlotUtils.setup1DRegion(plotters.get(plotterIndex), "Reconstructed Tracks", 0, "Momentum [GeV]", histo1D.get(histo1DIndex)); histo1DIndex++; histo1D.add(aida.histogram1D("Momentum - Findable Tracks", 14, 0, 5.6)); - PlotUtils.setup1DRegion(plotters.get(plotterIndex), "Findable Tracks", 0, "Momentum [GeV]", histo1D.get(histo1DIndex)); - plotterIndex++; - histo1DIndex++; + PlotUtils.setup1DRegion(plotters.get(plotterIndex), "Findable Tracks", 0, "Momentum [GeV]", histo1D.get(histo1DIndex)); + plotterIndex++; + histo1DIndex++; } for(IPlotter plotter : plotters){ - plotter.show(); + plotter.show(); } } private String samplesToString(short[] samples){ - String sampleList = "[ "; - for(short sample : samples){ - sampleList += Short.toString(sample) + ", "; - } - sampleList += "]"; - return sampleList; + String sampleList = "[ "; + for(short sample : samples){ + sampleList += Short.toString(sample) + ", "; + } + sampleList += "]"; + return sampleList; } /** @@ -196,7 +196,7 @@ @Override protected void process(EventHeader event){ - // For now, only look at events with a single track + // For now, only look at events with a single track if(event.get(Track.class, trackCollectionName).size() > 1) return; eventNumber++; @@ -204,46 +204,46 @@ if(!event.hasCollection(SimTrackerHit.class, simTrackerHitCollectionName)) return; List<SimTrackerHit> simTrackerHits = event.get(SimTrackerHit.class, simTrackerHitCollectionName); this.printDebug("\nEvent " + eventNumber + " contains " + simTrackerHits.size() + " SimTrackerHits"); - // Loop through all SimTrackerHits and confirm that a corresponding RawTrackerHit was created - for(SimTrackerHit simTrackHit : simTrackerHits){ - - this.printDebug("SimTrackerHit Layer Number: " + simTrackHit.getLayerNumber()); - } + // Loop through all SimTrackerHits and confirm that a corresponding RawTrackerHit was created + for(SimTrackerHit simTrackHit : simTrackerHits){ + + this.printDebug("SimTrackerHit Layer Number: " + simTrackHit.getLayerNumber()); + } // Get the list of RawTrackerHits and add them to the sensor readout List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName); String volume; for(RawTrackerHit rawHit : rawHits){ - HpsSiSensor sensor = (HpsSiSensor) rawHit.getDetectorElement(); - if(sensor.isTopLayer()){ - volume = "Top Volume "; - } else { - volume = "Bottom Volume "; - } - this.printDebug(volume + "RawTrackerHit Channel #: " + rawHit.getIdentifierFieldValue("strip") + " Layer Number: " + rawHit.getLayerNumber() - + " Samples: " + samplesToString(rawHit.getADCValues())); + HpsSiSensor sensor = (HpsSiSensor) rawHit.getDetectorElement(); + if(sensor.isTopLayer()){ + volume = "Top Volume "; + } else { + volume = "Bottom Volume "; + } + this.printDebug(volume + "RawTrackerHit Channel #: " + rawHit.getIdentifierFieldValue("strip") + " Layer Number: " + rawHit.getLayerNumber() + + " Samples: " + samplesToString(rawHit.getADCValues())); ((HpsSiSensor) rawHit.getDetectorElement()).getReadout().addHit(rawHit); } if(event.hasCollection(SiTrackerHit.class, siTrackerHitCollectionName)){ - List<SiTrackerHit> hitlist = event.get(SiTrackerHit.class, siTrackerHitCollectionName); - for(SiTrackerHit siTrackerHit : hitlist){ - this.printDebug("Cluster is comprised by the following raw hits:"); - for(RawTrackerHit rawHit : siTrackerHit.getRawHits()){ - this.printDebug("RawTrackerHit Channel #: " + rawHit.getIdentifierFieldValue("strip") + " Layer Number: " + rawHit.getLayerNumber()); - } - } + List<SiTrackerHit> hitlist = event.get(SiTrackerHit.class, siTrackerHitCollectionName); + for(SiTrackerHit siTrackerHit : hitlist){ + this.printDebug("Cluster is comprised by the following raw hits:"); + for(RawTrackerHit rawHit : siTrackerHit.getRawHits()){ + this.printDebug("RawTrackerHit Channel #: " + rawHit.getIdentifierFieldValue("strip") + " Layer Number: " + rawHit.getLayerNumber()); + } + } } // Get the MC Particles associated with the SimTrackerHits List<MCParticle> mcParticles = event.getMCParticles(); if(debug){ - String particleList = "[ "; - for(MCParticle mcParticle : mcParticles){ - particleList += mcParticle.getPDGID() + ", "; - } - particleList += "]"; - this.printDebug("MC Particles: " + particleList); + String particleList = "[ "; + for(MCParticle mcParticle : mcParticles){ + particleList += mcParticle.getPDGID() + ", "; + } + particleList += "]"; + this.printDebug("MC Particles: " + particleList); } // Get the magnetic field @@ -264,10 +264,10 @@ Set<SimTrackerHit> trackerHits = findable.getSimTrackerHits(mcParticle); if(this.isSameSvtVolume(trackerHits)){ if(debug){ - this.printDebug("Track is findable"); - this.printDebug("MC particle momentum: " + mcParticle.getMomentum().toString()); - } - + this.printDebug("Track is findable"); + this.printDebug("MC particle momentum: " + mcParticle.getMomentum().toString()); + } + findableTracks++; trackIsFindable = true; } @@ -303,8 +303,8 @@ if(!mcParticles.isEmpty() && trackingEfficiencyPlots){ // If the list still contains MC Particles, a matching track wasn't found - this.printDebug("No matching track found"); - + this.printDebug("No matching track found"); + // Check that all stereoHits were correctly assigned to an MCParticle for(MCParticle mcParticle : mcParticles){ @@ -326,7 +326,7 @@ // Determine if the MC particle passed through the top or bottom SVT volume for(SimTrackerHit simHit : simHits){ - HpsSiSensor sensor = (HpsSiSensor) simHit.getDetectorElement(); + HpsSiSensor sensor = (HpsSiSensor) simHit.getDetectorElement(); if(sensor.isTopLayer()){ this.printDebug("MC Particle passed through the top layer"); isTopTrack = true; @@ -376,7 +376,7 @@ { int volumeIndex = 0; for(SimTrackerHit simTrackerHit : simTrackerHits){ - HpsSiSensor sensor = (HpsSiSensor) simTrackerHit.getDetectorElement(); + HpsSiSensor sensor = (HpsSiSensor) simTrackerHit.getDetectorElement(); if(sensor.isTopLayer()) volumeIndex++; else volumeIndex--; } @@ -454,24 +454,24 @@ @Override public void endOfData() { - + if(trackingEfficiencyPlots && efficiencyOutputFile != null && momentumOutputFile != null){ - try{ - int bins = aida.histogram1D("Momentum - Findable Tracks").axis().bins(); - for(int index = 0; index < bins; index++){ - if(aida.histogram1D("Momentum - Reconstructed Tracks").binEntries(index) == 0) efficiencyOutput.write(index + " " + 0 + "\n"); - else efficiencyOutput.write(index + " " + aida.histogram1D("Momentum - Reconstructed Tracks").binEntries(index) + "\n"); - + try{ + int bins = aida.histogram1D("Momentum - Findable Tracks").axis().bins(); + for(int index = 0; index < bins; index++){ + if(aida.histogram1D("Momentum - Reconstructed Tracks").binEntries(index) == 0) efficiencyOutput.write(index + " " + 0 + "\n"); + else efficiencyOutput.write(index + " " + aida.histogram1D("Momentum - Reconstructed Tracks").binEntries(index) + "\n"); + if(aida.histogram1D("Momentum - Findable Tracks").binEntries(index) == 0) momentumOutput.write(index + " " + 0 + "\n"); - else momentumOutput.write(index + " " + aida.histogram1D("Momentum - Findable Tracks").binEntries(index) + "\n"); - } - efficiencyOutput.close(); + else momentumOutput.write(index + " " + aida.histogram1D("Momentum - Findable Tracks").binEntries(index) + "\n"); + } + efficiencyOutput.close(); momentumOutput.close(); - } catch(IOException e){ - System.out.println(this.getClass().getSimpleName() + ": Error! " + e.getMessage()); - } + } catch(IOException e){ + System.out.println(this.getClass().getSimpleName() + ": Error! " + e.getMessage()); + } } - + System.out.println("%===============================================================%"); System.out.println("%============== Track Reconstruction Efficiencies ==============%"); System.out.println("%===============================================================%\n%"); Modified: java/trunk/users/src/main/java/org/hps/users/omoreno/TestRunTrackReconEfficiency.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/omoreno/TestRunTrackReconEfficiency.java (original) +++ java/trunk/users/src/main/java/org/hps/users/omoreno/TestRunTrackReconEfficiency.java Wed Mar 9 11:43:24 2016 @@ -60,18 +60,18 @@ boolean topTrigger = false; // Collection Names - String stereoHitCollectionName = "HelicalTrackHits"; - String trackCollectionName = "MatchedTracks"; - String ecalClustersCollectionName = "EcalClusters"; - String triggerDataCollectionName = "TriggerBank"; + String stereoHitCollectionName = "HelicalTrackHits"; + String trackCollectionName = "MatchedTracks"; + String ecalClustersCollectionName = "EcalClusters"; + String triggerDataCollectionName = "TriggerBank"; // Plots IHistogram1D findableTrackMomentum; IHistogram1D totalTrackMomentum; - IHistogram1D xPositionResidual; - IHistogram1D yPositionResidual; - IHistogram1D zPositionResidual; - IHistogram1D r; + IHistogram1D xPositionResidual; + IHistogram1D yPositionResidual; + IHistogram1D zPositionResidual; + IHistogram1D r; /** * Dflt Ctor @@ -89,7 +89,7 @@ * */ public void setThresholdEnergy(double thresholdEnergy){ - this.thresholdEnergy = thresholdEnergy; + this.thresholdEnergy = thresholdEnergy; } public void setClusterEnergyDifference(double energyDifference){ @@ -117,15 +117,15 @@ plotterIndex++; // Create plot for diffence in track and cluster position - plotters.add(PlotUtils.setupPlotter("Track-Cluster Position Residual", 2, 2)); - xPositionResidual = aida.histogram1D("x Residual", 100, -100, 100); - yPositionResidual = aida.histogram1D("y Residual", 100, -100, 100); - zPositionResidual = aida.histogram1D("z Residual", 100, -100, 100); - r = aida.histogram1D("r", 100, -100, 100); - PlotUtils.setup1DRegion(plotters.get(plotterIndex), "x Residual", 0, "delta x [mm]", xPositionResidual); - PlotUtils.setup1DRegion(plotters.get(plotterIndex), "y Residual", 1, "delta y [mm]", yPositionResidual); - PlotUtils.setup1DRegion(plotters.get(plotterIndex), "z Residual", 2, "delta z [mm]", zPositionResidual); - PlotUtils.setup1DRegion(plotters.get(plotterIndex), "r", 3, "r [mm]", r); + plotters.add(PlotUtils.setupPlotter("Track-Cluster Position Residual", 2, 2)); + xPositionResidual = aida.histogram1D("x Residual", 100, -100, 100); + yPositionResidual = aida.histogram1D("y Residual", 100, -100, 100); + zPositionResidual = aida.histogram1D("z Residual", 100, -100, 100); + r = aida.histogram1D("r", 100, -100, 100); + PlotUtils.setup1DRegion(plotters.get(plotterIndex), "x Residual", 0, "delta x [mm]", xPositionResidual); + PlotUtils.setup1DRegion(plotters.get(plotterIndex), "y Residual", 1, "delta y [mm]", yPositionResidual); + PlotUtils.setup1DRegion(plotters.get(plotterIndex), "z Residual", 2, "delta z [mm]", zPositionResidual); + PlotUtils.setup1DRegion(plotters.get(plotterIndex), "r", 3, "r [mm]", r); plotterIndex++; // Show all of the plotters @@ -154,138 +154,138 @@ // If the event has a single Ecal cluster satisfying the threshold cut, // check if there is a track that is well matched to the cluster if(ecalClusters.size() == 1){ - Cluster ecalCluster = ecalClusters.get(0); - - // If the cluster is above the energy threshold, then the track should - // be findable - if(!isClusterAboveEnergyThreshold(ecalCluster)) return; - findableSingleTracks++; - - double[] clusterPosition = ecalCluster.getPosition(); - - if(clusterPosition[0] > 0 && clusterPosition[1] > 0) findableSingleTracksQuad1++; - else if(clusterPosition[0] < 0 && clusterPosition[1] > 0) findableSingleTracksQuad2++; - else if(clusterPosition[0] < 0 && clusterPosition[1] < 0) findableSingleTracksQuad3++; - else if(clusterPosition[0] > 0 && clusterPosition[1] < 0) findableSingleTracksQuad4++; - - if(!isClusterMatchedToTrack(ecalCluster, tracks)) return; - foundSingleTracks++; - - if(clusterPosition[0] > 0 && clusterPosition[1] > 0) foundSingleTracksQuad1++; - else if(clusterPosition[0] < 0 && clusterPosition[1] > 0) foundSingleTracksQuad2++; - else if(clusterPosition[0] < 0 && clusterPosition[1] < 0) foundSingleTracksQuad3++; - else if(clusterPosition[0] > 0 && clusterPosition[1] < 0) foundSingleTracksQuad4++; + Cluster ecalCluster = ecalClusters.get(0); + + // If the cluster is above the energy threshold, then the track should + // be findable + if(!isClusterAboveEnergyThreshold(ecalCluster)) return; + findableSingleTracks++; + + double[] clusterPosition = ecalCluster.getPosition(); + + if(clusterPosition[0] > 0 && clusterPosition[1] > 0) findableSingleTracksQuad1++; + else if(clusterPosition[0] < 0 && clusterPosition[1] > 0) findableSingleTracksQuad2++; + else if(clusterPosition[0] < 0 && clusterPosition[1] < 0) findableSingleTracksQuad3++; + else if(clusterPosition[0] > 0 && clusterPosition[1] < 0) findableSingleTracksQuad4++; + + if(!isClusterMatchedToTrack(ecalCluster, tracks)) return; + foundSingleTracks++; + + if(clusterPosition[0] > 0 && clusterPosition[1] > 0) foundSingleTracksQuad1++; + else if(clusterPosition[0] < 0 && clusterPosition[1] > 0) foundSingleTracksQuad2++; + else if(clusterPosition[0] < 0 && clusterPosition[1] < 0) foundSingleTracksQuad3++; + else if(clusterPosition[0] > 0 && clusterPosition[1] < 0) foundSingleTracksQuad4++; } // Only look at events which have two Ecal cluster if(ecalClusters.size() != 2) return; // Check that the Ecal clusters are in opposite Ecal volumes. If - // they don't, skip the event. - if(!hasClustersInOppositeVolumes(ecalClusters)){ - this.printDebug("Ecal clusters are not in opposite volumes"); - return; - } - nOppositeVolume++; + // they don't, skip the event. + if(!hasClustersInOppositeVolumes(ecalClusters)){ + this.printDebug("Ecal clusters are not in opposite volumes"); + return; + } + nOppositeVolume++; - // Check that the Ecal clusters lie within some pre-defined window. If - // they don't, skip the event. + // Check that the Ecal clusters lie within some pre-defined window. If + // they don't, skip the event. if(!isClusterWithinWindow(ecalClusters.get(0)) || !isClusterWithinWindow(ecalClusters.get(1))){ - this.printDebug("Ecal cluster falls outside of window."); - return; + this.printDebug("Ecal cluster falls outside of window."); + return; } nWithinWindow++; // Check that the Ecal clusters are above the threshold energy. If // they don't, skip the event. if(!isClusterAboveEnergyThreshold(ecalClusters.get(0)) || !isClusterAboveEnergyThreshold(ecalClusters.get(1))){ - this.printDebug("Ecal cluster energies are below threshold."); - return; - } - nAboveThreshold++; + this.printDebug("Ecal cluster energies are below threshold."); + return; + } + nAboveThreshold++; - // Check that the difference between the Ecal cluster energies is + // Check that the difference between the Ecal cluster energies is // reasonable - double energyDiff = Math.abs(ecalClusters.get(0).getEnergy() - ecalClusters.get(1).getEnergy()); - if(energyDiff > energyDifference){ - this.printDebug("The energy difference between the two clusters is too great."); - return; - } + double energyDiff = Math.abs(ecalClusters.get(0).getEnergy() - ecalClusters.get(1).getEnergy()); + if(energyDiff > energyDifference){ + this.printDebug("The energy difference between the two clusters is too great."); + return; + } // Check if the event contains a collection of tracks. If it doesn't, // move on to the next event. if(!event.hasCollection(Track.class, trackCollectionName)){ - this.printDebug("Event doesn't contain a collection of tracks!"); - return; + this.printDebug("Event doesn't contain a collection of tracks!"); + return; } // If there are no tracks in the collection, move on to the next event. if(tracks.isEmpty()){ - this.printDebug("Event doesn't contain any tracks!"); - return; + this.printDebug("Event doesn't contain any tracks!"); + return; } // Sort the tracks by SVT volume - topTracks = new ArrayList<Track>(); - botTracks = new ArrayList<Track>(); + topTracks = new ArrayList<Track>(); + botTracks = new ArrayList<Track>(); for(Track track : tracks){ - if(track.getTrackStates().get(0).getZ0() > 0) topTracks.add(track); - else if(track.getTrackStates().get(0).getZ0() < 0) botTracks.add(track); - } - - // Get the trigger information from the event - List<GenericObject> triggerData = event.get(GenericObject.class, triggerDataCollectionName); - GenericObject triggerDatum = triggerData.get(0); - if(triggerDatum.getIntVal(4) > 0){ - this.printDebug("Ecal triggered by top cluster"); - topTrigger = true; - } else if(triggerDatum.getIntVal(5) > 0){ - this.printDebug("Ecal triggered by bottom cluster"); - topTrigger = false; - } - - // Match a track to the trigger cluster - Cluster matchedCluster = null; - for(Cluster ecalCluster : ecalClusters){ - if(ecalCluster.getPosition()[1] > 0 && topTrigger){ - if(!isClusterMatchedToTrack(ecalCluster, topTracks)){ - this.printDebug("Trigger cluster-track match was not found."); - return; - } - matchedCluster = ecalCluster; - findableBottomTracks++; - break; - } else if( ecalCluster.getPosition()[1] < 0 && !topTrigger){ - if(!isClusterMatchedToTrack(ecalCluster, botTracks)){ - this.printDebug("Trigger cluster-track match was not found."); - return; - } - matchedCluster = ecalCluster; - findableTopTracks++; - break; - } - } - if(matchedCluster != null) ecalClusters.remove(matchedCluster); - nTrigClusterTrackMatch++; - + if(track.getTrackStates().get(0).getZ0() > 0) topTracks.add(track); + else if(track.getTrackStates().get(0).getZ0() < 0) botTracks.add(track); + } + + // Get the trigger information from the event + List<GenericObject> triggerData = event.get(GenericObject.class, triggerDataCollectionName); + GenericObject triggerDatum = triggerData.get(0); + if(triggerDatum.getIntVal(4) > 0){ + this.printDebug("Ecal triggered by top cluster"); + topTrigger = true; + } else if(triggerDatum.getIntVal(5) > 0){ + this.printDebug("Ecal triggered by bottom cluster"); + topTrigger = false; + } + + // Match a track to the trigger cluster + Cluster matchedCluster = null; + for(Cluster ecalCluster : ecalClusters){ + if(ecalCluster.getPosition()[1] > 0 && topTrigger){ + if(!isClusterMatchedToTrack(ecalCluster, topTracks)){ + this.printDebug("Trigger cluster-track match was not found."); + return; + } + matchedCluster = ecalCluster; + findableBottomTracks++; + break; + } else if( ecalCluster.getPosition()[1] < 0 && !topTrigger){ + if(!isClusterMatchedToTrack(ecalCluster, botTracks)){ + this.printDebug("Trigger cluster-track match was not found."); + return; + } + matchedCluster = ecalCluster; + findableTopTracks++; + break; + } + } + if(matchedCluster != null) ecalClusters.remove(matchedCluster); + nTrigClusterTrackMatch++; + // If the cluster passes all requirements, then there is likely a track // associated with it findableTracks++; // Now check if a track is associated with the non-trigger cluster if(topTrigger){ - if(!isClusterMatchedToTrack(ecalClusters.get(0), botTracks)){ - this.printDebug("Non trigger cluster-track match was not found."); - return; - } - totalBottomTracks++; + if(!isClusterMatchedToTrack(ecalClusters.get(0), botTracks)){ + this.printDebug("Non trigger cluster-track match was not found."); + return; + } + totalBottomTracks++; } else if(!topTrigger){ - if(!isClusterMatchedToTrack(ecalClusters.get(0), topTracks)){ - this.printDebug("Non trigger cluster-track match was not found."); - return; - } - totalTopTracks++; + if(!isClusterMatchedToTrack(ecalClusters.get(0), topTracks)){ + this.printDebug("Non trigger cluster-track match was not found."); + return; + } + totalTopTracks++; } ++totalTracks; } @@ -305,67 +305,67 @@ * */ private boolean isClusterWithinWindow(Cluster clusterPosition){ - return true; + return true; } /** * */ private boolean isClusterAboveEnergyThreshold(Cluster ecalCluster){ - if(ecalCluster.getEnergy() > thresholdEnergy) return true; - return false; + if(ecalCluster.getEnergy() > thresholdEnergy) return true; + return false; } /** * */ private boolean hasClustersInOppositeVolumes(List<Cluster> ecalClusters){ - this.printPosition(ecalClusters.get(0).getPosition()); - this.printPosition(ecalClusters.get(1).getPosition()); - if((ecalClusters.get(0).getPosition()[1] > 0 && ecalClusters.get(1).getPosition()[1] < 0) - || (ecalClusters.get(0).getPosition()[1] < 0 && ecalClusters.get(1).getPosition()[1] > 0)){ - return true; - } - return false; + this.printPosition(ecalClusters.get(0).getPosition()); + this.printPosition(ecalClusters.get(1).getPosition()); + if((ecalClusters.get(0).getPosition()[1] > 0 && ecalClusters.get(1).getPosition()[1] < 0) + || (ecalClusters.get(0).getPosition()[1] < 0 && ecalClusters.get(1).getPosition()[1] > 0)){ + return true; + } + return false; } /** * */ private boolean isClusterMatchedToTrack(Cluster cluster, List<Track> tracks){ - Hep3Vector clusterPos = new BasicHep3Vector(cluster.getPosition()); - double rMax = Double.MAX_VALUE; - Track matchedTrack = null; - for(Track track : tracks){ - - Hep3Vector trkPosAtShowerMax = TrackUtils.extrapolateTrack(track,clusterPos.z()); - if(Double.isNaN(trkPosAtShowerMax.x()) || Double.isNaN(trkPosAtShowerMax.y())){ - this.printDebug("Invalid track position"); - return false; - } - this.printDebug("Track position at shower max: " + trkPosAtShowerMax.toString()); + Hep3Vector clusterPos = new BasicHep3Vector(cluster.getPosition()); + double rMax = Double.MAX_VALUE; + Track matchedTrack = null; + for(Track track : tracks){ + + Hep3Vector trkPosAtShowerMax = TrackUtils.extrapolateTrack(track,clusterPos.z()); + if(Double.isNaN(trkPosAtShowerMax.x()) || Double.isNaN(trkPosAtShowerMax.y())){ + this.printDebug("Invalid track position"); + return false; + } + this.printDebug("Track position at shower max: " + trkPosAtShowerMax.toString()); - // Find the distance between the track position at shower - // max and the cluster position - double r = VecOp.sub(trkPosAtShowerMax, clusterPos).magnitude(); - this.printDebug("Distance between Ecal cluster and track position at shower max: " + r + " mm"); - - // Check if the track is the closest to the cluster. If it is, then - // save the track and contineu looping over all other tracks - if (r < rMax /*&& r <= maxTrackClusterDistance*/) { - rMax = r; - matchedTrack = track; - } - } - if(matchedTrack != null) return true; - return false; + // Find the distance between the track position at shower + // max and the cluster position + double r = VecOp.sub(trkPosAtShowerMax, clusterPos).magnitude(); + this.printDebug("Distance between Ecal cluster and track position at shower max: " + r + " mm"); + + // Check if the track is the closest to the cluster. If it is, then + // save the track and contineu looping over all other tracks + if (r < rMax /*&& r <= maxTrackClusterDistance*/) { + rMax = r; + matchedTrack = track; + } + } + if(matchedTrack != null) return true; + return false; } /** * */ private void printPosition(double[] position){ - this.printDebug("[ " + position[0] + ", " + position[1] + ", " + position[2] + " ]"); + this.printDebug("[ " + position[0] + ", " + position[1] + ", " + position[2] + " ]"); } @@ -373,28 +373,28 @@ public void endOfData(){ System.out.println("%===================================================================% \n"); if(findableSingleTracks > 0){ - System.out.println("% Total single track efficiency: " + foundSingleTracks + " / " + findableSingleTracks + " = " + (foundSingleTracks/findableSingleTracks)*100 + "%"); + System.out.println("% Total single track efficiency: " + foundSingleTracks + " / " + findableSingleTracks + " = " + (foundSingleTracks/findableSingleTracks)*100 + "%"); } if(findableSingleTracksQuad1 > 0){ - System.out.println("% Total single track efficiency - Quad 1: " + foundSingleTracksQuad1 + " / " + findableSingleTracksQuad1 + " = " + (foundSingleTracksQuad1/findableSingleTracksQuad1)*100 + "%"); + System.out.println("% Total single track efficiency - Quad 1: " + foundSingleTracksQuad1 + " / " + findableSingleTracksQuad1 + " = " + (foundSingleTracksQuad1/findableSingleTracksQuad1)*100 + "%"); } if(findableSingleTracksQuad2 > 0){ - System.out.println("% Total single track efficiency - Quad 2: " + foundSingleTracksQuad2 + " / " + findableSingleTracksQuad2 + " = " + (foundSingleTracksQuad2/findableSingleTracksQuad2)*100 + "%"); + System.out.println("% Total single track efficiency - Quad 2: " + foundSingleTracksQuad2 + " / " + findableSingleTracksQuad2 + " = " + (foundSingleTracksQuad2/findableSingleTracksQuad2)*100 + "%"); } if(findableSingleTracksQuad3 > 0){ - System.out.println("% Total single track efficiency - Quad 3: " + foundSingleTracksQuad3 + " / " + findableSingleTracksQuad3 + " = " + (foundSingleTracksQuad3/findableSingleTracksQuad3)*100 + "%"); + System.out.println("% Total single track efficiency - Quad 3: " + foundSingleTracksQuad3 + " / " + findableSingleTracksQuad3 + " = " + (foundSingleTracksQuad3/findableSingleTracksQuad3)*100 + "%"); } if(findableSingleTracksQuad4 > 0){ - System.out.println("% Total single track efficiency - Quad 4: " + foundSingleTracksQuad4 + " / " + findableSingleTracksQuad4 + " = " + (foundSingleTracksQuad4/findableSingleTracksQuad4)*100 + "%"); + System.out.println("% Total single track efficiency - Quad 4: " + foundSingleTracksQuad4 + " / " + findableSingleTracksQuad4 + " = " + (foundSingleTracksQuad4/findableSingleTracksQuad4)*100 + "%"); } if(nOppositeVolume > 0){ - System.out.println("% Total events passing opposite volume requirement: " + nOppositeVolume + " / " + eventNumber + " = " + (nOppositeVolume/eventNumber)*100 + "%"); + System.out.println("% Total events passing opposite volume requirement: " + nOppositeVolume + " / " + eventNumber + " = " + (nOppositeVolume/eventNumber)*100 + "%"); } if(nAboveThreshold > 0){ - System.out.println("% Total events with both clusters above energy threshold: " + nAboveThreshold + " / " + eventNumber + " = " + (nAboveThreshold/eventNumber)*100 + "%"); + System.out.println("% Total events with both clusters above energy threshold: " + nAboveThreshold + " / " + eventNumber + " = " + (nAboveThreshold/eventNumber)*100 + "%"); } if(nTrigClusterTrackMatch > 0){ - System.out.println("% Total events with a trigger cluster-track match: " + nTrigClusterTrackMatch + " / " + eventNumber + " = " + (nTrigClusterTrackMatch/eventNumber)*100 + "%"); + System.out.println("% Total events with a trigger cluster-track match: " + nTrigClusterTrackMatch + " / " + eventNumber + " = " + (nTrigClusterTrackMatch/eventNumber)*100 + "%"); } if(findableTracks > 0){ System.out.println("% Total Track Reconstruction Efficiency: " + totalTracks + " / " + findableTracks + " = " + (totalTracks / findableTracks) * 100 + "%"); Modified: java/trunk/users/src/main/java/org/hps/users/phansson/FastTrackResidualDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/phansson/FastTrackResidualDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/phansson/FastTrackResidualDriver.java Wed Mar 9 11:43:24 2016 @@ -78,11 +78,11 @@ } public void detectorChanged(Detector detector) { - // Get the Subdetector. - ecal = detector.getSubdetector(ecalName); - - // Cache ref to decoder. - dec = ecal.getIDDecoder(); + // Get the Subdetector. + ecal = detector.getSubdetector(ecalName); + + // Cache ref to decoder. + dec = ecal.getIDDecoder(); //Ecal geometry crystalX = (13.3 + 16.0) / 2; @@ -793,7 +793,7 @@ style.setParameter("hist2DStyle", "colorMap"); style.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); ((PlotterRegion) plotter_ecalhitmult.region(idx)).getPlot().setAllowUserInteraction(false); - ((PlotterRegion) plotter_ecalhitmult.region(idx)).getPlot().setAllowPopupMenus(false); + ((PlotterRegion) plotter_ecalhitmult.region(idx)).getPlot().setAllowPopupMenus(false); } Modified: java/trunk/users/src/main/java/org/hps/users/phansson/GblResidualDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/phansson/GblResidualDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/phansson/GblResidualDriver.java Wed Mar 9 11:43:24 2016 @@ -156,7 +156,7 @@ // select GBL tracks if(TrackType.isGBL(track.getType())) { - + TrackState stateIP = null; TrackState stateLast = null; for(TrackState state : track.getTrackStates()) { @@ -164,14 +164,14 @@ if (state.getLocation() == TrackState.AtIP) stateIP = state; } - System.out.println("Event " + event.getEventNumber() - + " gbl track parameters " + - stateIP.getD0() + " " + - stateIP.getZ0() + " " + - stateIP.getPhi() + " " + - stateIP.getOmega() + " " + - stateIP.getTanLambda() - ); + System.out.println("Event " + event.getEventNumber() + + " gbl track parameters " + + stateIP.getD0() + " " + + stateIP.getZ0() + " " + + stateIP.getPhi() + " " + + stateIP.getOmega() + " " + + stateIP.getTanLambda() + ); // find seed track Modified: java/trunk/users/src/main/java/org/hps/users/phansson/SimpleResiduals.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/phansson/SimpleResiduals.java (original) +++ java/trunk/users/src/main/java/org/hps/users/phansson/SimpleResiduals.java Wed Mar 9 11:43:24 2016 @@ -98,11 +98,11 @@ } public void detectorChanged(Detector detector) { - // Get the Subdetector. - ecal = detector.getSubdetector(ecalName); - - // Cache ref to decoder. - dec = ecal.getIDDecoder(); + // Get the Subdetector. + ecal = detector.getSubdetector(ecalName); + + // Cache ref to decoder. + dec = ecal.getIDDecoder(); } public SimpleResiduals() { Modified: java/trunk/users/src/main/java/org/hps/users/phansson/gbl/GBLDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/phansson/gbl/GBLDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/phansson/gbl/GBLDriver.java Wed Mar 9 11:43:24 2016 @@ -22,81 +22,81 @@ */ public class GBLDriver extends Driver { - private boolean _debug = false; - private boolean _isMC = false; - MaterialSupervisor _materialManager = null; - MultipleScattering _scattering = null; - private HpsGblFitter _gbl_fitter = null; - private String milleBinaryName = ""; - - public GBLDriver() { - } - - public void setDebug(boolean debug) { - _debug = debug; - } - - public void setIsMC(boolean mcflag) { - _isMC = mcflag; - } - - protected void detectorChanged(Detector det) { - System.out.printf("%s: detectorChanged\n",getClass().getSimpleName()); + private boolean _debug = false; + private boolean _isMC = false; + MaterialSupervisor _materialManager = null; + MultipleScattering _scattering = null; + private HpsGblFitter _gbl_fitter = null; + private String milleBinaryName = ""; + + public GBLDriver() { + } + + public void setDebug(boolean debug) { + _debug = debug; + } + + public void setIsMC(boolean mcflag) { + _isMC = mcflag; + } + + protected void detectorChanged(Detector det) { + System.out.printf("%s: detectorChanged\n",getClass().getSimpleName()); Hep3Vector bfieldvec = det.getFieldMap().getField(new BasicHep3Vector(0., 1., 0.)); double bfield = bfieldvec.y(); System.out.printf("%s: b-field %s\n",getClass().getSimpleName(),bfieldvec.toString()); - _materialManager = new MaterialSupervisor(); - _scattering = new MultipleScattering(_materialManager); - _materialManager.buildModel(det); - _scattering.setBField(Math.abs(bfield)); // only absolute of B is needed as it's used for momentum calculation only - _gbl_fitter = new HpsGblFitter(bfield, _scattering, _isMC); - if(!milleBinaryName.equalsIgnoreCase("")) { - _gbl_fitter.setMilleBinary(new MilleBinary()); - } - System.out.printf("%s: detectorChanged end\n",getClass().getSimpleName()); - } + _materialManager = new MaterialSupervisor(); + _scattering = new MultipleScattering(_materialManager); + _materialManager.buildModel(det); + _scattering.setBField(Math.abs(bfield)); // only absolute of B is needed as it's used for momentum calculation only + _gbl_fitter = new HpsGblFitter(bfield, _scattering, _isMC); + if(!milleBinaryName.equalsIgnoreCase("")) { + _gbl_fitter.setMilleBinary(new MilleBinary()); + } + System.out.printf("%s: detectorChanged end\n",getClass().getSimpleName()); + } - protected void process(EventHeader event) { + protected void process(EventHeader event) { - List<Track> seedTracks = null; + List<Track> seedTracks = null; if(event.hasCollection(Track.class,"MatchedTracks")) { seedTracks = event.get(Track.class, "MatchedTracks"); if(_debug) { System.out.printf("%s: Event %d has %d tracks\n", this.getClass().getSimpleName(),event.getEventNumber(),seedTracks.size()); } } else { - if(_debug) { + if(_debug) { System.out.printf("%s: No tracks in Event %d \n", this.getClass().getSimpleName(),event.getEventNumber()); } - return; + return; } - + for(int itrack = 0; itrack < seedTracks.size(); ++itrack) { - if(_debug) { - System.out.printf("%s: do the fit for track %d \n", this.getClass().getSimpleName(),itrack); - } + if(_debug) { + System.out.printf("%s: do the fit for track %d \n", this.getClass().getSimpleName(),itrack); + } - // Reset - _gbl_fitter.clear(); - - // Run the GBL fit on this track - int status = _gbl_fitter.Fit(seedTracks.get(itrack)); + // Reset + _gbl_fitter.clear(); + + // Run the GBL fit on this track + int status = _gbl_fitter.Fit(seedTracks.get(itrack)); - if(_debug) { - System.out.printf("%s: fit status %d \n", this.getClass().getSimpleName(),status); - } + if(_debug) { + System.out.printf("%s: fit status %d \n", this.getClass().getSimpleName(),status); + } } - } + } - protected void endOfData() { - } + protected void endOfData() { + } - + } Modified: java/trunk/users/src/main/java/org/hps/users/phansson/gbl/HpsGblFitter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/phansson/gbl/HpsGblFitter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/phansson/gbl/HpsGblFitter.java Wed Mar 9 11:43:24 2016 @@ -118,7 +118,7 @@ // Store the projection from local to measurement frame for each strip cluster // need to use pointer for TMatrix here? // Map<Integer, Matrix> proL2m_list = new HashMap<Integer, Matrix>(); - // Save the association between strip cluster and label + // Save the association between strip cluster and label // Map<HelicalTrackStrip, Integer> stripLabelMap = new HashMap<HelicalTrackStrip, Integer>(); //start trajectory at refence point (s=0) - this point has no measurement GblPoint ref_point = new GblPoint(jacPointToPoint); @@ -253,7 +253,7 @@ BasicMatrix meas = new BasicMatrix(1, 2); meas.setElement(0, 0, res_meas.x()); meas.setElement(0, 1, 0.); -// //meas[0][0] += deltaU[iLayer] # misalignment +// //meas[0][0] += deltaU[iLayer] # misalignment BasicMatrix measErr = new BasicMatrix(1, 2); measErr.setElement(0, 0, res_err_meas.x()); @@ -411,7 +411,7 @@ //double diff = endTime - startTime; //double cps = CLOCKS_PER_SEC; //if( m_debug ) { - // std::cout << "HpsGblFitter: " << " Time elapsed " << diff / cps << " s" << std::endl; + // std::cout << "HpsGblFitter: " << " Time elapsed " << diff / cps << " s" << std::endl; //} if (_debug) { System.out.printf("%s: Fit() done successfully.\n", this.getClass().getSimpleName()); Modified: java/trunk/users/src/main/java/org/hps/users/phansson/testrun/TrigRateDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/phansson/testrun/TrigRateDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/phansson/testrun/TrigRateDriver.java Wed Mar 9 11:43:24 2016 @@ -80,11 +80,11 @@ } public void detectorChanged(Detector detector) { - // Get the Subdetector. - ecal = detector.getSubdetector(ecalName); - - // Cache ref to decoder. - dec = ecal.getIDDecoder(); + // Get the Subdetector. + ecal = detector.getSubdetector(ecalName); + + // Cache ref to decoder. + dec = ecal.getIDDecoder(); //plotterFrame = new AIDAFrame(); //plotterFrame.setTitle("TrigRateFrame"); Modified: java/trunk/users/src/main/java/org/hps/users/phansson/tools/TrackingGeometryChecker.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/phansson/tools/TrackingGeometryChecker.java (original) +++ java/trunk/users/src/main/java/org/hps/users/phansson/tools/TrackingGeometryChecker.java Wed Mar 9 11:43:24 2016 @@ -14,29 +14,29 @@ import org.lcsim.geometry.Detector; import org.lcsim.util.Driver; -/** +/** * Check tracking geometry. * @author Per Hansson Adrian <[log in to unmask]> * */ public class TrackingGeometryChecker extends Driver { - private int debug = 1; + private int debug = 1; - /** - * Check tracking geometry. - */ - public TrackingGeometryChecker() { - } - - protected void detectorChanged(Detector arg0) { - super.detectorChanged(arg0); - - // Get all of the sensors composing the SVT and add them to the set of all sensors + /** + * Check tracking geometry. + */ + public TrackingGeometryChecker() { + } + + protected void detectorChanged(Detector arg0) { + super.detectorChanged(arg0); + + // Get all of the sensors composing the SVT and add them to the set of all sensors IDetectorElement detectorElement = arg0.getDetectorElement().findDetectorElement("Tracker"); IIdentifierHelper helper = detectorElement.getIdentifierHelper(); List<HpsSiSensor> sensors = new ArrayList<HpsSiSensor>(); - sensors.addAll(detectorElement.findDescendants(HpsSiSensor.class)); + sensors.addAll(detectorElement.findDescendants(HpsSiSensor.class)); System.out.printf("%s: Total number of sensors: %d\n",getClass().getSimpleName(), sensors.size()); IIdentifier sensorIdent; @@ -70,57 +70,57 @@ IDetectorElement m = sensor; int im=0; while((m=m.getParent()) != null) { - System.out.printf("%s: DE mother %d name %s\n",getClass().getSimpleName(), im, m.getName()); - if(m.hasGeometryInfo()) { - System.out.printf("%s: DE mother %d pos %s\n",getClass().getSimpleName(), im, m.getGeometry().getPosition().toString()); - } else { - System.out.printf("%s: DE mother - no geom info - \n",getClass().getSimpleName(), im); - } + System.out.printf("%s: DE mother %d name %s\n",getClass().getSimpleName(), im, m.getName()); + if(m.hasGeometryInfo()) { + System.out.printf("%s: DE mother %d pos %s\n",getClass().getSimpleName(), im, m.getGeometry().getPosition().toString()); + } else { + System.out.printf("%s: DE mother - no geom info - \n",getClass().getSimpleName(), im); + } im++; } } - - } - - protected void startOfData() { - super.startOfData(); - } - - protected void process(EventHeader event) { - - -// List<SimTrackerHit> simTrackerHits = event.get(SimTrackerHit.class, "TrackerHits"); + + } + + protected void startOfData() { + super.startOfData(); + } + + protected void process(EventHeader event) { + + +// List<SimTrackerHit> simTrackerHits = event.get(SimTrackerHit.class, "TrackerHits"); // if (simTrackerHits == null) { // throw new RuntimeException("Missing SimTrackerHit collection"); // } // // if(debug>0) System.out.printf("%s: found %d simTrackerHits\n",getClass().getSimpleName(),simTrackerHits.size()); // for(SimTrackerHit simTrackerHit : simTrackerHits) { -// if(debug>0) printSimTrackerHitInfo(simTrackerHit); +// if(debug>0) printSimTrackerHitInfo(simTrackerHit); // } - } - - protected void endOfData() { - super.endOfData(); - } + } + + protected void endOfData() { + super.endOfData(); + } - protected int getDebug() { - return debug; - } + protected int getDebug() { + return debug; + } - protected void setDebug(int debug) { - this.debug = debug; - } + protected void setDebug(int debug) { + this.debug = debug; + } - private static void printSimTrackerHitInfo(SimTrackerHit simTrackerHit) { - System.out.printf("\nSimTrackerHit:\n"); - System.out.printf("\t position: %s\n",simTrackerHit.getPositionVec().toString()); - System.out.printf("\t DetectorElement: %s\n",simTrackerHit.getDetectorElement().getName()); - System.out.printf("\t DetectorElement position: %s\n",simTrackerHit.getDetectorElement().getGeometry().getPosition().toString()); - System.out.printf("\t PhysVol name at position: %s\n",simTrackerHit.getDetectorElement().getGeometry().getPhysicalVolume(simTrackerHit.getPositionVec()).getName()); - } + private static void printSimTrackerHitInfo(SimTrackerHit simTrackerHit) { + System.out.printf("\nSimTrackerHit:\n"); + System.out.printf("\t position: %s\n",simTrackerHit.getPositionVec().toString()); + System.out.printf("\t DetectorElement: %s\n",simTrackerHit.getDetectorElement().getName()); + System.out.printf("\t DetectorElement position: %s\n",simTrackerHit.getDetectorElement().getGeometry().getPosition().toString()); + System.out.printf("\t PhysVol name at position: %s\n",simTrackerHit.getDetectorElement().getGeometry().getPhysicalVolume(simTrackerHit.getPositionVec()).getName()); + } } Modified: java/trunk/users/src/main/java/org/hps/users/rafo/test1.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/rafo/test1.java (original) +++ java/trunk/users/src/main/java/org/hps/users/rafo/test1.java Wed Mar 9 11:43:24 2016 @@ -4,15 +4,15 @@ import org.lcsim.util.Driver; public class test1 extends Driver { - private int clusterID; + private int clusterID; - public void process(EventHeader event) { - System.out.println("The cluster ID = " + clusterID); - } + public void process(EventHeader event) { + System.out.println("The cluster ID = " + clusterID); + } - public void setClusterID(int clusterID) { - this.clusterID = clusterID; - } + public void setClusterID(int clusterID) { + this.clusterID = clusterID; + } } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/GetChargeFromScalersMultirun.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/GetChargeFromScalersMultirun.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/GetChargeFromScalersMultirun.java Wed Mar 9 11:43:24 2016 @@ -18,144 +18,144 @@ * */ public class GetChargeFromScalersMultirun { - private static ArrayList<String> runs; - private static ArrayList<Date> starts; - private static ArrayList<Date> ends; + private static ArrayList<String> runs; + private static ArrayList<Date> starts; + private static ArrayList<Date> ends; - public static void main(String[] arg) throws FileNotFoundException, ParseException{ - String inputFile = arg[0]; - String timingInfoFile = arg[1]; - String outputFile = arg[2]; - - - readTimingInfoFile(timingInfoFile); - - Map map = getCharges(runs, starts, ends, inputFile); - mergeBiasIntervals(map); - - ArrayList<String> keys = new ArrayList(map.keySet()); - Collections.sort(keys); - - - PrintWriter pw = new PrintWriter(new File(outputFile)); - for(String s : keys){ - pw.println(s + "\t" + map.get(s)); - System.out.println(s + "\t" + map.get(s)); - } - pw.close(); - } + public static void main(String[] arg) throws FileNotFoundException, ParseException{ + String inputFile = arg[0]; + String timingInfoFile = arg[1]; + String outputFile = arg[2]; + + + readTimingInfoFile(timingInfoFile); + + Map map = getCharges(runs, starts, ends, inputFile); + mergeBiasIntervals(map); + + ArrayList<String> keys = new ArrayList(map.keySet()); + Collections.sort(keys); + + + PrintWriter pw = new PrintWriter(new File(outputFile)); + for(String s : keys){ + pw.println(s + "\t" + map.get(s)); + System.out.println(s + "\t" + map.get(s)); + } + pw.close(); + } - static void readTimingInfoFile(String s) throws FileNotFoundException, ParseException{ - Scanner scanner = new Scanner(new File(s)); - scanner.useDelimiter("[\n\t]"); - runs = new ArrayList(); - starts = new ArrayList(); - ends = new ArrayList(); - DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss z"); - - while(scanner.hasNext()){ - runs.add(scanner.next()); - String n = scanner.next(); - if(n.matches("\\d+")) - starts.add(new Date(Long.parseLong(n))); - else - starts.add(df.parse(n)); - n = scanner.next(); - if(n.matches("\\d+")) - ends.add(new Date(Long.parseLong(n))); - else - ends.add(df.parse(n)); - - } - scanner.close(); - } - - - - - - /** - * returns charge in microCoulombs - * @param runs names of the runs - * @param starts starting times of the runs - * @param ends ending times of the runs - * @param file the mya file that we need to use - * @return a map relating the runs to the charges (uC). - * @throws FileNotFoundException - */ - - static Map<String, Double> getCharges(ArrayList<String> runs, ArrayList<Date> starts, ArrayList<Date> ends, String file) throws FileNotFoundException{ - Scanner s = new Scanner(new File(file)); - HashMap<String, Double> map = new HashMap(); - long prev = 0; - long time = 0; - for(int i = 0; i< runs.size(); i++){ - long endt = ends.get(i).getTime(); - long startt = starts.get(i).getTime(); - - double charge = 0; - boolean started = false; - double prevval = 0; - if(time > endt){ - s.close(); - s = new Scanner(new File(file)); - } - inner : while(s.hasNext()){ - String var = s.next(); - prev = time; - time = s.nextLong()*1000; //convert from s to ms + static void readTimingInfoFile(String s) throws FileNotFoundException, ParseException{ + Scanner scanner = new Scanner(new File(s)); + scanner.useDelimiter("[\n\t]"); + runs = new ArrayList(); + starts = new ArrayList(); + ends = new ArrayList(); + DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss z"); + + while(scanner.hasNext()){ + runs.add(scanner.next()); + String n = scanner.next(); + if(n.matches("\\d+")) + starts.add(new Date(Long.parseLong(n))); + else + starts.add(df.parse(n)); + n = scanner.next(); + if(n.matches("\\d+")) + ends.add(new Date(Long.parseLong(n))); + else + ends.add(df.parse(n)); + + } + scanner.close(); + } + + + + + + /** + * returns charge in microCoulombs + * @param runs names of the runs + * @param starts starting times of the runs + * @param ends ending times of the runs + * @param file the mya file that we need to use + * @return a map relating the runs to the charges (uC). + * @throws FileNotFoundException + */ + + static Map<String, Double> getCharges(ArrayList<String> runs, ArrayList<Date> starts, ArrayList<Date> ends, String file) throws FileNotFoundException{ + Scanner s = new Scanner(new File(file)); + HashMap<String, Double> map = new HashMap(); + long prev = 0; + long time = 0; + for(int i = 0; i< runs.size(); i++){ + long endt = ends.get(i).getTime(); + long startt = starts.get(i).getTime(); + + double charge = 0; + boolean started = false; + double prevval = 0; + if(time > endt){ + s.close(); + s = new Scanner(new File(file)); + } + inner : while(s.hasNext()){ + String var = s.next(); + prev = time; + time = s.nextLong()*1000; //convert from s to ms - double val = s.nextDouble(); - if(!var.equals("scaler_calc1")) - continue; - - if(!started && time> startt){ //first sample in the run - charge += (val)/2.*(time-startt); - started= true; - } - - else if(time > startt && endt > time){ //middle samples in the run - charge += (val/*+prevval*/)/*/2.*/*(time-prev); - - } - - if(endt < time){ //last sample that is in the run - charge += (/*prev*/val)/2.*(endt-prev); - break inner; - } - prevval = val; - } - charge/=1e6; - map.put(runs.get(i), charge); - } - s.close(); - return map; + double val = s.nextDouble(); + if(!var.equals("scaler_calc1")) + continue; + + if(!started && time> startt){ //first sample in the run + charge += (val)/2.*(time-startt); + started= true; + } + + else if(time > startt && endt > time){ //middle samples in the run + charge += (val/*+prevval*/)/*/2.*/*(time-prev); + + } + + if(endt < time){ //last sample that is in the run + charge += (/*prev*/val)/2.*(endt-prev); + break inner; + } + prevval = val; + } + charge/=1e6; + map.put(runs.get(i), charge); + } + s.close(); + return map; - } - - /** - * If the subsections of the runs in which the bias is on are labeled according to a scheme, - they will be added together. - for instance, 5779a, 5779b, 5779c, etc. will be added up as 5779bias. - * @param map the map of run names (and portions of runs that have bias labeled as [run number][a,b,c,d...], - * corresponding to the total charge in that run (or piece of a run). - */ - static void mergeBiasIntervals(Map<String, Double> map){ - Map<String, Double> map2 = new HashMap(); - for(Map.Entry<String, Double> entry : map.entrySet()){ - String key1 = entry.getKey(); - if(!entry.getKey().matches("\\d+a")) - continue; - double charge = entry.getValue(); - for(Map.Entry<String, Double> entry2 : map.entrySet()){ - if(entry2.getKey().matches(key1.substring(0, 4) + "[b-z]")) - charge += entry2.getValue(); - } - map2.put(key1.substring(0, 4) + "bias", charge); - - } - for(Map.Entry<String, Double> e : map2.entrySet()){ - map.put(e.getKey(), e.getValue()); - } - } + } + + /** + * If the subsections of the runs in which the bias is on are labeled according to a scheme, + they will be added together. + for instance, 5779a, 5779b, 5779c, etc. will be added up as 5779bias. + * @param map the map of run names (and portions of runs that have bias labeled as [run number][a,b,c,d...], + * corresponding to the total charge in that run (or piece of a run). + */ + static void mergeBiasIntervals(Map<String, Double> map){ + Map<String, Double> map2 = new HashMap(); + for(Map.Entry<String, Double> entry : map.entrySet()){ + String key1 = entry.getKey(); + if(!entry.getKey().matches("\\d+a")) + continue; + double charge = entry.getValue(); + for(Map.Entry<String, Double> entry2 : map.entrySet()){ + if(entry2.getKey().matches(key1.substring(0, 4) + "[b-z]")) + charge += entry2.getValue(); + } + map2.put(key1.substring(0, 4) + "bias", charge); + + } + for(Map.Entry<String, Double> e : map2.entrySet()){ + map.put(e.getKey(), e.getValue()); + } + } } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/HitrateHistograms.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/HitrateHistograms.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/HitrateHistograms.java Wed Mar 9 11:43:24 2016 @@ -19,109 +19,109 @@ import org.lcsim.util.Driver; public class HitrateHistograms extends Driver{ - HashMap<String, IHistogram2D[]> hist2d = new HashMap<String, IHistogram2D[]>(); + HashMap<String, IHistogram2D[]> hist2d = new HashMap<String, IHistogram2D[]>(); - IAnalysisFactory af = IAnalysisFactory.create(); - IHistogramFactory hf = af.createHistogramFactory(af.createTreeFactory().create()); - IPlotterFactory pf = af.createPlotterFactory(); - public HitrateHistograms(){ - addHistograms2D("Ecal", 1, -30, 30, -8, 16); - addHistograms2D("muon", 8, -30, 30, -8, 16); + IAnalysisFactory af = IAnalysisFactory.create(); + IHistogramFactory hf = af.createHistogramFactory(af.createTreeFactory().create()); + IPlotterFactory pf = af.createPlotterFactory(); + public HitrateHistograms(){ + addHistograms2D("Ecal", 1, -30, 30, -8, 16); + addHistograms2D("muon", 8, -30, 30, -8, 16); - try { - ecalDecoder = new IDDecoder(new IDDescriptor("system:0:6,layer:6:2,ix:8:-8,iy:16:-6")); - } catch (IDException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + try { + ecalDecoder = new IDDecoder(new IDDescriptor("system:0:6,layer:6:2,ix:8:-8,iy:16:-6")); + } catch (IDException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } - } - private void addHistograms2D(String detector, int nLayers, int ixMin, int ixMax, int iyMin, int iyMax){ - IPlotter plotter1 = pf.create("detector"); - int nx = (int)Math.ceil(Math.sqrt(nLayers)); - int ny = (int)Math.ceil(nLayers/(double)nx); - plotter1.createRegions(nx, ny); + } + private void addHistograms2D(String detector, int nLayers, int ixMin, int ixMax, int iyMin, int iyMax){ + IPlotter plotter1 = pf.create("detector"); + int nx = (int)Math.ceil(Math.sqrt(nLayers)); + int ny = (int)Math.ceil(nLayers/(double)nx); + plotter1.createRegions(nx, ny); - hist2d.put(detector,new IHistogram2D[nLayers]); - for(int i = 0; i< nLayers; i++){ - hist2d.get(detector)[i] - = hf.createHistogram2D(detector + " layer " + (i+1), ixMax-ixMin, ixMin, ixMax, iyMax-iyMin, iyMin, iyMax); - plotter1.region(i).plot(hist2d.get(detector)[i]); + hist2d.put(detector,new IHistogram2D[nLayers]); + for(int i = 0; i< nLayers; i++){ + hist2d.get(detector)[i] + = hf.createHistogram2D(detector + " layer " + (i+1), ixMax-ixMin, ixMin, ixMax, iyMax-iyMin, iyMin, iyMax); + plotter1.region(i).plot(hist2d.get(detector)[i]); - } - } + } + } - IDDecoder ecalDecoder; - private float recency; + IDDecoder ecalDecoder; + private float recency; - public void process(EventHeader header){ + public void process(EventHeader header){ - //System.out.println(header.keys()); + //System.out.println(header.keys()); - for(SIOSimCalorimeterHit hit: header.get(SIOSimCalorimeterHit.class,"EcalHits")){ - int fieldCount = hit.getIDDecoder().getFieldCount(); - ecalDecoder.setID(hit.getCellID()); - int ix = ecalDecoder.getValue("ix"); - int iy = ecalDecoder.getValue("iy"); - int layer = ecalDecoder.getValue("layer"); - hist2d.get("Ecal")[layer].fill(ix, iy); - } - - - /*if(recency != 0) - for(IHistogram2D[] hists : hist2d.values()){ - for(IHistogram2D hist : hists){ - hf. - } - }*/ - //} - } - /** - * "recency" is a parameter used to determine how to time-weight the - * histogram so that the more recent events are more highly weighted. - * A recency of zero means that there is no time weightedness. - * A recency of R means that each event is weighted by a factor of (1-R)^n, - * where n is the number of events that have taken place since the event shown. - * @param recency - */ - //public void setRecency(float recency){ - //this.recency = recency; - //} + for(SIOSimCalorimeterHit hit: header.get(SIOSimCalorimeterHit.class,"EcalHits")){ + int fieldCount = hit.getIDDecoder().getFieldCount(); + ecalDecoder.setID(hit.getCellID()); + int ix = ecalDecoder.getValue("ix"); + int iy = ecalDecoder.getValue("iy"); + int layer = ecalDecoder.getValue("layer"); + hist2d.get("Ecal")[layer].fill(ix, iy); + } + + + /*if(recency != 0) + for(IHistogram2D[] hists : hist2d.values()){ + for(IHistogram2D hist : hists){ + hf. + } + }*/ + //} + } + /** + * "recency" is a parameter used to determine how to time-weight the + * histogram so that the more recent events are more highly weighted. + * A recency of zero means that there is no time weightedness. + * A recency of R means that each event is weighted by a factor of (1-R)^n, + * where n is the number of events that have taken place since the event shown. + * @param recency + */ + //public void setRecency(float recency){ + //this.recency = recency; + //} - public void startOfData(){ + public void startOfData(){ - } - public void endOfData(){ + } + public void endOfData(){ - for(String name : hist2d.keySet()){ - IHistogram2D[] hists = hist2d.get(name); - System.out.println(name); - for(int i = 0; i< hists.length; i++){ - double max = hists[i].maxBinHeight(); - double total = hists[i].sumAllBinHeights(); - double ratioPercent = 100.*max/(double)total; - System.out.printf(" layer %d: %.2f %% of hits were in the most populated bin\n",i, ratioPercent); - } - } - } - public static void main(String arg[]) throws IOException{ - LCIOReader lcReader = new LCIOReader(new File(arg[0])); - HitrateHistograms driver = new HitrateHistograms(); - driver.startOfData(); - for(int i=0;i<1000;i++){ - EventHeader event = lcReader.read(); + for(String name : hist2d.keySet()){ + IHistogram2D[] hists = hist2d.get(name); + System.out.println(name); + for(int i = 0; i< hists.length; i++){ + double max = hists[i].maxBinHeight(); + double total = hists[i].sumAllBinHeights(); + double ratioPercent = 100.*max/(double)total; + System.out.printf(" layer %d: %.2f %% of hits were in the most populated bin\n",i, ratioPercent); + } + } + } + public static void main(String arg[]) throws IOException{ + LCIOReader lcReader = new LCIOReader(new File(arg[0])); + HitrateHistograms driver = new HitrateHistograms(); + driver.startOfData(); + for(int i=0;i<1000;i++){ + EventHeader event = lcReader.read(); - if(event == null) - break; - driver.process(event); + if(event == null) + break; + driver.process(event); - } - driver.endOfData(); - } + } + driver.endOfData(); + } } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/PulserFilter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/PulserFilter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/PulserFilter.java Wed Mar 9 11:43:24 2016 @@ -25,65 +25,65 @@ public class PulserFilter extends Driver{ - public void process(EventHeader event) { + public void process(EventHeader event) { - // only keep pulser triggers: - if (!event.hasCollection(GenericObject.class,"TriggerBank")) - throw new Driver.NextEventException(); - boolean isPulser=false; - for (GenericObject gob : event.get(GenericObject.class,"TriggerBank")) - { - if (!(AbstractIntData.getTag(gob) == TIData.BANK_TAG)) continue; - TIData tid = new TIData(gob); - if (tid.isPulserTrigger()) - { - isPulser=true; - break; - } - } + // only keep pulser triggers: + if (!event.hasCollection(GenericObject.class,"TriggerBank")) + throw new Driver.NextEventException(); + boolean isPulser=false; + for (GenericObject gob : event.get(GenericObject.class,"TriggerBank")) + { + if (!(AbstractIntData.getTag(gob) == TIData.BANK_TAG)) continue; + TIData tid = new TIData(gob); + if (tid.isPulserTrigger()) + { + isPulser=true; + break; + } + } - // don't drop any events with EPICS data or scalers data - // (could also do this via event tag=31) - final EpicsData edata = EpicsData.read(event); - if (edata != null) return; - ScalerData sdata = ScalerData.read(event); - if(sdata != null) return; + // don't drop any events with EPICS data or scalers data + // (could also do this via event tag=31) + final EpicsData edata = EpicsData.read(event); + if (edata != null) return; + ScalerData sdata = ScalerData.read(event); + if(sdata != null) return; - if (!isPulser) throw new Driver.NextEventException(); + if (!isPulser) throw new Driver.NextEventException(); - } + } - public static void main(String arg[]) throws IOException{ - ConditionsDriver hack = new ConditionsDriver(); - hack.setDetectorName("HPS-EngRun2015-Nominal-v1"); - hack.setFreeze(true); - hack.setRunNumber(Integer.parseInt(arg[2])); - hack.initialize(); - PulserFilter pf = new PulserFilter(); - LCIOWriter writer = new LCIOWriter(arg[1]); - File file = new File(arg[0]); - LCIOReader reader = new LCIOReader(file); - System.out.println(file.getPath()); + public static void main(String arg[]) throws IOException{ + ConditionsDriver hack = new ConditionsDriver(); + hack.setDetectorName("HPS-EngRun2015-Nominal-v1"); + hack.setFreeze(true); + hack.setRunNumber(Integer.parseInt(arg[2])); + hack.initialize(); + PulserFilter pf = new PulserFilter(); + LCIOWriter writer = new LCIOWriter(arg[1]); + File file = new File(arg[0]); + LCIOReader reader = new LCIOReader(file); + System.out.println(file.getPath()); - try{ - while(true){ - try{ - EventHeader eh = reader.read(); - if(eh.getEventNumber() %100 == 0) - System.out.println(eh.getEventNumber()); - pf.process(eh); - writer.write(eh); - }catch(Driver.NextEventException e){ + try{ + while(true){ + try{ + EventHeader eh = reader.read(); + if(eh.getEventNumber() %100 == 0) + System.out.println(eh.getEventNumber()); + pf.process(eh); + writer.write(eh); + }catch(Driver.NextEventException e){ - } - } - }catch(IOException e){ - e.printStackTrace(); - reader.close(); - } + } + } + }catch(IOException e){ + e.printStackTrace(); + reader.close(); + } - writer.close(); - } + writer.close(); + } } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/StyleUtil.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/StyleUtil.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/StyleUtil.java Wed Mar 9 11:43:24 2016 @@ -13,183 +13,183 @@ import hep.aida.ref.plotter.PlotterUtilities; public class StyleUtil { - - public static void stylize(IPlotterRegion r, String title, String lx, String ly, double xmin, double xmax, double ymin, double ymax){ - r.setTitle(title); - stylize(r, lx, ly); - r.setXLimits(xmin, xmax); - r.setYLimits(ymin, ymax); - } - public static void stylize(IPlotterRegion r, String title, String lx, String ly){ - r.setTitle(title); - stylize(r, lx, ly); - } - public static void stylize(IPlotterRegion r, String lx, String ly){ - - r.style().titleStyle().textStyle().setFontSize(22); - r.style().xAxisStyle().setLabel(lx); - r.style().xAxisStyle().labelStyle().setFontSize(16); - r.style().xAxisStyle().tickLabelStyle().setFontSize(14); - r.style().yAxisStyle().setLabel(ly); - r.style().yAxisStyle().labelStyle().setFontSize(16); - r.style().yAxisStyle().tickLabelStyle().setFontSize(14); - // r.style().statisticsBoxStyle().set; - //debugPrint()); - r.style().legendBoxStyle().textStyle().setFontSize(16); - r.style().statisticsBoxStyle().textStyle().setFontSize(16); - - //r.style().dataStyle().showInLegendBox(false); - - r.style().legendBoxStyle().boxStyle().foregroundStyle().setOpacity(1.0); - r.style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); - r.style().dataStyle().fillStyle().setParameter("showZeroHeightBins", "false"); - //debugPrint(r.style().dataStyle().availableParameters())); - //r.style().dataStyle().setParameter("showDataInStatisticsBox", "false"); - r.style().setParameter("hist2DStyle", "colorMap"); - //r.style().dataBoxStyle() - } - public static void addHorizontalLine(IPlotterRegion r, double y, String name){ - IAnalysisFactory af = IAnalysisFactory.create(); - IFunction f = af.createFunctionFactory(af.createTreeFactory().create()).createFunctionByName(name, "p0"); - f.setParameter("p0", y); - r.plot(f); - } - public static void addParabola(IPlotterRegion region, double p0, - double p1, double p2, String string) { - IAnalysisFactory af = IAnalysisFactory.create(); - IFunction f = af.createFunctionFactory(af.createTreeFactory().create()).createFunctionByName(string, "p2"); - f.setParameter("p0", p0); - f.setParameter("p1", p1); - f.setParameter("p2", p2); - region.plot(f); - } - public static void noFillHistogramBars(IPlotterRegion region) { - region.style().dataStyle().setParameter("fillHistogramBars", "false"); - region.style().dataStyle().fillStyle().setVisible(false); - + + public static void stylize(IPlotterRegion r, String title, String lx, String ly, double xmin, double xmax, double ymin, double ymax){ + r.setTitle(title); + stylize(r, lx, ly); + r.setXLimits(xmin, xmax); + r.setYLimits(ymin, ymax); + } + public static void stylize(IPlotterRegion r, String title, String lx, String ly){ + r.setTitle(title); + stylize(r, lx, ly); + } + public static void stylize(IPlotterRegion r, String lx, String ly){ + + r.style().titleStyle().textStyle().setFontSize(22); + r.style().xAxisStyle().setLabel(lx); + r.style().xAxisStyle().labelStyle().setFontSize(16); + r.style().xAxisStyle().tickLabelStyle().setFontSize(14); + r.style().yAxisStyle().setLabel(ly); + r.style().yAxisStyle().labelStyle().setFontSize(16); + r.style().yAxisStyle().tickLabelStyle().setFontSize(14); + // r.style().statisticsBoxStyle().set; + //debugPrint()); + r.style().legendBoxStyle().textStyle().setFontSize(16); + r.style().statisticsBoxStyle().textStyle().setFontSize(16); + + //r.style().dataStyle().showInLegendBox(false); + + r.style().legendBoxStyle().boxStyle().foregroundStyle().setOpacity(1.0); + r.style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow"); + r.style().dataStyle().fillStyle().setParameter("showZeroHeightBins", "false"); + //debugPrint(r.style().dataStyle().availableParameters())); + //r.style().dataStyle().setParameter("showDataInStatisticsBox", "false"); + r.style().setParameter("hist2DStyle", "colorMap"); + //r.style().dataBoxStyle() + } + public static void addHorizontalLine(IPlotterRegion r, double y, String name){ + IAnalysisFactory af = IAnalysisFactory.create(); + IFunction f = af.createFunctionFactory(af.createTreeFactory().create()).createFunctionByName(name, "p0"); + f.setParameter("p0", y); + r.plot(f); + } + public static void addParabola(IPlotterRegion region, double p0, + double p1, double p2, String string) { + IAnalysisFactory af = IAnalysisFactory.create(); + IFunction f = af.createFunctionFactory(af.createTreeFactory().create()).createFunctionByName(string, "p2"); + f.setParameter("p0", p0); + f.setParameter("p1", p1); + f.setParameter("p2", p2); + region.plot(f); + } + public static void noFillHistogramBars(IPlotterRegion region) { + region.style().dataStyle().setParameter("fillHistogramBars", "false"); + region.style().dataStyle().fillStyle().setVisible(false); + - region.style().dataStyle().lineStyle().setParameter("colorRotateMethod", "regionOverlayIndex"); - region.style().dataStyle().lineStyle().setParameter("colorRotate", "black, red, green, blue"); - region.style().dataStyle().lineStyle().setParameter("thickness", "3"); - region.style().dataStyle().outlineStyle().setParameter("colorRotateMethod", "regionOverlayIndex"); - //debug = true; - debugPrint(region.style().dataStyle().outlineStyle().availableParameters()); - region.style().dataStyle().outlineStyle().setParameter("colorRotate", "black, red, green, blue"); - region.style().dataStyle().outlineStyle().setParameter("thickness", "3"); - region.style().dataStyle().errorBarStyle().setVisible(false); - debugPrint(region.style().dataStyle().lineStyle().availableParameterOptions("colorRotateMethod")); - } - public static void setSize(IPlotter p, int width, int height){ - p.setParameter("plotterWidth", width +""); - p.setParameter("plotterHeight", height +""); - } - - public static void setLog(IPlotterRegion r){ + region.style().dataStyle().lineStyle().setParameter("colorRotateMethod", "regionOverlayIndex"); + region.style().dataStyle().lineStyle().setParameter("colorRotate", "black, red, green, blue"); + region.style().dataStyle().lineStyle().setParameter("thickness", "3"); + region.style().dataStyle().outlineStyle().setParameter("colorRotateMethod", "regionOverlayIndex"); + //debug = true; + debugPrint(region.style().dataStyle().outlineStyle().availableParameters()); + region.style().dataStyle().outlineStyle().setParameter("colorRotate", "black, red, green, blue"); + region.style().dataStyle().outlineStyle().setParameter("thickness", "3"); + region.style().dataStyle().errorBarStyle().setVisible(false); + debugPrint(region.style().dataStyle().lineStyle().availableParameterOptions("colorRotateMethod")); + } + public static void setSize(IPlotter p, int width, int height){ + p.setParameter("plotterWidth", width +""); + p.setParameter("plotterHeight", height +""); + } + + public static void setLog(IPlotterRegion r){ - r.style().yAxisStyle().setParameter("scale", "log"); - r.style().gridStyle().setUnits(100); - debugPrint(r.style().gridStyle().availableParameters()); - - } - static boolean debug = false; - static void debugPrint(String[] stuff){ - if(debug){ - System.out.println(Arrays.toString(stuff)); - } - } - public static void main(String arg[]){ - IAnalysisFactory af = IAnalysisFactory.create(); - IHistogramFactory hf = af.createHistogramFactory(af.createTreeFactory().create()); - - IPlotter p = af.createPlotterFactory().create(); - debugPrint(p.availableParameters()); - p.createRegions(1, 2); - IHistogram1D h1 = hf.createHistogram1D("blah", 100, -5, 5); - IHistogram1D h2 = hf.createHistogram1D("bleh", 100, -5, 5); - Random random = new Random(); - for(int i = 0; i< 100000; i++){ - h1.fill(random.nextGaussian()); - h2.fill(random.nextGaussian()*2); - } - hideLegendAndStats(p.region(1)); - noFillHistogramBars(p.region(0)); - stylize(p.region(0), "title", "x axis label", "y axis label"); - stylize(p.region(1), "stuff", "x axis label", "y axis label"); - p.region(0).plot(h1); - p.region(0).plot(h2); - + r.style().yAxisStyle().setParameter("scale", "log"); + r.style().gridStyle().setUnits(100); + debugPrint(r.style().gridStyle().availableParameters()); + + } + static boolean debug = false; + static void debugPrint(String[] stuff){ + if(debug){ + System.out.println(Arrays.toString(stuff)); + } + } + public static void main(String arg[]){ + IAnalysisFactory af = IAnalysisFactory.create(); + IHistogramFactory hf = af.createHistogramFactory(af.createTreeFactory().create()); + + IPlotter p = af.createPlotterFactory().create(); + debugPrint(p.availableParameters()); + p.createRegions(1, 2); + IHistogram1D h1 = hf.createHistogram1D("blah", 100, -5, 5); + IHistogram1D h2 = hf.createHistogram1D("bleh", 100, -5, 5); + Random random = new Random(); + for(int i = 0; i< 100000; i++){ + h1.fill(random.nextGaussian()); + h2.fill(random.nextGaussian()*2); + } + hideLegendAndStats(p.region(1)); + noFillHistogramBars(p.region(0)); + stylize(p.region(0), "title", "x axis label", "y axis label"); + stylize(p.region(1), "stuff", "x axis label", "y axis label"); + p.region(0).plot(h1); + p.region(0).plot(h2); + - IHistogram2D h3 = hf.createHistogram2D("blah", 100, -5, 5, 100, -5,5); - - for(int i = 0; i< 100000; i++){ - h3.fill(random.nextGaussian(), random.nextGaussian()); - } - - p.region(1).plot(h3); - - - - p.show(); - - p = af.createPlotterFactory().create(); - debugPrint(p.availableParameters()); - p.createRegions(1, 2); - - p.region(0).plot(h1); - setLog(p.region(0)); - - - - p.show(); - } - public static void hideLegendAndStats(IPlotterRegion r){ - r.style().statisticsBoxStyle().setVisible(false); - r.style().legendBoxStyle().setVisible(false); - } - public static IPlotterStyle smoothCurveStyle(IPlotterFactory pf) { - IPlotterStyle style = pf.createPlotterStyle(); - debugPrint(style.dataStyle().availableParameters()); - - style.dataStyle().markerStyle().setVisible(false); - - return style; - } - public static void writeToFile(IPlotter plotter, String filename, String filetype){ - //JFrame frame = new JFrame() - //if(plotter.) - //plotter.hide(); - //plotter.show(); - //PlotterUtilities.writeToFile(plotter, filename, filetype, null); - try { - - - //PlotterUtilities.writeToFile(plotter, filename, filetype, null); - Thread.sleep(1000); - Component c = PlotterUtilities.componentForPlotter(plotter); - int width = Integer.parseInt(plotter.parameterValue("plotterWidth")); - int height = Integer.parseInt(plotter.parameterValue("plotterHeight")); - if(width <= 0){ - width = 300; - plotter.setParameter("plotterWidth", Integer.toString(width)); - } - if(height <= 0){ - height = 300; + IHistogram2D h3 = hf.createHistogram2D("blah", 100, -5, 5, 100, -5,5); + + for(int i = 0; i< 100000; i++){ + h3.fill(random.nextGaussian(), random.nextGaussian()); + } + + p.region(1).plot(h3); + + + + p.show(); + + p = af.createPlotterFactory().create(); + debugPrint(p.availableParameters()); + p.createRegions(1, 2); + + p.region(0).plot(h1); + setLog(p.region(0)); + + + + p.show(); + } + public static void hideLegendAndStats(IPlotterRegion r){ + r.style().statisticsBoxStyle().setVisible(false); + r.style().legendBoxStyle().setVisible(false); + } + public static IPlotterStyle smoothCurveStyle(IPlotterFactory pf) { + IPlotterStyle style = pf.createPlotterStyle(); + debugPrint(style.dataStyle().availableParameters()); + + style.dataStyle().markerStyle().setVisible(false); + + return style; + } + public static void writeToFile(IPlotter plotter, String filename, String filetype){ + //JFrame frame = new JFrame() + //if(plotter.) + //plotter.hide(); + //plotter.show(); + //PlotterUtilities.writeToFile(plotter, filename, filetype, null); + try { + + + //PlotterUtilities.writeToFile(plotter, filename, filetype, null); + Thread.sleep(1000); + Component c = PlotterUtilities.componentForPlotter(plotter); + int width = Integer.parseInt(plotter.parameterValue("plotterWidth")); + int height = Integer.parseInt(plotter.parameterValue("plotterHeight")); + if(width <= 0){ + width = 300; + plotter.setParameter("plotterWidth", Integer.toString(width)); + } + if(height <= 0){ + height = 300; - plotter.setParameter("plotterHeight", Integer.toString(height)); - } - - c.setSize(width, height); - BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); - Graphics2D graphics2D = image.createGraphics(); - c.paint(graphics2D); - ImageIO.write(image,filetype, new File(filename)); - Runtime.getRuntime().exec("open " + filename); - System.out.println("saved"); - - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } + plotter.setParameter("plotterHeight", Integer.toString(height)); + } + + c.setSize(width, height); + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + Graphics2D graphics2D = image.createGraphics(); + c.paint(graphics2D); + ImageIO.write(image,filetype, new File(filename)); + Runtime.getRuntime().exec("open " + filename); + System.out.println("saved"); + + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/SumEverything.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/SumEverything.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/SumEverything.java Wed Mar 9 11:43:24 2016 @@ -17,156 +17,156 @@ // full of aida output files. Then add up all of the histograms in each sub folder, // and put the sums in separate files in a folder called "sums" public class SumEverything { - public static void main(String arg[]) throws IllegalArgumentException, IOException{ - if(arg.length == 2){ - twoArg(arg[0], arg[1]); - } - else if(arg.length == 1){ - oneArg(arg[0]); - } - else - polyArg(arg); - } - static void oneArg(final String indir) throws IllegalArgumentException, IOException{ - File outdir = new File(indir + "/sums"); - outdir.mkdir(); - ArrayList<Thread> threads = new ArrayList<Thread>(); - for(final File subdirf : new File(indir).listFiles()){ - Thread t = new Thread(){ - public void run(){ + public static void main(String arg[]) throws IllegalArgumentException, IOException{ + if(arg.length == 2){ + twoArg(arg[0], arg[1]); + } + else if(arg.length == 1){ + oneArg(arg[0]); + } + else + polyArg(arg); + } + static void oneArg(final String indir) throws IllegalArgumentException, IOException{ + File outdir = new File(indir + "/sums"); + outdir.mkdir(); + ArrayList<Thread> threads = new ArrayList<Thread>(); + for(final File subdirf : new File(indir).listFiles()){ + Thread t = new Thread(){ + public void run(){ - String subdir = subdirf.getAbsolutePath(); - if(subdir.matches(".*/sums/?")) - return; - String split[] = subdir.split("/"); - String outfile = indir + "/sums/" + split[split.length-1] + ".aida"; - try { - twoArg(subdir, outfile); - } catch (IllegalArgumentException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - }; - threads.add(t); - t.start(); - } - for(Thread t : threads){ - try { - t.join(); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - new File(indir + "/sums/total.aida").delete(); - twoArg(outdir.getAbsolutePath(), indir + "/sums/total.aida"); + String subdir = subdirf.getAbsolutePath(); + if(subdir.matches(".*/sums/?")) + return; + String split[] = subdir.split("/"); + String outfile = indir + "/sums/" + split[split.length-1] + ".aida"; + try { + twoArg(subdir, outfile); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + }; + threads.add(t); + t.start(); + } + for(Thread t : threads){ + try { + t.join(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + new File(indir + "/sums/total.aida").delete(); + twoArg(outdir.getAbsolutePath(), indir + "/sums/total.aida"); - } + } - static void twoArg(String indir, String out) throws IllegalArgumentException, IOException{ + static void twoArg(String indir, String out) throws IllegalArgumentException, IOException{ - run(new File(indir).listFiles(), out); - } - static void run(File[] files, String out) throws IllegalArgumentException, IOException{ - - long timeStart = System.currentTimeMillis(); - IAnalysisFactory af = IAnalysisFactory.create(); - ITreeFactory tf = af.createTreeFactory(); - new File(out).delete(); - ITree outtree = tf.create(out, "xml", false, true); - //IHistogramFactory hf = af.createHistogramFactory(outtree); - int j = 0; - String names[] = null; - for(File s : files){ - if(!s.getAbsolutePath().endsWith("aida")) - continue; - try{ - ITree tree = tf.create(s.getAbsolutePath(),"xml"); + run(new File(indir).listFiles(), out); + } + static void run(File[] files, String out) throws IllegalArgumentException, IOException{ + + long timeStart = System.currentTimeMillis(); + IAnalysisFactory af = IAnalysisFactory.create(); + ITreeFactory tf = af.createTreeFactory(); + new File(out).delete(); + ITree outtree = tf.create(out, "xml", false, true); + //IHistogramFactory hf = af.createHistogramFactory(outtree); + int j = 0; + String names[] = null; + for(File s : files){ + if(!s.getAbsolutePath().endsWith("aida")) + continue; + try{ + ITree tree = tf.create(s.getAbsolutePath(),"xml"); - if(j == 0){ - names = tree.listObjectNames("/", true); - System.out.println(Arrays.toString(names)); - outtree.mount("/tmp", tree, "/"); - for(String name : names){ - if(name.endsWith("/")){ - outtree.mkdirs(name); - continue; - } - Object o = tree.find(name); - if(o instanceof IHistogram1D || o instanceof IHistogram2D) - outtree.cp("/tmp" + name, name); - } - outtree.unmount("/tmp"); - //tree.close(); + if(j == 0){ + names = tree.listObjectNames("/", true); + System.out.println(Arrays.toString(names)); + outtree.mount("/tmp", tree, "/"); + for(String name : names){ + if(name.endsWith("/")){ + outtree.mkdirs(name); + continue; + } + Object o = tree.find(name); + if(o instanceof IHistogram1D || o instanceof IHistogram2D) + outtree.cp("/tmp" + name, name); + } + outtree.unmount("/tmp"); + //tree.close(); - } - else{ - //tree. - //String [] names = tree.listObjectNames("/", true); - //outtree.mount("/tmp", tree, "/"); - //System.out.println(Arrays.toString(names)); - for(String name : names){ - if(name.endsWith("/")) - continue; - Object o = null; - try{ - o = tree.find(name); - } catch(IllegalArgumentException e){ - System.err.println("couldn't find object called " + name + " in file " + s); - throw e; - } - if(o instanceof IHistogram1D){ - if(((IHistogram1D)o).allEntries() != 0) - ((IHistogram1D)outtree.find(name)).add((IHistogram1D)o); - } - if(o instanceof IHistogram2D) - if(((IHistogram2D)o).allEntries() != 0) - ((IHistogram2D)outtree.find(name)).add((IHistogram2D)o); - } - //outtree.unmount("/tmp"); - //tree.close(); - } + } + else{ + //tree. + //String [] names = tree.listObjectNames("/", true); + //outtree.mount("/tmp", tree, "/"); + //System.out.println(Arrays.toString(names)); + for(String name : names){ + if(name.endsWith("/")) + continue; + Object o = null; + try{ + o = tree.find(name); + } catch(IllegalArgumentException e){ + System.err.println("couldn't find object called " + name + " in file " + s); + throw e; + } + if(o instanceof IHistogram1D){ + if(((IHistogram1D)o).allEntries() != 0) + ((IHistogram1D)outtree.find(name)).add((IHistogram1D)o); + } + if(o instanceof IHistogram2D) + if(((IHistogram2D)o).allEntries() != 0) + ((IHistogram2D)outtree.find(name)).add((IHistogram2D)o); + } + //outtree.unmount("/tmp"); + //tree.close(); + } - tree.close(); - j++; - System.out.println(j + " files have been read (" +(System.currentTimeMillis()-timeStart)/j + " ms per event"); + tree.close(); + j++; + System.out.println(j + " files have been read (" +(System.currentTimeMillis()-timeStart)/j + " ms per event"); - } catch(IllegalArgumentException e){ - //print the filename - System.out.println("Exception happened at file " + s.getAbsolutePath()); + } catch(IllegalArgumentException e){ + //print the filename + System.out.println("Exception happened at file " + s.getAbsolutePath()); - e.printStackTrace(); - } + e.printStackTrace(); + } - outtree.commit(); - System.out.println("summed file " + out +" commited. Total time = " + (System.currentTimeMillis()-timeStart)/1000 + " seconds"); - } - } + outtree.commit(); + System.out.println("summed file " + out +" commited. Total time = " + (System.currentTimeMillis()-timeStart)/1000 + " seconds"); + } + } - static void polyArg(String[] arg) throws IllegalArgumentException, IOException{ - ArrayList<File> files = new ArrayList<File>(); - boolean nextIsOutput = false; - for(String a : arg){ - if(a.equals("-o")){ - nextIsOutput = true; - continue; - } - if(nextIsOutput){ - run(files.toArray(new File[0]), a); - nextIsOutput = false; - files.clear(); - continue; - } - files.add(new File(a)); + static void polyArg(String[] arg) throws IllegalArgumentException, IOException{ + ArrayList<File> files = new ArrayList<File>(); + boolean nextIsOutput = false; + for(String a : arg){ + if(a.equals("-o")){ + nextIsOutput = true; + continue; + } + if(nextIsOutput){ + run(files.toArray(new File[0]), a); + nextIsOutput = false; + files.clear(); + continue; + } + files.add(new File(a)); - } - } + } + } } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/BinGenerator.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/BinGenerator.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/BinGenerator.java Wed Mar 9 11:43:24 2016 @@ -5,86 +5,86 @@ import java.io.PrintWriter; public class BinGenerator { - public static void main(String arg[]) throws FileNotFoundException{ - int nBins = 32; + public static void main(String arg[]) throws FileNotFoundException{ + int nBins = 32; - PrintStream pw = new PrintStream("generatedbins.txt"); - pw.println(nBins); - double[] thetaBins = getThetaBins(nBins); - for(int i = 0; i< nBins; i++){ - double thetaMin = thetaBins[i]; - double thetaMax = thetaBins[i+1]; - double phiBounds[] = getPhiBounds(thetaMin, thetaMax); - pw.printf("%d %.4f %.4f ", phiBounds.length/2, thetaMin, thetaMax); - for(int j = 0; j< phiBounds.length; j++){ - pw.printf("%.4f ", phiBounds[j]); - } - pw.println(); - } - ShowCustomBinning.main(new String[]{"generatedbins.txt"}); + PrintStream pw = new PrintStream("generatedbins.txt"); + pw.println(nBins); + double[] thetaBins = getThetaBins(nBins); + for(int i = 0; i< nBins; i++){ + double thetaMin = thetaBins[i]; + double thetaMax = thetaBins[i+1]; + double phiBounds[] = getPhiBounds(thetaMin, thetaMax); + pw.printf("%d %.4f %.4f ", phiBounds.length/2, thetaMin, thetaMax); + for(int j = 0; j< phiBounds.length; j++){ + pw.printf("%.4f ", phiBounds[j]); + } + pw.println(); + } + ShowCustomBinning.main(new String[]{"generatedbins.txt"}); - } + } - private static double[] getThetaBins(int nBins){ - /*double thetaMin = 0.035; - double dTheta = .2/nBins; - double[] bins = new double[nBins +1]; - for(int i = 0; i< nBins+1; i++){ - bins[i] = thetaMin+dTheta*i; - } - return bins; */ - double thetaMax = .200; - double thetaMin = .040; + private static double[] getThetaBins(int nBins){ + /*double thetaMin = 0.035; + double dTheta = .2/nBins; + double[] bins = new double[nBins +1]; + for(int i = 0; i< nBins+1; i++){ + bins[i] = thetaMin+dTheta*i; + } + return bins; */ + double thetaMax = .200; + double thetaMin = .040; - double[] bins = new double[nBins +1]; - for(int i = 0; i<nBins+1; i++){ - bins[i] = thetaMin+i*(thetaMax-thetaMin)/nBins; - } - return bins; - /*double xMin = 1/(thetaMax*thetaMax); - double xMax = 1/(thetaMin*thetaMin); - for(int i = 0; i< nBins+1; i++){ - double x = xMax - i*(xMax-xMin)/nBins; - bins[i] = Math.pow(x, -.5); - } - return bins;*/ - } - private static double[] getPhiBounds(double thetaMin, double thetaMax){ - double phiBins[] = new double[6]; - double dphi = .01; - int edgeNumber = 0; + double[] bins = new double[nBins +1]; + for(int i = 0; i<nBins+1; i++){ + bins[i] = thetaMin+i*(thetaMax-thetaMin)/nBins; + } + return bins; + /*double xMin = 1/(thetaMax*thetaMax); + double xMax = 1/(thetaMin*thetaMin); + for(int i = 0; i< nBins+1; i++){ + double x = xMax - i*(xMax-xMin)/nBins; + bins[i] = Math.pow(x, -.5); + } + return bins;*/ + } + private static double[] getPhiBounds(double thetaMin, double thetaMax){ + double phiBins[] = new double[6]; + double dphi = .01; + int edgeNumber = 0; - boolean prevInRange = false; - for(double phi = 0; phi< 3.14; phi+= dphi){ - - // make the angular cuts on the tracks such that the particles that go into that cut - // are expected to be within 4 mm (~= 2 times the angular resolution of 1.5 mrad) of - // the ecal cuts. - double d = 4; - - boolean inRange = EcalUtil.fid_ECal_spherical_more_strict(thetaMin, phi, d) && EcalUtil.fid_ECal_spherical_more_strict(thetaMax, phi, d) - && EcalUtil.fid_ECal_spherical_more_strict(thetaMin, -phi, d) && EcalUtil.fid_ECal_spherical_more_strict(thetaMax, -phi, d); - if(inRange && !prevInRange) - phiBins[edgeNumber++] = phi; - if(prevInRange && !inRange) - phiBins[edgeNumber++] = phi-dphi; - prevInRange = inRange; - } - if(phiBins[2] == 0) - return new double[]{phiBins[0], phiBins[1]}; - if(phiBins[4] == 0) - return new double[]{phiBins[0], phiBins[1],phiBins[2], phiBins[3]}; - - //3 segments: choose the largest two - if(phiBins[4] != 0 && phiBins[1] - phiBins[0] > phiBins[3]-phiBins[2] && phiBins[5] - phiBins[4] > phiBins[3]-phiBins[2]){ - return new double[]{phiBins[0], phiBins[1],phiBins[4], phiBins[5]}; - } - if(phiBins[4] != 0 && phiBins[3] - phiBins[2] > phiBins[1]-phiBins[0] && phiBins[5] - phiBins[4] > phiBins[1]-phiBins[0]){ - return new double[]{phiBins[2], phiBins[3],phiBins[4], phiBins[5]}; - } - return new double[]{phiBins[0], phiBins[1],phiBins[2], phiBins[3]}; - - - } + boolean prevInRange = false; + for(double phi = 0; phi< 3.14; phi+= dphi){ + + // make the angular cuts on the tracks such that the particles that go into that cut + // are expected to be within 4 mm (~= 2 times the angular resolution of 1.5 mrad) of + // the ecal cuts. + double d = 4; + + boolean inRange = EcalUtil.fid_ECal_spherical_more_strict(thetaMin, phi, d) && EcalUtil.fid_ECal_spherical_more_strict(thetaMax, phi, d) + && EcalUtil.fid_ECal_spherical_more_strict(thetaMin, -phi, d) && EcalUtil.fid_ECal_spherical_more_strict(thetaMax, -phi, d); + if(inRange && !prevInRange) + phiBins[edgeNumber++] = phi; + if(prevInRange && !inRange) + phiBins[edgeNumber++] = phi-dphi; + prevInRange = inRange; + } + if(phiBins[2] == 0) + return new double[]{phiBins[0], phiBins[1]}; + if(phiBins[4] == 0) + return new double[]{phiBins[0], phiBins[1],phiBins[2], phiBins[3]}; + + //3 segments: choose the largest two + if(phiBins[4] != 0 && phiBins[1] - phiBins[0] > phiBins[3]-phiBins[2] && phiBins[5] - phiBins[4] > phiBins[3]-phiBins[2]){ + return new double[]{phiBins[0], phiBins[1],phiBins[4], phiBins[5]}; + } + if(phiBins[4] != 0 && phiBins[3] - phiBins[2] > phiBins[1]-phiBins[0] && phiBins[5] - phiBins[4] > phiBins[1]-phiBins[0]){ + return new double[]{phiBins[2], phiBins[3],phiBins[4], phiBins[5]}; + } + return new double[]{phiBins[0], phiBins[1],phiBins[2], phiBins[3]}; + + + } } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/CustomBinning.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/CustomBinning.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/CustomBinning.java Wed Mar 9 11:43:24 2016 @@ -5,76 +5,76 @@ import java.util.Scanner; public class CustomBinning { - public CustomBinning(File f) throws FileNotFoundException{ - Scanner s = new Scanner(f); + public CustomBinning(File f) throws FileNotFoundException{ + Scanner s = new Scanner(f); - nTheta = s.nextInt(); //number of bins in theta; - thetaMax = new double[nTheta]; - thetaMin = new double[nTheta]; - - phiMax = new double[nTheta][]; - phiMin = new double[nTheta][]; - int i = 0; - while(s.hasNext()){ //new row - int nPhi = s.nextInt(); - thetaMin[i] = s.nextDouble(); - thetaMax[i] = s.nextDouble(); - - phiMax[i] = new double[nPhi]; - phiMin[i] = new double[nPhi]; - for(int j = 0; j<nPhi; j++){ - phiMin[i][j] = s.nextDouble(); - phiMax[i][j] = s.nextDouble(); - } - i++; - } - } - double[][] phiMax; - double[][] phiMin; - public double thetaMax[], thetaMin[]; - public int nTheta; + nTheta = s.nextInt(); //number of bins in theta; + thetaMax = new double[nTheta]; + thetaMin = new double[nTheta]; + + phiMax = new double[nTheta][]; + phiMin = new double[nTheta][]; + int i = 0; + while(s.hasNext()){ //new row + int nPhi = s.nextInt(); + thetaMin[i] = s.nextDouble(); + thetaMax[i] = s.nextDouble(); + + phiMax[i] = new double[nPhi]; + phiMin[i] = new double[nPhi]; + for(int j = 0; j<nPhi; j++){ + phiMin[i][j] = s.nextDouble(); + phiMax[i][j] = s.nextDouble(); + } + i++; + } + } + double[][] phiMax; + double[][] phiMin; + public double thetaMax[], thetaMin[]; + public int nTheta; - double getSteradians(int binNumber){ - double t1 = thetaMin[binNumber]; - double t2 = thetaMax[binNumber]; - double dCos = Math.cos(t1)-Math.cos(t2); - double dPhiTot = 0; - for(int i = 0; i< phiMax[binNumber].length; i++){ - dPhiTot += phiMax[binNumber][i]-phiMin[binNumber][i]; - } - return 2*dPhiTot*dCos; //factor of two because top and bottom - } - boolean inRange(double theta, double phi){ - phi = Math.abs(phi); - /*int i =(int) Math.floor((theta-theta0)/deltaTheta); - if(i>= nTheta || i<0) - return false;*/ - if(theta > thetaMax[nTheta-1] || theta < thetaMin[0]) - return false; - int i; - boolean found = false; - for(i = 0; i< nTheta; i++){ - if(theta > thetaMin[i] && theta < thetaMax[i]){ - found = true; - break; - } - } - if(!found) - return false; - - for(int j = 0; j<phiMax[i].length; j++){ - if(phi>phiMin[i][j] && phi< phiMax[i][j]) - return true; - } - return false; + double getSteradians(int binNumber){ + double t1 = thetaMin[binNumber]; + double t2 = thetaMax[binNumber]; + double dCos = Math.cos(t1)-Math.cos(t2); + double dPhiTot = 0; + for(int i = 0; i< phiMax[binNumber].length; i++){ + dPhiTot += phiMax[binNumber][i]-phiMin[binNumber][i]; + } + return 2*dPhiTot*dCos; //factor of two because top and bottom + } + boolean inRange(double theta, double phi){ + phi = Math.abs(phi); + /*int i =(int) Math.floor((theta-theta0)/deltaTheta); + if(i>= nTheta || i<0) + return false;*/ + if(theta > thetaMax[nTheta-1] || theta < thetaMin[0]) + return false; + int i; + boolean found = false; + for(i = 0; i< nTheta; i++){ + if(theta > thetaMin[i] && theta < thetaMax[i]){ + found = true; + break; + } + } + if(!found) + return false; + + for(int j = 0; j<phiMax[i].length; j++){ + if(phi>phiMin[i][j] && phi< phiMax[i][j]) + return true; + } + return false; - } - public double getTotSteradians() { - double tot = 0; - for(int i = 0; i<nTheta; i++){ - tot += getSteradians(i); - } - return tot; - } + } + public double getTotSteradians() { + double tot = 0; + for(int i = 0; i<nTheta; i++){ + tot += getSteradians(i); + } + return tot; + } } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/DisplayHistograms.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/DisplayHistograms.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/DisplayHistograms.java Wed Mar 9 11:43:24 2016 @@ -3,8 +3,8 @@ import java.io.IOException; public class DisplayHistograms { - public static void main(String arg[]) throws IllegalArgumentException, IOException{ - //System.out.println("dognabo"); - MakeHistograms.main(new String[]{arg[0]}); - } + public static void main(String arg[]) throws IllegalArgumentException, IOException{ + //System.out.println("dognabo"); + MakeHistograms.main(new String[]{arg[0]}); + } } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/EcalUtil.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/EcalUtil.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/EcalUtil.java Wed Mar 9 11:43:24 2016 @@ -12,232 +12,232 @@ import org.lcsim.event.Cluster; public class EcalUtil { - - static int[] getCrystalIndex(Cluster c){ - if(map == null){ - try{ - readMap(); - }catch(Exception e){ - e.printStackTrace(); - } - } - c.getPosition(); - int bestix = 0, bestiy = 0; - double bestdist = 100000; - - double cx = c.getPosition()[0]; - double cy = c.getPosition()[1]; - for(int ix = -23; ix<= 23; ix++){ - if(!map.containsKey(200+ix)) - continue; - double x = map.get(200+ix)[0]; - if(Math.abs(x-cx)<bestdist){ - bestdist = Math.abs(x-cx); - bestix = ix; - } - } - - bestdist = 100000; - for(int iy = -5; iy<= 5; iy++){ - if(!map.containsKey(100*iy + bestix)) - continue; - double y = map.get(100*iy + bestix)[1]; - if(Math.abs(y-cy)<bestdist){ - bestdist = Math.abs(y-cy); - bestiy = iy; - } - } - return new int[]{bestix, bestiy}; - } - - - /** - * Holly's algorithm. - * @param x x position of cluster - * @param y y position of cluster - * @param e energy of cluster - * @param pid type of particle (11 = electron; -1 = positron) - * @return array of doubles - * <br> [0] theta = atan(py/pz) - * <br> [1] phi = atan(px/pz) - */ - static double [] toHollysCoordinates(double x, double y, double e, int pid){ - if(pid == 11){ - return new double[]{0.00071 * y +0.000357, 0.00071*x + 0.00003055*e + 0.04572/e +0.0006196}; - } else if(pid == -11){ - return new double[]{0.00071 * y +0.000357, 0.00071*x - 0.0006465*e + 0.045757/e +0.003465}; - } - return null; - } - - static double getSteradians(double x, double y, double e,int pid, double dA){ - double thetaPhi[] = toHollysCoordinates(x, y, e, pid); - return .00071*.00071*dA/Math.sqrt(thetaPhi[0]*thetaPhi[0]+ thetaPhi[1]*thetaPhi[1]+1); - } - - static boolean isSeedEdge(Cluster c){ - CalorimeterHit seedhit = (CalorimeterHit)c.getCalorimeterHits().get(0); - // seedhit - int ix = seedhit.getIdentifierFieldValue("ix"); - int iy = seedhit.getIdentifierFieldValue("iy"); - - //seedhit.get - return isEdge(ix, iy); - } - static boolean isEdge(int ix, int iy){ - if(iy == 5 || iy == 1 || iy == -1 || iy == -5) - return true; - if(ix == -23 || ix == 23) - return true; - if((iy == 2 || iy == -2) && (ix >=-11 && ix <= -1)) - return true; - return false; - } - public static boolean fid_ECal(Cluster c){ - return fid_ECal(c.getPosition()[0], c.getPosition()[1]); - } - public static boolean fid_ECal(double x, double y) - { - y = Math.abs(y); - - boolean in_fid = false; - double x_edge_low = -262.74; - double x_edge_high = 347.7; - double y_edge_low = 33.54; - double y_edge_high = 75.18; - - double x_gap_low = -106.66; - double x_gap_high = 42.17; - double y_gap_high = 47.18; - - y = Math.abs(y); - - if( x > x_edge_low && x < x_edge_high && y > y_edge_low && y < y_edge_high ) - { - if( !(x > x_gap_low && x < x_gap_high && y > y_edge_low && y < y_gap_high) ) - { - in_fid = true; - } - } - - return in_fid; - } - /** - * - * @param x - * @param y - * @param d the additional distance from the edge of the ecal in addition - * to what is required by fid_Cal(double, double) - * @return - */ - public static boolean fid_ecal_more_strict(double x, double y, double d){ - y = Math.abs(y); - - boolean in_fid = false; - - double x_edge_low = -262.74 + d; - double x_edge_high = 347.7 - d; - double y_edge_low = 33.54 + d; - double y_edge_high = 75.18 - d; - - double x_gap_low = -106.66 - d; - double x_gap_high = 42.17 + d; - double y_gap_high = 47.18 + d; - - y = Math.abs(y); - - if( x > x_edge_low && x < x_edge_high && y > y_edge_low && y < y_edge_high ) - { - if( !(x > x_gap_low && x < x_gap_high && y > y_edge_low && y < y_gap_high) ) - { - in_fid = true; - } - } - - return in_fid; - } - static double[] toSphericalFromBeam(double pxpz, double pypz){ - double x = pxpz, y = pypz, z = 1; - double beamTilt = .03057; - double xtemp = Math.cos(beamTilt)*x - Math.sin(beamTilt)*z; - double ztemp = Math.cos(beamTilt)*z + Math.sin(beamTilt)*x; - double ytemp = y; - - double theta = Math.atan(Math.hypot(xtemp, ytemp)/ ztemp); - double phi = Math.atan2(ytemp, xtemp); - - - return new double[]{theta, phi}; - } - static Map<Integer, double[]> map ; - static void readMap() throws FileNotFoundException{ - Scanner s = new Scanner(new File(System.getenv("HOME") + "/ecal_positions.txt")); - map = new HashMap(); - - while(s.hasNext()){ - int ix =s.nextInt(); - int iy = s.nextInt(); - double x = s.nextDouble(); - double y =s.nextDouble(); - map.put(ix+100*iy, new double[]{x, y}); - - } - s.close(); - } - static double getArea(int ix, int iy){ - int ixp = ix+1; - if(ixp == 0) - ixp = 1; - int ixm = ix-1; - if(ixm == 0) - ixm = -1; - double[] plus = map.get(ixp+100*(iy+1)); - double[] minus = map.get(ixm+100*(iy-1)); - return (plus[0]-minus[0])*(plus[1]-minus[1])/4; - } - - public static double[] getThetaPhiSpherical(double x,double y){ - double hcoord[] = toHollysCoordinates(x,y, 1.056, 11); - return toSphericalFromBeam(Math.tan(hcoord[1]),Math.tan(hcoord[0])); - } - /*beam tilt*/ - static double tilt = .03057; - //assuming FEE electron. - - public static double[] getXY(double theta, double phi){ - - double ux = Math.cos(phi)*Math.sin(theta)*Math.cos(tilt)+Math.cos(theta)*Math.sin(tilt); - double uy = Math.sin(phi)*Math.sin(theta); - double uz = Math.cos(theta)*Math.cos(tilt)-Math.cos(phi)*Math.sin(theta)*Math.sin(tilt); - double pxpz = ux/uz; - double pypz = uy/uz; - //holly's coordinates: - double h1 = Math.atan(pypz); - double h2 = Math.atan(pxpz); - //0.00071 * y +0.000357, - //0.00071*x + 0.00003055*e + 0.04572/e +0.0006196 - double y = (h1-0.000357)/0.00071; - double e = 1.056; - double x = (h2 - 0.00003055*e - 0.04572/e -0.0006196)/0.00071; - return new double[]{x,y}; - } - public static boolean fid_ECal_spherical(double theta, double phi){ - double[] xy = getXY(theta, phi); - double x = xy[0]; - double y = xy[1]; - return fid_ECal(x, y); - } - public static boolean fid_ECal_spherical_more_strict(double theta, double phi, double d){ - double[] xy = getXY(theta, phi); - double x = xy[0]; - double y = xy[1]; - return fid_ecal_more_strict(x, y, d); - } - public static void main(String arg[]){ - double x = 0, y = 0; - double sp[] = getThetaPhiSpherical(x,y); - System.out.println(Arrays.toString(getXY(sp[0], sp[1]))); - } + + static int[] getCrystalIndex(Cluster c){ + if(map == null){ + try{ + readMap(); + }catch(Exception e){ + e.printStackTrace(); + } + } + c.getPosition(); + int bestix = 0, bestiy = 0; + double bestdist = 100000; + + double cx = c.getPosition()[0]; + double cy = c.getPosition()[1]; + for(int ix = -23; ix<= 23; ix++){ + if(!map.containsKey(200+ix)) + continue; + double x = map.get(200+ix)[0]; + if(Math.abs(x-cx)<bestdist){ + bestdist = Math.abs(x-cx); + bestix = ix; + } + } + + bestdist = 100000; + for(int iy = -5; iy<= 5; iy++){ + if(!map.containsKey(100*iy + bestix)) + continue; + double y = map.get(100*iy + bestix)[1]; + if(Math.abs(y-cy)<bestdist){ + bestdist = Math.abs(y-cy); + bestiy = iy; + } + } + return new int[]{bestix, bestiy}; + } + + + /** + * Holly's algorithm. + * @param x x position of cluster + * @param y y position of cluster + * @param e energy of cluster + * @param pid type of particle (11 = electron; -1 = positron) + * @return array of doubles + * <br> [0] theta = atan(py/pz) + * <br> [1] phi = atan(px/pz) + */ + static double [] toHollysCoordinates(double x, double y, double e, int pid){ + if(pid == 11){ + return new double[]{0.00071 * y +0.000357, 0.00071*x + 0.00003055*e + 0.04572/e +0.0006196}; + } else if(pid == -11){ + return new double[]{0.00071 * y +0.000357, 0.00071*x - 0.0006465*e + 0.045757/e +0.003465}; + } + return null; + } + + static double getSteradians(double x, double y, double e,int pid, double dA){ + double thetaPhi[] = toHollysCoordinates(x, y, e, pid); + return .00071*.00071*dA/Math.sqrt(thetaPhi[0]*thetaPhi[0]+ thetaPhi[1]*thetaPhi[1]+1); + } + + static boolean isSeedEdge(Cluster c){ + CalorimeterHit seedhit = (CalorimeterHit)c.getCalorimeterHits().get(0); + // seedhit + int ix = seedhit.getIdentifierFieldValue("ix"); + int iy = seedhit.getIdentifierFieldValue("iy"); + + //seedhit.get + return isEdge(ix, iy); + } + static boolean isEdge(int ix, int iy){ + if(iy == 5 || iy == 1 || iy == -1 || iy == -5) + return true; + if(ix == -23 || ix == 23) + return true; + if((iy == 2 || iy == -2) && (ix >=-11 && ix <= -1)) + return true; + return false; + } + public static boolean fid_ECal(Cluster c){ + return fid_ECal(c.getPosition()[0], c.getPosition()[1]); + } + public static boolean fid_ECal(double x, double y) + { + y = Math.abs(y); + + boolean in_fid = false; + double x_edge_low = -262.74; + double x_edge_high = 347.7; + double y_edge_low = 33.54; + double y_edge_high = 75.18; + + double x_gap_low = -106.66; + double x_gap_high = 42.17; + double y_gap_high = 47.18; + + y = Math.abs(y); + + if( x > x_edge_low && x < x_edge_high && y > y_edge_low && y < y_edge_high ) + { + if( !(x > x_gap_low && x < x_gap_high && y > y_edge_low && y < y_gap_high) ) + { + in_fid = true; + } + } + + return in_fid; + } + /** + * + * @param x + * @param y + * @param d the additional distance from the edge of the ecal in addition + * to what is required by fid_Cal(double, double) + * @return + */ + public static boolean fid_ecal_more_strict(double x, double y, double d){ + y = Math.abs(y); + + boolean in_fid = false; + + double x_edge_low = -262.74 + d; + double x_edge_high = 347.7 - d; + double y_edge_low = 33.54 + d; + double y_edge_high = 75.18 - d; + + double x_gap_low = -106.66 - d; + double x_gap_high = 42.17 + d; + double y_gap_high = 47.18 + d; + + y = Math.abs(y); + + if( x > x_edge_low && x < x_edge_high && y > y_edge_low && y < y_edge_high ) + { + if( !(x > x_gap_low && x < x_gap_high && y > y_edge_low && y < y_gap_high) ) + { + in_fid = true; + } + } + + return in_fid; + } + static double[] toSphericalFromBeam(double pxpz, double pypz){ + double x = pxpz, y = pypz, z = 1; + double beamTilt = .03057; + double xtemp = Math.cos(beamTilt)*x - Math.sin(beamTilt)*z; + double ztemp = Math.cos(beamTilt)*z + Math.sin(beamTilt)*x; + double ytemp = y; + + double theta = Math.atan(Math.hypot(xtemp, ytemp)/ ztemp); + double phi = Math.atan2(ytemp, xtemp); + + + return new double[]{theta, phi}; + } + static Map<Integer, double[]> map ; + static void readMap() throws FileNotFoundException{ + Scanner s = new Scanner(new File(System.getenv("HOME") + "/ecal_positions.txt")); + map = new HashMap(); + + while(s.hasNext()){ + int ix =s.nextInt(); + int iy = s.nextInt(); + double x = s.nextDouble(); + double y =s.nextDouble(); + map.put(ix+100*iy, new double[]{x, y}); + + } + s.close(); + } + static double getArea(int ix, int iy){ + int ixp = ix+1; + if(ixp == 0) + ixp = 1; + int ixm = ix-1; + if(ixm == 0) + ixm = -1; + double[] plus = map.get(ixp+100*(iy+1)); + double[] minus = map.get(ixm+100*(iy-1)); + return (plus[0]-minus[0])*(plus[1]-minus[1])/4; + } + + public static double[] getThetaPhiSpherical(double x,double y){ + double hcoord[] = toHollysCoordinates(x,y, 1.056, 11); + return toSphericalFromBeam(Math.tan(hcoord[1]),Math.tan(hcoord[0])); + } + /*beam tilt*/ + static double tilt = .03057; + //assuming FEE electron. + + public static double[] getXY(double theta, double phi){ + + double ux = Math.cos(phi)*Math.sin(theta)*Math.cos(tilt)+Math.cos(theta)*Math.sin(tilt); + double uy = Math.sin(phi)*Math.sin(theta); + double uz = Math.cos(theta)*Math.cos(tilt)-Math.cos(phi)*Math.sin(theta)*Math.sin(tilt); + double pxpz = ux/uz; + double pypz = uy/uz; + //holly's coordinates: + double h1 = Math.atan(pypz); + double h2 = Math.atan(pxpz); + //0.00071 * y +0.000357, + //0.00071*x + 0.00003055*e + 0.04572/e +0.0006196 + double y = (h1-0.000357)/0.00071; + double e = 1.056; + double x = (h2 - 0.00003055*e - 0.04572/e -0.0006196)/0.00071; + return new double[]{x,y}; + } + public static boolean fid_ECal_spherical(double theta, double phi){ + double[] xy = getXY(theta, phi); + double x = xy[0]; + double y = xy[1]; + return fid_ECal(x, y); + } + public static boolean fid_ECal_spherical_more_strict(double theta, double phi, double d){ + double[] xy = getXY(theta, phi); + double x = xy[0]; + double y = xy[1]; + return fid_ecal_more_strict(x, y, d); + } + public static void main(String arg[]){ + double x = 0, y = 0; + double sp[] = getThetaPhiSpherical(x,y); + System.out.println(Arrays.toString(getXY(sp[0], sp[1]))); + } } - - + + Modified: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ExtractFormFactors.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ExtractFormFactors.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ExtractFormFactors.java Wed Mar 9 11:43:24 2016 @@ -17,129 +17,129 @@ //arg[5] is the radius (in fm) for calculating predicted form factors public class ExtractFormFactors { - static double Na = 6.022e23; - static double hbarc = .1973269788; - static double alpha = 1/137.; - static double q = 1.602e-19; - static double amu = .931454; - public static void main(String arg[]) throws IllegalArgumentException, IOException{ - IAnalysisFactory af = IAnalysisFactory.create(); - ITreeFactory tf = af.createTreeFactory(); + static double Na = 6.022e23; + static double hbarc = .1973269788; + static double alpha = 1/137.; + static double q = 1.602e-19; + static double amu = .931454; + public static void main(String arg[]) throws IllegalArgumentException, IOException{ + IAnalysisFactory af = IAnalysisFactory.create(); + ITreeFactory tf = af.createTreeFactory(); - String[] inpaths = new String[]{"theta", "theta top", "theta bottom"}; - String[] outpaths = new String[]{"form factors", "top only", "bottom only"}; - - for(int config = 0; config < 3; config ++){ - ITree treeNew = af.createTreeFactory().create(); + String[] inpaths = new String[]{"theta", "theta top", "theta bottom"}; + String[] outpaths = new String[]{"form factors", "top only", "bottom only"}; + + for(int config = 0; config < 3; config ++){ + ITree treeNew = af.createTreeFactory().create(); - IDataPointSetFactory dpsf = af.createDataPointSetFactory(treeNew); + IDataPointSetFactory dpsf = af.createDataPointSetFactory(treeNew); - IPlotterFactory pf = af.createPlotterFactory(); - IPlotter p = pf.create(outpaths[config]); + IPlotterFactory pf = af.createPlotterFactory(); + IPlotter p = pf.create(outpaths[config]); - int Nsets = arg.length/10; - dpsMeasured = new IDataPointSet[Nsets]; + int Nsets = arg.length/10; + dpsMeasured = new IDataPointSet[Nsets]; - for(int set = 0; set< Nsets; set++){ - String title = arg[0+10*set]; - String inputFile = arg[1+10*set]; - CustomBinning cb = new CustomBinning(new File(arg[2+10*set])); + for(int set = 0; set< Nsets; set++){ + String title = arg[0+10*set]; + String inputFile = arg[1+10*set]; + CustomBinning cb = new CustomBinning(new File(arg[2+10*set])); - double Q = Double.parseDouble(arg[3+10*set]); //in nC - double E = Double.parseDouble(arg[4+10*set]); //in GeV - double aDensity = Double.parseDouble(arg[5+10*set]); //in g/cm^2 - double M = Double.parseDouble(arg[6+10*set]); // in amu - double Z = Double.parseDouble(arg[7+10*set]); - double r = Double.parseDouble(arg[8+10*set]); - double prescale = Math.pow(2,Double.parseDouble(arg[9+10*set])); + double Q = Double.parseDouble(arg[3+10*set]); //in nC + double E = Double.parseDouble(arg[4+10*set]); //in GeV + double aDensity = Double.parseDouble(arg[5+10*set]); //in g/cm^2 + double M = Double.parseDouble(arg[6+10*set]); // in amu + double Z = Double.parseDouble(arg[7+10*set]); + double r = Double.parseDouble(arg[8+10*set]); + double prescale = Math.pow(2,Double.parseDouble(arg[9+10*set])); - double luminosity = Q*1e-9/q*aDensity/(M/Na)*1e-24; //nuclei per barn times # of beam electrons - - double scale = Math.pow((Z*alpha*hbarc)/(2*E), 2)/100; //this should be in barns - - if(config != 0) //one half of the detector only - scale /= 2; - double recoil = 2*E/(M*amu); + double luminosity = Q*1e-9/q*aDensity/(M/Na)*1e-24; //nuclei per barn times # of beam electrons + + double scale = Math.pow((Z*alpha*hbarc)/(2*E), 2)/100; //this should be in barns + + if(config != 0) //one half of the detector only + scale /= 2; + double recoil = 2*E/(M*amu); - //double luminosity = Double.parseDouble(arg[2]); - //double scale = Double.parseDouble(arg[3]); - //double recoil = Double.parseDouble(arg[4]); - //double r = Double.parseDouble(arg[5]); + //double luminosity = Double.parseDouble(arg[2]); + //double scale = Double.parseDouble(arg[3]); + //double recoil = Double.parseDouble(arg[4]); + //double r = Double.parseDouble(arg[5]); - ITree tree0 = tf.create(inputFile, "xml"); - //IHistogram1D hist_iso = (IHistogram1D) tree0.find("theta isolated "); - IHistogram1D hist = (IHistogram1D) tree0.find(inpaths[config]); - System.out.println(inpaths[config] + " " + title + " " + hist.binHeight(0)); + ITree tree0 = tf.create(inputFile, "xml"); + //IHistogram1D hist_iso = (IHistogram1D) tree0.find("theta isolated "); + IHistogram1D hist = (IHistogram1D) tree0.find(inpaths[config]); + System.out.println(inpaths[config] + " " + title + " " + hist.binHeight(0)); - dpsMeasured[set] = dpsf.create(title, 2); - //IDataPointSet dps_iso = dpsf.create("F(Q)^2 (measured isolated)", 2); + dpsMeasured[set] = dpsf.create(title, 2); + //IDataPointSet dps_iso = dpsf.create("F(Q)^2 (measured isolated)", 2); - if(set == 0) - dpsTheory = dpsf.create("theoretical", 2); + if(set == 0) + dpsTheory = dpsf.create("theoretical", 2); - int nBins = hist.axis().bins(); + int nBins = hist.axis().bins(); - for(int i = 0; i< nBins; i++){ - double thmax = cb.thetaMax[i]; - double thmin = cb.thetaMin[i]; - double n = hist.binHeight(i); - //double n_iso = hist_iso.binHeight(i); + for(int i = 0; i< nBins; i++){ + double thmax = cb.thetaMax[i]; + double thmin = cb.thetaMin[i]; + double n = hist.binHeight(i); + //double n_iso = hist_iso.binHeight(i); - //scale = Math.pow(74/137.*.2/(2*1.057), 2); - double mottInt = MottIntegral.mottIntegral(recoil, scale, i, cb); - double F2 =n*prescale/luminosity/mottInt; - double dF2 = Math.sqrt(n)*prescale/luminosity/mottInt; + //scale = Math.pow(74/137.*.2/(2*1.057), 2); + double mottInt = MottIntegral.mottIntegral(recoil, scale, i, cb); + double F2 =n*prescale/luminosity/mottInt; + double dF2 = Math.sqrt(n)*prescale/luminosity/mottInt; - //double F2_iso =n_iso*prescale/luminosity/mottInt; - //double dF2_iso = Math.sqrt(n_iso)*prescale/luminosity/mottInt; + //double F2_iso =n_iso*prescale/luminosity/mottInt; + //double dF2_iso = Math.sqrt(n_iso)*prescale/luminosity/mottInt; - IDataPoint dp = dpsMeasured[set].addPoint(); + IDataPoint dp = dpsMeasured[set].addPoint(); - double trigStuff = Math.pow(Math.sin((thmax+thmin)/4),2); - double Q2 = 4*E*E*trigStuff/(1+recoil*trigStuff); - double dQ2 = E*E*(thmax+thmin)*(thmax-thmin)*2; - dp.coordinate(0).setValue(Q2); - dp.coordinate(0).setErrorMinus(dQ2); - dp.coordinate(0).setErrorPlus(dQ2); - dp.coordinate(1).setValue(F2); - dp.coordinate(1).setErrorMinus(dF2); - dp.coordinate(1).setErrorPlus(dF2); + double trigStuff = Math.pow(Math.sin((thmax+thmin)/4),2); + double Q2 = 4*E*E*trigStuff/(1+recoil*trigStuff); + double dQ2 = E*E*(thmax+thmin)*(thmax-thmin)*2; + dp.coordinate(0).setValue(Q2); + dp.coordinate(0).setErrorMinus(dQ2); + dp.coordinate(0).setErrorPlus(dQ2); + dp.coordinate(1).setValue(F2); + dp.coordinate(1).setErrorMinus(dF2); + dp.coordinate(1).setErrorPlus(dF2); - /*dp = dps_iso.addPoint(); - dp.coordinate(0).setValue(Q2); - dp.coordinate(0).setErrorMinus(dQ2); - dp.coordinate(0).setErrorPlus(dQ2); - dp.coordinate(1).setValue(F2_iso); - dp.coordinate(1).setErrorMinus(dF2_iso); - dp.coordinate(1).setErrorPlus(dF2_iso); - */ - double F_calc = 0; - if(Z == 74){ - //double R = 5.373; - double R = 6.87; - F_calc = F_calc(Q2, R); - } else if(Z== 6){ - double rp = 0.8786; - double a = 1.64; - F_calc = F_calc_alt(Q2, 6,a, Math.sqrt(a*a*(1-1/12.)+rp*rp) ); - } + /*dp = dps_iso.addPoint(); + dp.coordinate(0).setValue(Q2); + dp.coordinate(0).setErrorMinus(dQ2); + dp.coordinate(0).setErrorPlus(dQ2); + dp.coordinate(1).setValue(F2_iso); + dp.coordinate(1).setErrorMinus(dF2_iso); + dp.coordinate(1).setErrorPlus(dF2_iso); + */ + double F_calc = 0; + if(Z == 74){ + //double R = 5.373; + double R = 6.87; + F_calc = F_calc(Q2, R); + } else if(Z== 6){ + double rp = 0.8786; + double a = 1.64; + F_calc = F_calc_alt(Q2, 6,a, Math.sqrt(a*a*(1-1/12.)+rp*rp) ); + } - if(set == 0){ - dp = dpsTheory.addPoint(); - dp.coordinate(0).setValue(Q2); - //double F_calc = 1-r*r*Q2/(6*hbarc*hbarc); - dp.coordinate(1).setValue(F_calc*F_calc); - dp.coordinate(1).setErrorMinus(0); - dp.coordinate(1).setErrorPlus(0); + if(set == 0){ + dp = dpsTheory.addPoint(); + dp.coordinate(0).setValue(Q2); + //double F_calc = 1-r*r*Q2/(6*hbarc*hbarc); + dp.coordinate(1).setValue(F_calc*F_calc); + dp.coordinate(1).setErrorMinus(0); + dp.coordinate(1).setErrorPlus(0); - } - //System.out.println(i + "\t" + thmin+ "\t" + thmax + "\t"+ F_calc*F_calc + "\t" + F2 + "\t" + dF2); + } + //System.out.println(i + "\t" + thmin+ "\t" + thmax + "\t"+ F_calc*F_calc + "\t" + F2 + "\t" + dF2); @@ -147,36 +147,36 @@ - } + } - p.region(0).plot(dpsMeasured[set]); + p.region(0).plot(dpsMeasured[set]); - //p.region(0).plot(dps_iso); - } - - IPlotterStyle style = StyleUtil.smoothCurveStyle(pf); - p.region(0).plot(dpsTheory, style); - StyleUtil.stylize(p.region(0), "Form Factors", "Q^2 (GeV^2)", "|F(Q^2)|^2"); - p.show(); - } + //p.region(0).plot(dps_iso); + } + + IPlotterStyle style = StyleUtil.smoothCurveStyle(pf); + p.region(0).plot(dpsTheory, style); + StyleUtil.stylize(p.region(0), "Form Factors", "Q^2 (GeV^2)", "|F(Q^2)|^2"); + p.show(); + } - } - static IDataPointSet dpsMeasured[]; - static IDataPointSet dpsTheory; + } + static IDataPointSet dpsMeasured[]; + static IDataPointSet dpsTheory; - static double F_calc(double Q2, double r){ - double x = Math.sqrt(Q2*r*r/(hbarc*hbarc)); - double F_calc = 3/(x*x*x)*(Math.sin(x)-x*Math.cos(x)); - return F_calc; - } + static double F_calc(double Q2, double r){ + double x = Math.sqrt(Q2*r*r/(hbarc*hbarc)); + double F_calc = 3/(x*x*x)*(Math.sin(x)-x*Math.cos(x)); + return F_calc; + } - static double F_calc_alt(double Q2, double Z, double a, double b){ - return (1-(Z-2)/(6*Z)*a*a*Q2/(hbarc*hbarc))*Math.exp(-1/4.*b*b*Q2/(hbarc*hbarc)); - } + static double F_calc_alt(double Q2, double Z, double a, double b){ + return (1-(Z-2)/(6*Z)*a*a*Q2/(hbarc*hbarc))*Math.exp(-1/4.*b*b*Q2/(hbarc*hbarc)); + } - void temp_test(){ - - } + void temp_test(){ + + } } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/FEESpectrumGenerator.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/FEESpectrumGenerator.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/FEESpectrumGenerator.java Wed Mar 9 11:43:24 2016 @@ -11,285 +11,285 @@ import static java.lang.Math.*; public class FEESpectrumGenerator { - /************* - * CONSTANTS * - *************/ - static double alpha = 1/137., hbarc = .197, q = 1.6e-19, Na= 6.022e23; - static double me = .000511; - static double amu = 931.4941; - - private static double sqrt2 = Math.sqrt(2); - - /*************** - * OTHER STUFF * - ***************/ - - static int counter = 0; - - static Random random = new Random(); - static double thetaMax = .1; - static double thetaMin = .03; - /** - * - * @return a random angle theta, with no form factor. - */ - public static double getRandomThetaBare(){ - double r = random.nextDouble(); - double dTheta = (thetaMax-thetaMin)/4; - double theta = (thetaMax+thetaMin)/2; - int nIter = 11; - for(int i = 0; i< nIter; i++){ - double x = MottIntegral.integral(a, theta); - double f = (x-xmin)/(xmax-xmin); - if(f<r){ - theta += dTheta; - } else if(f> r){ - theta -= dTheta; - } - dTheta /= 2; - } - return theta; - - - } - - static double combine(double theta, double rms){ - return theta + sqrt2 *rms*random.nextGaussian(); - } - - - /** - * - * @param a recoil factor = 2*E/M - * @return a random angle theta, with no form factor. - */ - public static double getRandomThetaWithFormFactor(FormFactor f){ - while(true){ - double theta = getRandomThetaBare(); - double trigstuff = pow(sin(theta/2), 2); - double Q2 = 4*E*E*trigstuff/(1+a*trigstuff); - counter ++; - double f2 = f.getFormFactorSquared(Q2); - if(f2 > random.nextDouble()) - return theta; - } - } - - - - static double b = -1; - - - - - static boolean radCorrections = false; - static int Nevents; - static double M, E, Q, aDensity; - static int Z; - static double a, xmax, xmin; - static boolean display; - - - private static CustomBinning cb; - public static void main(String arg[]) throws IOException{ - String filename = arg[0]; - M = Double.parseDouble(arg[1]); - E = Double.parseDouble(arg[2]); - thetaMin = Double.parseDouble(arg[3]); - thetaMax = Double.parseDouble(arg[4]); - Z = Integer.parseInt(arg[5]); - - String outfile = null; - aDensity = Double.parseDouble(arg[6]); - Q = Double.parseDouble(arg[7]); - - radCorrections = Boolean.parseBoolean(arg[8]); - - if(arg.length>9){ - display = true; - cb = new CustomBinning(new File(arg[9])); - outfile = arg[10]; - } - - - a = 2*E/(M*amu); - xmin = MottIntegral.integral(a, thetaMin); - xmax = MottIntegral.integral(a, thetaMax); - - double scale = Math.pow((Z*alpha*hbarc)/(2*E), 2)/100; //this should be in barns - double sigma = MottIntegral.mottIntegralWithFormFactor(a, scale, thetaMin, thetaMax, FormFactor.get(Z), 1000, E); - - double luminosity = Q*1e-9/q*aDensity/(M/Na)*1e-24; - Nevents = (int)(sigma*luminosity); - - - System.out.println(Nevents); - - String title = "fee"; - String comment = "fee"; - StdhepWriter writer = new StdhepWriter(filename, title, comment, Nevents); - IAnalysisFactory af = null; - ITree tree = null; - - if(display){ - af = IAnalysisFactory.create(); - tree = af.createTreeFactory().create(outfile,"xml",false,true); - IHistogramFactory hf = af.createHistogramFactory(tree); - - double thetaBins[] = new double[cb.nTheta+1]; - for(int i = 0; i<cb.nTheta; i++){ - thetaBins[i] = cb.thetaMin[i]; - } - - thetaBins[thetaBins.length-1] = cb.thetaMax[cb.nTheta-1]; - - thetaHist = hf.createHistogram1D("theta", "theta", thetaBins); - - EHist = hf.createHistogram1D("energy", 200, 0, 1.3); - IPlotter p = af.createPlotterFactory().create(); - p.createRegions(2,1); - p.region(0).plot(thetaHist); - p.region(1).plot(EHist); - p.show(); - } - - for(int i = 1; i<= Nevents; i++){ - int nevhep = i; - int nhep = 1; - int[] isthep = {1}; - int[] idhep = {11}; - int[] jmohep = {0,0}; - int[] jdahep = {0,0}; - double[] phep = randomMomentum(); - double[] vhep = {0,0,0,0}; - - - if(phep[3] > .5*E){ - StdhepEvent event = new StdhepEvent(nevhep, nhep, isthep, idhep, jmohep, jdahep, phep, vhep); - double smear = .02; - if(display) - EHist.fill(phep[3]*(1+random.nextGaussian()*smear)); - writer.writeRecord(event); - } - else{ // if the event has enough energy loss, - // write it out as a blank event. This way, - // slic doesnt have to deal with low energy electrons - // - StdhepEvent event = new StdhepEvent(i, 0, - new int[0], - new int[0], - new int[0], - new int[0], - new double[0], - new double[0]); - writer.writeRecord(event); - } - if(i%1000 == 0) - System.out.println("event " + i); - } - writer.close(); - if(tree != null) - tree.commit(); - - /* - String title = arg[0+10*set]; - String inputFile = arg[1+10*set]; - CustomBinning cb = new CustomBinning(new File(arg[2+10*set])); - - - double Q = Double.parseDouble(arg[3+10*set]); //in nC - double E = Double.parseDouble(arg[4+10*set]); //in GeV - double aDensity = Double.parseDouble(arg[5+10*set]); //in g/cm^2 - double M = Double.parseDouble(arg[6+10*set]); // in amu - double Z = Double.parseDouble(arg[7+10*set]); - double r = Double.parseDouble(arg[8+10*set]); - double prescale = Math.pow(2,Double.parseDouble(arg[9+10*set])); - */ - if(display){ - ExtractFormFactors.main(new String[]{ - "generated", - outfile, - arg[9], - Double.toString(Q), - Double.toString(E), - Double.toString(aDensity), - Double.toString(M), - Double.toString(Z), - "3", //not used - "0" //no prescale - - }); - - displayResiduals(); - - } - } - - private static void displayResiduals() { - IAnalysisFactory af = IAnalysisFactory.create(); - IDataPointSetFactory dpsf = af.createDataPointSetFactory(af.createTreeFactory().create()); - IDataPointSet residuals = dpsf.create("residuals", 2); - for(int i = 0; i<ExtractFormFactors.dpsMeasured[0].size(); i++){ - IDataPoint gen = ExtractFormFactors.dpsMeasured[0].point(i); - IDataPoint the = ExtractFormFactors.dpsTheory.point(i); - - IDataPoint res = residuals.addPoint(); - res.coordinate(0).setValue(gen.coordinate(0).value()); - res.coordinate(1).setValue(gen.coordinate(1).value()-the.coordinate(1).value()); - double err = Math.hypot(gen.coordinate(1).errorMinus(), the.coordinate(1).errorMinus()); - res.coordinate(1).setErrorMinus(err); - res.coordinate(1).setErrorPlus(err); - } - IPlotter p = af.createPlotterFactory().create(); - p.region(0).plot(residuals); - p.show(); - - } - - - - static IHistogram1D thetaHist = null, EHist; - - - - private static double[] randomMomentum() { - double theta = getRandomThetaWithFormFactor(FormFactor.get(Z)); - double phi = random.nextDouble()*2*PI-PI; - if(thetaHist != null) - if(cb.inRange(theta, phi)) - thetaHist.fill(theta); - double trigstuff = pow(sin(theta/2.), 2); - double Ep = E/(1+a*trigstuff); - double m = .000511; - - - - if(radCorrections){ - - // L.W. Mo, Y.S. Tsai, Radiative Corrections to Elastic and inelastic ep and $\mu$p scattering - // Stanford Linear Accelerator Center, Stanford University, Stanford, CA - // Reviews of Modern Physics Volume 41 Number 1, January 1969 - - //otherwise apply radiative corrections - double Q2 = 4*E*Ep*trigstuff; - - //effective number of pre and post radiation lengths caused by radiative effects - double t = 3/4.*(alpha/Math.PI)*(Math.log(Q2/(me*me)-1)); - - // rms theta for - double theta_rms = MultipleScattering.getThetaRMS(t, E); - theta = combine(theta, theta_rms); - - if(b == -1){ - b = MultipleScattering.b(Z); - } - double bt = b*t; - Ep *= MultipleScattering.getRandomEnergyFraction(bt)*MultipleScattering.getRandomEnergyFraction(bt); - - } - if(Double.isNaN(Ep)) - return null; - double p = sqrt(Ep*Ep-m*m); - return new double[]{p*sin(theta)*cos(phi), p*sin(theta)*sin(phi), p*cos(theta), Ep, m}; - } + /************* + * CONSTANTS * + *************/ + static double alpha = 1/137., hbarc = .197, q = 1.6e-19, Na= 6.022e23; + static double me = .000511; + static double amu = 931.4941; + + private static double sqrt2 = Math.sqrt(2); + + /*************** + * OTHER STUFF * + ***************/ + + static int counter = 0; + + static Random random = new Random(); + static double thetaMax = .1; + static double thetaMin = .03; + /** + * + * @return a random angle theta, with no form factor. + */ + public static double getRandomThetaBare(){ + double r = random.nextDouble(); + double dTheta = (thetaMax-thetaMin)/4; + double theta = (thetaMax+thetaMin)/2; + int nIter = 11; + for(int i = 0; i< nIter; i++){ + double x = MottIntegral.integral(a, theta); + double f = (x-xmin)/(xmax-xmin); + if(f<r){ + theta += dTheta; + } else if(f> r){ + theta -= dTheta; + } + dTheta /= 2; + } + return theta; + + + } + + static double combine(double theta, double rms){ + return theta + sqrt2 *rms*random.nextGaussian(); + } + + + /** + * + * @param a recoil factor = 2*E/M + * @return a random angle theta, with no form factor. + */ + public static double getRandomThetaWithFormFactor(FormFactor f){ + while(true){ + double theta = getRandomThetaBare(); + double trigstuff = pow(sin(theta/2), 2); + double Q2 = 4*E*E*trigstuff/(1+a*trigstuff); + counter ++; + double f2 = f.getFormFactorSquared(Q2); + if(f2 > random.nextDouble()) + return theta; + } + } + + + + static double b = -1; + + + + + static boolean radCorrections = false; + static int Nevents; + static double M, E, Q, aDensity; + static int Z; + static double a, xmax, xmin; + static boolean display; + + + private static CustomBinning cb; + public static void main(String arg[]) throws IOException{ + String filename = arg[0]; + M = Double.parseDouble(arg[1]); + E = Double.parseDouble(arg[2]); + thetaMin = Double.parseDouble(arg[3]); + thetaMax = Double.parseDouble(arg[4]); + Z = Integer.parseInt(arg[5]); + + String outfile = null; + aDensity = Double.parseDouble(arg[6]); + Q = Double.parseDouble(arg[7]); + + radCorrections = Boolean.parseBoolean(arg[8]); + + if(arg.length>9){ + display = true; + cb = new CustomBinning(new File(arg[9])); + outfile = arg[10]; + } + + + a = 2*E/(M*amu); + xmin = MottIntegral.integral(a, thetaMin); + xmax = MottIntegral.integral(a, thetaMax); + + double scale = Math.pow((Z*alpha*hbarc)/(2*E), 2)/100; //this should be in barns + double sigma = MottIntegral.mottIntegralWithFormFactor(a, scale, thetaMin, thetaMax, FormFactor.get(Z), 1000, E); + + double luminosity = Q*1e-9/q*aDensity/(M/Na)*1e-24; + Nevents = (int)(sigma*luminosity); + + + System.out.println(Nevents); + + String title = "fee"; + String comment = "fee"; + StdhepWriter writer = new StdhepWriter(filename, title, comment, Nevents); + IAnalysisFactory af = null; + ITree tree = null; + + if(display){ + af = IAnalysisFactory.create(); + tree = af.createTreeFactory().create(outfile,"xml",false,true); + IHistogramFactory hf = af.createHistogramFactory(tree); + + double thetaBins[] = new double[cb.nTheta+1]; + for(int i = 0; i<cb.nTheta; i++){ + thetaBins[i] = cb.thetaMin[i]; + } + + thetaBins[thetaBins.length-1] = cb.thetaMax[cb.nTheta-1]; + + thetaHist = hf.createHistogram1D("theta", "theta", thetaBins); + + EHist = hf.createHistogram1D("energy", 200, 0, 1.3); + IPlotter p = af.createPlotterFactory().create(); + p.createRegions(2,1); + p.region(0).plot(thetaHist); + p.region(1).plot(EHist); + p.show(); + } + + for(int i = 1; i<= Nevents; i++){ + int nevhep = i; + int nhep = 1; + int[] isthep = {1}; + int[] idhep = {11}; + int[] jmohep = {0,0}; + int[] jdahep = {0,0}; + double[] phep = randomMomentum(); + double[] vhep = {0,0,0,0}; + + + if(phep[3] > .5*E){ + StdhepEvent event = new StdhepEvent(nevhep, nhep, isthep, idhep, jmohep, jdahep, phep, vhep); + double smear = .02; + if(display) + EHist.fill(phep[3]*(1+random.nextGaussian()*smear)); + writer.writeRecord(event); + } + else{ // if the event has enough energy loss, + // write it out as a blank event. This way, + // slic doesnt have to deal with low energy electrons + // + StdhepEvent event = new StdhepEvent(i, 0, + new int[0], + new int[0], + new int[0], + new int[0], + new double[0], + new double[0]); + writer.writeRecord(event); + } + if(i%1000 == 0) + System.out.println("event " + i); + } + writer.close(); + if(tree != null) + tree.commit(); + + /* + String title = arg[0+10*set]; + String inputFile = arg[1+10*set]; + CustomBinning cb = new CustomBinning(new File(arg[2+10*set])); + + + double Q = Double.parseDouble(arg[3+10*set]); //in nC + double E = Double.parseDouble(arg[4+10*set]); //in GeV + double aDensity = Double.parseDouble(arg[5+10*set]); //in g/cm^2 + double M = Double.parseDouble(arg[6+10*set]); // in amu + double Z = Double.parseDouble(arg[7+10*set]); + double r = Double.parseDouble(arg[8+10*set]); + double prescale = Math.pow(2,Double.parseDouble(arg[9+10*set])); + */ + if(display){ + ExtractFormFactors.main(new String[]{ + "generated", + outfile, + arg[9], + Double.toString(Q), + Double.toString(E), + Double.toString(aDensity), + Double.toString(M), + Double.toString(Z), + "3", //not used + "0" //no prescale + + }); + + displayResiduals(); + + } + } + + private static void displayResiduals() { + IAnalysisFactory af = IAnalysisFactory.create(); + IDataPointSetFactory dpsf = af.createDataPointSetFactory(af.createTreeFactory().create()); + IDataPointSet residuals = dpsf.create("residuals", 2); + for(int i = 0; i<ExtractFormFactors.dpsMeasured[0].size(); i++){ + IDataPoint gen = ExtractFormFactors.dpsMeasured[0].point(i); + IDataPoint the = ExtractFormFactors.dpsTheory.point(i); + + IDataPoint res = residuals.addPoint(); + res.coordinate(0).setValue(gen.coordinate(0).value()); + res.coordinate(1).setValue(gen.coordinate(1).value()-the.coordinate(1).value()); + double err = Math.hypot(gen.coordinate(1).errorMinus(), the.coordinate(1).errorMinus()); + res.coordinate(1).setErrorMinus(err); + res.coordinate(1).setErrorPlus(err); + } + IPlotter p = af.createPlotterFactory().create(); + p.region(0).plot(residuals); + p.show(); + + } + + + + static IHistogram1D thetaHist = null, EHist; + + + + private static double[] randomMomentum() { + double theta = getRandomThetaWithFormFactor(FormFactor.get(Z)); + double phi = random.nextDouble()*2*PI-PI; + if(thetaHist != null) + if(cb.inRange(theta, phi)) + thetaHist.fill(theta); + double trigstuff = pow(sin(theta/2.), 2); + double Ep = E/(1+a*trigstuff); + double m = .000511; + + + + if(radCorrections){ + + // L.W. Mo, Y.S. Tsai, Radiative Corrections to Elastic and inelastic ep and $\mu$p scattering + // Stanford Linear Accelerator Center, Stanford University, Stanford, CA + // Reviews of Modern Physics Volume 41 Number 1, January 1969 + + //otherwise apply radiative corrections + double Q2 = 4*E*Ep*trigstuff; + + //effective number of pre and post radiation lengths caused by radiative effects + double t = 3/4.*(alpha/Math.PI)*(Math.log(Q2/(me*me)-1)); + + // rms theta for + double theta_rms = MultipleScattering.getThetaRMS(t, E); + theta = combine(theta, theta_rms); + + if(b == -1){ + b = MultipleScattering.b(Z); + } + double bt = b*t; + Ep *= MultipleScattering.getRandomEnergyFraction(bt)*MultipleScattering.getRandomEnergyFraction(bt); + + } + if(Double.isNaN(Ep)) + return null; + double p = sqrt(Ep*Ep-m*m); + return new double[]{p*sin(theta)*cos(phi), p*sin(theta)*sin(phi), p*cos(theta), Ep, m}; + } } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/FormFactor.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/FormFactor.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/FormFactor.java Wed Mar 9 11:43:24 2016 @@ -2,42 +2,42 @@ public abstract class FormFactor { - abstract double getFormFactor(double q2); + abstract double getFormFactor(double q2); - double getFormFactorSquared(double q2){ - return Math.pow(getFormFactor(q2), 2); - } - static double hbarc = .197; - static FormFactor carbon = new FormFactor(){ + double getFormFactorSquared(double q2){ + return Math.pow(getFormFactor(q2), 2); + } + static double hbarc = .197; + static FormFactor carbon = new FormFactor(){ - @Override - public double getFormFactor(double Q2) { - double Z= 6; - double rp = 0.8786; - double a = 1.64; - double b = Math.sqrt(a*a*(1-1/12.)+rp*rp); - return (1-(Z-2)/(6*Z)*a*a*Q2/(hbarc*hbarc))*Math.exp(-1/4.*b*b*Q2/(hbarc*hbarc)); - } + @Override + public double getFormFactor(double Q2) { + double Z= 6; + double rp = 0.8786; + double a = 1.64; + double b = Math.sqrt(a*a*(1-1/12.)+rp*rp); + return (1-(Z-2)/(6*Z)*a*a*Q2/(hbarc*hbarc))*Math.exp(-1/4.*b*b*Q2/(hbarc*hbarc)); + } - }; - static FormFactor tungsten = new FormFactor(){ + }; + static FormFactor tungsten = new FormFactor(){ - @Override - public double getFormFactor(double Q2) { - double Z= 74; - double r = 6.87; - double x = Math.sqrt(Q2*r*r/(hbarc*hbarc)); - double F_calc = 3/(x*x*x)*(Math.sin(x)-x*Math.cos(x)); - return F_calc; - } - - }; - static FormFactor get(int Z){ - if(Z == 6) - return carbon; - if(Z == 74) - return tungsten; - System.err.println("Form Factor for " + Z + " not implemented"); - return null; - } + @Override + public double getFormFactor(double Q2) { + double Z= 74; + double r = 6.87; + double x = Math.sqrt(Q2*r*r/(hbarc*hbarc)); + double F_calc = 3/(x*x*x)*(Math.sin(x)-x*Math.cos(x)); + return F_calc; + } + + }; + static FormFactor get(int Z){ + if(Z == 6) + return carbon; + if(Z == 74) + return tungsten; + System.err.println("Form Factor for " + Z + " not implemented"); + return null; + } } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/MakeHistograms.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/MakeHistograms.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/MakeHistograms.java Wed Mar 9 11:43:24 2016 @@ -35,448 +35,448 @@ import org.hps.users.spaul.StyleUtil; public class MakeHistograms { - - - - static boolean display = false; - static CustomBinning cb; - public static void main(String arg[]) throws IllegalArgumentException, IOException{ - if(arg.length == 1){ - File file = new File(arg[0]); - String path = arg[0]; - if(file.isDirectory()){ - org.hps.users.spaul.SumEverything.main(new String[]{path, "temp.aida"}); - path = "temp.aida"; - } - IAnalysisFactory af = IAnalysisFactory.create(); - ITreeFactory tf = af.createTreeFactory(); - ITree tree0 = tf.create(path, "xml"); - extractHistograms(tree0); - setupPlotter(af); - - } else{ - - String input = arg[0]; - String output = arg[1]; - cb = new CustomBinning(new File(arg[2])); - if(arg[arg.length -1].equals("display")) - display = true; - IAnalysisFactory af = IAnalysisFactory.create(); - ITree tree = af.createTreeFactory().create(output,"xml",false,true); - IHistogramFactory hf = af.createHistogramFactory(tree); - setupHistograms(hf); - if(display){ - setupPlotter(af); - } - ConditionsDriver hack = new ConditionsDriver(); - //hack.setXmlConfigResource("/u/group/hps/hps_soft/detector-data/detectors/HPS-EngRun2015-Nominal-v3"); - hack.setDetectorName("HPS-EngRun2015-Nominal-v3"); - hack.setFreeze(true); - hack.setRunNumber(Integer.parseInt(arg[3])); - - hack.initialize(); - beamTiltY = Double.parseDouble(arg[4]); - beamTiltX = Double.parseDouble(arg[5]); - LCIOReader reader = new LCIOReader(new File(input)); - //reader.open(input); - //reader. - EventHeader event = reader.read(); - int nEvents = 0; - try{ - outer : while(event != null){ - processEvent(event); - - //System.out.println(Q2); - - event = reader.read(); - } - } catch (Exception e){ - e.printStackTrace(); - } - tree.commit(); - tree.close(); - } - - } - - static IHistogram2D h1, h2, h2a, h2b, h2c; - static IHistogram2D h4,h4a; - static IHistogram1D h3, /*h3a,*/ h3_t, h3_b; - static IHistogram1D h5, h5a; - //static IHistogram2D h6, h6a; - static IHistogram1D h7, h7a; - static IHistogram1D h8; - static IHistogram1D h9_t, h9_b; - static IHistogram1D h10_t, h10_b; - private static IHistogram1D h4y; - - private static void extractHistograms(ITree tree0) { - h1 = (IHistogram2D) tree0.find("theta vs energy"); - - h2 = (IHistogram2D) tree0.find("theta vs phi"); - h2a = (IHistogram2D) tree0.find("theta vs phi cut"); - h2b = (IHistogram2D) tree0.find("theta vs phi cut alt"); - h2c = (IHistogram2D) tree0.find("theta vs phi alt"); - - h3 = (IHistogram1D) tree0.find("theta"); - //h3a = (IHistogram1D) tree0.find("theta isolated "); - h3_t = (IHistogram1D) tree0.find("theta top"); - h3_b = (IHistogram1D) tree0.find("theta bottom"); - - h4 = (IHistogram2D) tree0.find("px\\/pz vs py\\/pz"); - h4a = (IHistogram2D) tree0.find("px\\/pz vs py\\/pz cut"); - System.out.println(h4a.xAxis().bins()); - h5 = (IHistogram1D) tree0.find("energy top"); - h5 = (IHistogram1D) tree0.find("energy bottom"); - -// h6 = (IHistogram2D) tree0.find("cluster"); -// h6a = (IHistogram2D) tree0.find("cluster matched"); - h7 = (IHistogram1D) tree0.find("y top"); - h7a = (IHistogram1D) tree0.find("y bottom"); - h8 = (IHistogram1D) tree0.find("seed energy"); - - - h9_t = (IHistogram1D) tree0.find("pz top"); - h9_b = (IHistogram1D) tree0.find("pz bottom"); - - - h10_t = (IHistogram1D) tree0.find("clustsize top"); - h10_b = (IHistogram1D) tree0.find("clustsize bottom"); - - } - static void setupHistograms(IHistogramFactory hf){ - //h1 = hf.createHistogram2D("px\\/pz vs py\\/pz", 160, -.16, .24, 160, -.2, .2); - - - - - h2 = hf.createHistogram2D("theta vs phi", 300, 0, .3, 314, -3.14, 3.14); - - h2a = hf.createHistogram2D("theta vs phi cut", 300, 0, .3, 314, -3.14, 3.14); - - double thetaBins[] = new double[cb.nTheta+1]; - for(int i = 0; i<cb.nTheta; i++){ - thetaBins[i] = cb.thetaMin[i]; - } - - thetaBins[thetaBins.length-1] = cb.thetaMax[cb.nTheta-1]; - - double phiBins[] = new double[315]; - for(int i = 0; i<315; i++){ - phiBins[i] = i/50.-3.14; //every 10 mrad; - } - - double eBins[] = new double[66]; - for(int i = 0; i<66; i++){ - eBins[i] = i/50.; //every 20 MeV up to 1300 MeV - } - - - h1 = hf.createHistogram2D("theta vs energy", "theta vs energy", thetaBins, eBins); - - - //identical to h2a, except different binning - h2b = hf.createHistogram2D("theta vs phi cut alt", "theta vs phi cut alt", thetaBins, phiBins); - h2c = hf.createHistogram2D("theta vs phi alt", "theta vs phi alt", thetaBins, phiBins); - - h3 = hf.createHistogram1D("theta", "theta", thetaBins); -// h3a = hf.createHistogram1D("theta isolated ", "theta isolated", thetaBins); - - h3_t = hf.createHistogram1D("theta top", "theta top", thetaBins); - h3_b = hf.createHistogram1D("theta bottom", "theta bottom", thetaBins); - - - h4 = hf.createHistogram2D("px\\/pz vs py\\/pz", 300, -.16, .24, 300, -.2, .2); - h4a = hf.createHistogram2D("px\\/pz vs py\\/pz cut", 300, -.16, .24, 300, -.2, .2); - h4y = hf.createHistogram1D("py\\pz", 1200, -.06, .06); - - h5 = hf.createHistogram1D("energy top", 75, 0, 1.5); - h5a = hf.createHistogram1D("energy bottom", 75, 0, 1.5); - - - h9_t = hf.createHistogram1D("pz top", 75, 0, 1.5); - h9_b = hf.createHistogram1D("pz bottom", 75, 0, 1.5); - -// h6 = hf.createHistogram2D("cluster", 47, -23.5, 23.5, 11, -5.5, 5.5); -// h6a = hf.createHistogram2D("cluster matched", 47, -23.5, 23.5, 11, -5.5, 5.5); - - h7 = hf.createHistogram1D("y top", 500, 0, 100); - - h7a = hf.createHistogram1D("y bottom", 500, 0, 100); - - h8 = hf.createHistogram1D("seed energy", 120, 0, 1.2); - - h10_t = hf.createHistogram1D("clustsize top", 10,0, 10); - h10_b = hf.createHistogram1D("clustsize bottom", 10,0, 10); - } - static void setupPlotter(IAnalysisFactory af){ - IPlotterFactory pf = af.createPlotterFactory(); - IPlotter p = pf.create(); - p.createRegions(2,2); - p.region(0).plot(h2); - StyleUtil.stylize(p.region(0), "theta", "phi"); -// p.region(1).plot(h3a); - StyleUtil.stylize(p.region(1), "theta", "# of particles"); - p.region(2).plot(h9_t); - p.region(2).plot(h9_b); - StyleUtil.noFillHistogramBars(p.region(2)); - StyleUtil.stylize(p.region(2), "pztilt" ,"pztilt", "# of particles"); - p.region(3).plot(h5); - p.region(3).plot(h5a); - StyleUtil.noFillHistogramBars(p.region(3)); - StyleUtil.stylize(p.region(3), "energy", "# of particles"); - - p.show(); - - //new window for the next plot - IPlotter p2 = pf.create(); - p2.region(0).plot(h2b); - //IDataPointSetFactory dpsf = af.createDataPointSetFactory(af.createTreeFactory().create()); - - StyleUtil.stylize(p2.region(0), "theta", "phi"); - - p2.show(); - - //new window for the next plot - IPlotter p3 = pf.create(); - p3.region(0).plot(h2c); - StyleUtil.stylize(p3.region(0), "theta", "phi"); - - p3.show(); - - //new window for the next plot - IPlotter p4 = pf.create(); - p4.region(0).plot(h4); - StyleUtil.stylize(p4.region(0), "px/pz", "py/pz"); - - p4.show(); - - //new window for the next plot - IPlotter p5 = pf.create(); - p5.region(0).plot(h4a); - StyleUtil.stylize(p5.region(0), "px/pz", "py/pz"); - - p5.show(); - - IPlotter p6 = pf.create("efficiency"); - p6.createRegions(1,2); -// p6.region(0).plot(h6); - StyleUtil.stylize(p6.region(0), "ix", "iy"); -// p6.region(1).plot(h6a); - StyleUtil.stylize(p6.region(1), "ix", "iy"); - p6.show(); - - IPlotter p7 = pf.create("theta vs energy"); - //p6.createRegions(1,2); - p7.region(0).plot(h1); - StyleUtil.stylize(p7.region(0), "theta", "energy"); - // StyleUtil.stylize(p6.region(1), "ix", "iy"); - p7.show(); - - IPlotter p8 = pf.create("y"); - //p6.createRegions(1,2); - p8.region(0).plot(h7); - p8.region(0).plot(h7a); - StyleUtil.stylize(p8.region(0), "y", "# of particles"); - // StyleUtil.stylize(p6.region(1), "ix", "iy"); - p8.show(); - - IPlotter p9 = pf.create("theta: top vs. bottom"); - //p6.createRegions(1,2); - p9.region(0).plot(h3_t); - p9.region(0).plot(h3_b); - StyleUtil.stylize(p9.region(0), "theta", "theta", "# of particles"); - StyleUtil.noFillHistogramBars(p9.region(0)); - //StyleUtil.stylize(p6.region(1), "ix", "iy"); - p9.show(); - - IPlotter p10 = pf.create("seed energy"); - //p6.createRegions(1,2); - p10.createRegions(2,1); - p10.region(0).plot(h8); - StyleUtil.stylize(p10.region(0), "seed energy", "seed energy (GeV)", "# of particles"); - - p10.region(1).plot(h10_t); - p10.region(1).plot(h10_b); - StyleUtil.noFillHistogramBars(p10.region(1)); - StyleUtil.stylize(p10.region(1), "clust size", "n ecal hits", "# of particles"); - - //StyleUtil.noFillHistogramBars(p10.region(0)); - //StyleUtil.stylize(p6.region(1), "ix", "iy"); - p10.show(); - - } - private static void processEvent(EventHeader event) { - if(event.getEventNumber() %10000 == 0) - System.out.println("event number " + event.getEventNumber()); - - for (GenericObject gob : event.get(GenericObject.class,"TriggerBank")) - { - if (!(AbstractIntData.getTag(gob) == TIData.BANK_TAG)) continue; - TIData tid = new TIData(gob); - if (!tid.isSingle1Trigger()) - { - return; - } - } - List<ReconstructedParticle> particles = event.get(ReconstructedParticle.class, "FinalStateParticles"); - particles = RemoveDuplicateParticles.removeDuplicateParticles(particles); - outer : for(ReconstructedParticle p : particles){ - - - boolean isGood = addParticle(p); - - - } - - } - - - - static double eMin = .8; - static double eMax = 1.2; - static double beamEnergy = 1.057; - - static double beamTiltX = .03057; - static double beamTiltY; - static double maxChi2 = 50; - //maximum difference between the reconstructed energy and momentum - static double maxdE = .5; - - static double seedEnergyCut = .4; - - - static boolean addParticle(ReconstructedParticle part){ - if(part.getTracks().size() != 0){ - if(part.getMomentum().magnitudeSquared() > .8 - && part.getTracks().get(0).getChi2() > maxChi2){ - h4y.fill(part.getMomentum().y()/part.getMomentum().z()); - } - } - if(part.getCharge() != -1) - return false; - if(part.getClusters().size() == 0) - return false; - Cluster c = part.getClusters().get(0); - double time = c.getCalorimeterHits().get(0).getTime(); - - if(!(time>40 && time <50)) - return false; - double seedEnergy = 0; - for(CalorimeterHit hit : c.getCalorimeterHits()){ - if(hit.getCorrectedEnergy() > seedEnergy) - seedEnergy = hit.getCorrectedEnergy(); - } - h8.fill(seedEnergy); - - - if(seedEnergy < seedEnergyCut) - return false; - - if(c.getPosition()[1] > 0){ - h10_t.fill(c.getSize()); - } - else{ - h10_b.fill(c.getSize()); - } - - - if(c.getCalorimeterHits().size() < 3) - return false; - - - if(c.getEnergy() > eMin && c.getEnergy() < eMax){ - if(c.getPosition()[1] > 0) - h7.fill(c.getPosition()[1]); - else if(c.getPosition()[1] < 0) - h7a.fill(-c.getPosition()[1]); - } - - if(EcalUtil.fid_ECal(c)){ - - if(c.getPosition()[1] > 0){ - h5.fill(c.getEnergy()); - } - else{ - h5a.fill(c.getEnergy()); - } - if(part.getTracks().size() == 0) - return false; - Track t = part.getTracks().get(0); - if(t.getChi2()>maxChi2){ - return false; - } - if(!TrackType.isGBL(t.getType())) - return false; - - - - Hep3Vector p = part.getMomentum(); - - - - double px = p.x(), pz = p.z(); - double pxtilt = px*Math.cos(beamTiltX)-pz*Math.sin(beamTiltX); - double py = p.y(); - double pztilt = pz*Math.cos(beamTiltX)+px*Math.sin(beamTiltX); - - double pytilt = py*Math.cos(beamTiltY)-pztilt*Math.sin(beamTiltY); - pztilt = pz*Math.cos(beamTiltY) + pytilt*Math.sin(beamTiltY); - - if(Math.abs(pztilt - c.getEnergy()) > maxdE) - return false; - if(c.getPosition()[1] > 0) - h9_t.fill(pztilt); - else - h9_b.fill(pztilt); - - double theta = Math.atan(Math.hypot(pxtilt, pytilt)/pztilt); - double phi =Math.atan2(pytilt, pxtilt); - boolean inRange = cb.inRange(theta, phi); - if(inRange) - h1.fill(theta, c.getEnergy()); - - - - if(c.getEnergy() > eMin && c.getEnergy() < eMax) { - - - - h2.fill(theta, phi); - h2c.fill(theta, phi); - - h4.fill(px/pz, py/pz); - //h4y.fill(py/pz); - - if(inRange){ - - //System.out.println(c.getEnergy() + " " + t.getType()); - /*for(TrackState ts : t.getTrackStates()){ - if(ts.getLocation() == TrackState.AtIP) - System.out.println(Arrays.toString( - ts.getReferencePoint())); - }*/ - h2a.fill(theta, phi); - h2b.fill(theta, phi); - - h3.fill(theta); - if(py > 0) - h3_t.fill(theta); - else - h3_b.fill(theta); - //if(h3_t.sumBinHeights()+h3_b.sumBinHeights() != h3.sumBinHeights()) - //System.out.println("NABO ERROR"); - - - h4a.fill(px/pz, py/pz); - } - - - return true; - } - - } - return false; - } - + + + + static boolean display = false; + static CustomBinning cb; + public static void main(String arg[]) throws IllegalArgumentException, IOException{ + if(arg.length == 1){ + File file = new File(arg[0]); + String path = arg[0]; + if(file.isDirectory()){ + org.hps.users.spaul.SumEverything.main(new String[]{path, "temp.aida"}); + path = "temp.aida"; + } + IAnalysisFactory af = IAnalysisFactory.create(); + ITreeFactory tf = af.createTreeFactory(); + ITree tree0 = tf.create(path, "xml"); + extractHistograms(tree0); + setupPlotter(af); + + } else{ + + String input = arg[0]; + String output = arg[1]; + cb = new CustomBinning(new File(arg[2])); + if(arg[arg.length -1].equals("display")) + display = true; + IAnalysisFactory af = IAnalysisFactory.create(); + ITree tree = af.createTreeFactory().create(output,"xml",false,true); + IHistogramFactory hf = af.createHistogramFactory(tree); + setupHistograms(hf); + if(display){ + setupPlotter(af); + } + ConditionsDriver hack = new ConditionsDriver(); + //hack.setXmlConfigResource("/u/group/hps/hps_soft/detector-data/detectors/HPS-EngRun2015-Nominal-v3"); + hack.setDetectorName("HPS-EngRun2015-Nominal-v3"); + hack.setFreeze(true); + hack.setRunNumber(Integer.parseInt(arg[3])); + + hack.initialize(); + beamTiltY = Double.parseDouble(arg[4]); + beamTiltX = Double.parseDouble(arg[5]); + LCIOReader reader = new LCIOReader(new File(input)); + //reader.open(input); + //reader. + EventHeader event = reader.read(); + int nEvents = 0; + try{ + outer : while(event != null){ + processEvent(event); + + //System.out.println(Q2); + + event = reader.read(); + } + } catch (Exception e){ + e.printStackTrace(); + } + tree.commit(); + tree.close(); + } + + } + + static IHistogram2D h1, h2, h2a, h2b, h2c; + static IHistogram2D h4,h4a; + static IHistogram1D h3, /*h3a,*/ h3_t, h3_b; + static IHistogram1D h5, h5a; + //static IHistogram2D h6, h6a; + static IHistogram1D h7, h7a; + static IHistogram1D h8; + static IHistogram1D h9_t, h9_b; + static IHistogram1D h10_t, h10_b; + private static IHistogram1D h4y; + + private static void extractHistograms(ITree tree0) { + h1 = (IHistogram2D) tree0.find("theta vs energy"); + + h2 = (IHistogram2D) tree0.find("theta vs phi"); + h2a = (IHistogram2D) tree0.find("theta vs phi cut"); + h2b = (IHistogram2D) tree0.find("theta vs phi cut alt"); + h2c = (IHistogram2D) tree0.find("theta vs phi alt"); + + h3 = (IHistogram1D) tree0.find("theta"); + //h3a = (IHistogram1D) tree0.find("theta isolated "); + h3_t = (IHistogram1D) tree0.find("theta top"); + h3_b = (IHistogram1D) tree0.find("theta bottom"); + + h4 = (IHistogram2D) tree0.find("px\\/pz vs py\\/pz"); + h4a = (IHistogram2D) tree0.find("px\\/pz vs py\\/pz cut"); + System.out.println(h4a.xAxis().bins()); + h5 = (IHistogram1D) tree0.find("energy top"); + h5 = (IHistogram1D) tree0.find("energy bottom"); + +// h6 = (IHistogram2D) tree0.find("cluster"); +// h6a = (IHistogram2D) tree0.find("cluster matched"); + h7 = (IHistogram1D) tree0.find("y top"); + h7a = (IHistogram1D) tree0.find("y bottom"); + h8 = (IHistogram1D) tree0.find("seed energy"); + + + h9_t = (IHistogram1D) tree0.find("pz top"); + h9_b = (IHistogram1D) tree0.find("pz bottom"); + + + h10_t = (IHistogram1D) tree0.find("clustsize top"); + h10_b = (IHistogram1D) tree0.find("clustsize bottom"); + + } + static void setupHistograms(IHistogramFactory hf){ + //h1 = hf.createHistogram2D("px\\/pz vs py\\/pz", 160, -.16, .24, 160, -.2, .2); + + + + + h2 = hf.createHistogram2D("theta vs phi", 300, 0, .3, 314, -3.14, 3.14); + + h2a = hf.createHistogram2D("theta vs phi cut", 300, 0, .3, 314, -3.14, 3.14); + + double thetaBins[] = new double[cb.nTheta+1]; + for(int i = 0; i<cb.nTheta; i++){ + thetaBins[i] = cb.thetaMin[i]; + } + + thetaBins[thetaBins.length-1] = cb.thetaMax[cb.nTheta-1]; + + double phiBins[] = new double[315]; + for(int i = 0; i<315; i++){ + phiBins[i] = i/50.-3.14; //every 10 mrad; + } + + double eBins[] = new double[66]; + for(int i = 0; i<66; i++){ + eBins[i] = i/50.; //every 20 MeV up to 1300 MeV + } + + + h1 = hf.createHistogram2D("theta vs energy", "theta vs energy", thetaBins, eBins); + + + //identical to h2a, except different binning + h2b = hf.createHistogram2D("theta vs phi cut alt", "theta vs phi cut alt", thetaBins, phiBins); + h2c = hf.createHistogram2D("theta vs phi alt", "theta vs phi alt", thetaBins, phiBins); + + h3 = hf.createHistogram1D("theta", "theta", thetaBins); +// h3a = hf.createHistogram1D("theta isolated ", "theta isolated", thetaBins); + + h3_t = hf.createHistogram1D("theta top", "theta top", thetaBins); + h3_b = hf.createHistogram1D("theta bottom", "theta bottom", thetaBins); + + + h4 = hf.createHistogram2D("px\\/pz vs py\\/pz", 300, -.16, .24, 300, -.2, .2); + h4a = hf.createHistogram2D("px\\/pz vs py\\/pz cut", 300, -.16, .24, 300, -.2, .2); + h4y = hf.createHistogram1D("py\\pz", 1200, -.06, .06); + + h5 = hf.createHistogram1D("energy top", 75, 0, 1.5); + h5a = hf.createHistogram1D("energy bottom", 75, 0, 1.5); + + + h9_t = hf.createHistogram1D("pz top", 75, 0, 1.5); + h9_b = hf.createHistogram1D("pz bottom", 75, 0, 1.5); + +// h6 = hf.createHistogram2D("cluster", 47, -23.5, 23.5, 11, -5.5, 5.5); +// h6a = hf.createHistogram2D("cluster matched", 47, -23.5, 23.5, 11, -5.5, 5.5); + + h7 = hf.createHistogram1D("y top", 500, 0, 100); + + h7a = hf.createHistogram1D("y bottom", 500, 0, 100); + + h8 = hf.createHistogram1D("seed energy", 120, 0, 1.2); + + h10_t = hf.createHistogram1D("clustsize top", 10,0, 10); + h10_b = hf.createHistogram1D("clustsize bottom", 10,0, 10); + } + static void setupPlotter(IAnalysisFactory af){ + IPlotterFactory pf = af.createPlotterFactory(); + IPlotter p = pf.create(); + p.createRegions(2,2); + p.region(0).plot(h2); + StyleUtil.stylize(p.region(0), "theta", "phi"); +// p.region(1).plot(h3a); + StyleUtil.stylize(p.region(1), "theta", "# of particles"); + p.region(2).plot(h9_t); + p.region(2).plot(h9_b); + StyleUtil.noFillHistogramBars(p.region(2)); + StyleUtil.stylize(p.region(2), "pztilt" ,"pztilt", "# of particles"); + p.region(3).plot(h5); + p.region(3).plot(h5a); + StyleUtil.noFillHistogramBars(p.region(3)); + StyleUtil.stylize(p.region(3), "energy", "# of particles"); + + p.show(); + + //new window for the next plot + IPlotter p2 = pf.create(); + p2.region(0).plot(h2b); + //IDataPointSetFactory dpsf = af.createDataPointSetFactory(af.createTreeFactory().create()); + + StyleUtil.stylize(p2.region(0), "theta", "phi"); + + p2.show(); + + //new window for the next plot + IPlotter p3 = pf.create(); + p3.region(0).plot(h2c); + StyleUtil.stylize(p3.region(0), "theta", "phi"); + + p3.show(); + + //new window for the next plot + IPlotter p4 = pf.create(); + p4.region(0).plot(h4); + StyleUtil.stylize(p4.region(0), "px/pz", "py/pz"); + + p4.show(); + + //new window for the next plot + IPlotter p5 = pf.create(); + p5.region(0).plot(h4a); + StyleUtil.stylize(p5.region(0), "px/pz", "py/pz"); + + p5.show(); + + IPlotter p6 = pf.create("efficiency"); + p6.createRegions(1,2); +// p6.region(0).plot(h6); + StyleUtil.stylize(p6.region(0), "ix", "iy"); +// p6.region(1).plot(h6a); + StyleUtil.stylize(p6.region(1), "ix", "iy"); + p6.show(); + + IPlotter p7 = pf.create("theta vs energy"); + //p6.createRegions(1,2); + p7.region(0).plot(h1); + StyleUtil.stylize(p7.region(0), "theta", "energy"); + // StyleUtil.stylize(p6.region(1), "ix", "iy"); + p7.show(); + + IPlotter p8 = pf.create("y"); + //p6.createRegions(1,2); + p8.region(0).plot(h7); + p8.region(0).plot(h7a); + StyleUtil.stylize(p8.region(0), "y", "# of particles"); + // StyleUtil.stylize(p6.region(1), "ix", "iy"); + p8.show(); + + IPlotter p9 = pf.create("theta: top vs. bottom"); + //p6.createRegions(1,2); + p9.region(0).plot(h3_t); + p9.region(0).plot(h3_b); + StyleUtil.stylize(p9.region(0), "theta", "theta", "# of particles"); + StyleUtil.noFillHistogramBars(p9.region(0)); + //StyleUtil.stylize(p6.region(1), "ix", "iy"); + p9.show(); + + IPlotter p10 = pf.create("seed energy"); + //p6.createRegions(1,2); + p10.createRegions(2,1); + p10.region(0).plot(h8); + StyleUtil.stylize(p10.region(0), "seed energy", "seed energy (GeV)", "# of particles"); + + p10.region(1).plot(h10_t); + p10.region(1).plot(h10_b); + StyleUtil.noFillHistogramBars(p10.region(1)); + StyleUtil.stylize(p10.region(1), "clust size", "n ecal hits", "# of particles"); + + //StyleUtil.noFillHistogramBars(p10.region(0)); + //StyleUtil.stylize(p6.region(1), "ix", "iy"); + p10.show(); + + } + private static void processEvent(EventHeader event) { + if(event.getEventNumber() %10000 == 0) + System.out.println("event number " + event.getEventNumber()); + + for (GenericObject gob : event.get(GenericObject.class,"TriggerBank")) + { + if (!(AbstractIntData.getTag(gob) == TIData.BANK_TAG)) continue; + TIData tid = new TIData(gob); + if (!tid.isSingle1Trigger()) + { + return; + } + } + List<ReconstructedParticle> particles = event.get(ReconstructedParticle.class, "FinalStateParticles"); + particles = RemoveDuplicateParticles.removeDuplicateParticles(particles); + outer : for(ReconstructedParticle p : particles){ + + + boolean isGood = addParticle(p); + + + } + + } + + + + static double eMin = .8; + static double eMax = 1.2; + static double beamEnergy = 1.057; + + static double beamTiltX = .03057; + static double beamTiltY; + static double maxChi2 = 50; + //maximum difference between the reconstructed energy and momentum + static double maxdE = .5; + + static double seedEnergyCut = .4; + + + static boolean addParticle(ReconstructedParticle part){ + if(part.getTracks().size() != 0){ + if(part.getMomentum().magnitudeSquared() > .8 + && part.getTracks().get(0).getChi2() > maxChi2){ + h4y.fill(part.getMomentum().y()/part.getMomentum().z()); + } + } + if(part.getCharge() != -1) + return false; + if(part.getClusters().size() == 0) + return false; + Cluster c = part.getClusters().get(0); + double time = c.getCalorimeterHits().get(0).getTime(); + + if(!(time>40 && time <50)) + return false; + double seedEnergy = 0; + for(CalorimeterHit hit : c.getCalorimeterHits()){ + if(hit.getCorrectedEnergy() > seedEnergy) + seedEnergy = hit.getCorrectedEnergy(); + } + h8.fill(seedEnergy); + + + if(seedEnergy < seedEnergyCut) + return false; + + if(c.getPosition()[1] > 0){ + h10_t.fill(c.getSize()); + } + else{ + h10_b.fill(c.getSize()); + } + + + if(c.getCalorimeterHits().size() < 3) + return false; + + + if(c.getEnergy() > eMin && c.getEnergy() < eMax){ + if(c.getPosition()[1] > 0) + h7.fill(c.getPosition()[1]); + else if(c.getPosition()[1] < 0) + h7a.fill(-c.getPosition()[1]); + } + + if(EcalUtil.fid_ECal(c)){ + + if(c.getPosition()[1] > 0){ + h5.fill(c.getEnergy()); + } + else{ + h5a.fill(c.getEnergy()); + } + if(part.getTracks().size() == 0) + return false; + Track t = part.getTracks().get(0); + if(t.getChi2()>maxChi2){ + return false; + } + if(!TrackType.isGBL(t.getType())) + return false; + + + + Hep3Vector p = part.getMomentum(); + + + + double px = p.x(), pz = p.z(); + double pxtilt = px*Math.cos(beamTiltX)-pz*Math.sin(beamTiltX); + double py = p.y(); + double pztilt = pz*Math.cos(beamTiltX)+px*Math.sin(beamTiltX); + + double pytilt = py*Math.cos(beamTiltY)-pztilt*Math.sin(beamTiltY); + pztilt = pz*Math.cos(beamTiltY) + pytilt*Math.sin(beamTiltY); + + if(Math.abs(pztilt - c.getEnergy()) > maxdE) + return false; + if(c.getPosition()[1] > 0) + h9_t.fill(pztilt); + else + h9_b.fill(pztilt); + + double theta = Math.atan(Math.hypot(pxtilt, pytilt)/pztilt); + double phi =Math.atan2(pytilt, pxtilt); + boolean inRange = cb.inRange(theta, phi); + if(inRange) + h1.fill(theta, c.getEnergy()); + + + + if(c.getEnergy() > eMin && c.getEnergy() < eMax) { + + + + h2.fill(theta, phi); + h2c.fill(theta, phi); + + h4.fill(px/pz, py/pz); + //h4y.fill(py/pz); + + if(inRange){ + + //System.out.println(c.getEnergy() + " " + t.getType()); + /*for(TrackState ts : t.getTrackStates()){ + if(ts.getLocation() == TrackState.AtIP) + System.out.println(Arrays.toString( + ts.getReferencePoint())); + }*/ + h2a.fill(theta, phi); + h2b.fill(theta, phi); + + h3.fill(theta); + if(py > 0) + h3_t.fill(theta); + else + h3_b.fill(theta); + //if(h3_t.sumBinHeights()+h3_b.sumBinHeights() != h3.sumBinHeights()) + //System.out.println("NABO ERROR"); + + + h4a.fill(px/pz, py/pz); + } + + + return true; + } + + } + return false; + } + } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/MottIntegral.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/MottIntegral.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/MottIntegral.java Wed Mar 9 11:43:24 2016 @@ -1,66 +1,66 @@ package org.hps.users.spaul.feecc; public class MottIntegral { - /** - * @param bin - * @param scale = Z^2alpha^2/(4*E^2) - * @param recoil = 2E/M - * @return the integral of 1/sin^4(th/2)*cos^2(th/2)/(1+a*sin^2(th/2)) times dPhi*sin(theta), - * which appears in the integral of mott scattering. - * - * NOTE the sin(theta) is because dOmega = dTheta*dPhi*sin(theta) - */ - static double mottIntegral(double recoil, double scale, int bin, CustomBinning cb){ - double dPhi = 0; - for(int i = 0; i< cb.phiMax[bin].length; i++) - dPhi += 2*(cb.phiMax[bin][i] - cb.phiMin[bin][i]); //factor of 2 from top and bottom - - double Imax = integral(recoil, cb.thetaMax[bin]); - - double Imin = integral(recoil, cb.thetaMin[bin]); - double dI = Imax-Imin; - - - double retval = scale*dPhi*dI; - return retval; - } - - static double mottIntegral(double recoil, double scale, double thetaMin, double thetaMax){ - double Imax = integral(recoil, thetaMax); - - double Imin = integral(recoil, thetaMin); - double dI = Imax-Imin; - - double dPhi = 2*Math.PI; //full range in phi - double retval = scale*dPhi*dI; - return retval; - } - - static double integral(double a, double th){ - double sinth22 = Math.pow(Math.sin(th/2), 2); - return 2*(-1/sinth22+(1+a)*(Math.log(2/sinth22+2*a))); - } - - static double mottIntegralWithFormFactor(double recoil, double scale, double thetaMin, double thetaMax, FormFactor ff, int nsteps, double E){ - double sum = 0; - double prev = -1; + /** + * @param bin + * @param scale = Z^2alpha^2/(4*E^2) + * @param recoil = 2E/M + * @return the integral of 1/sin^4(th/2)*cos^2(th/2)/(1+a*sin^2(th/2)) times dPhi*sin(theta), + * which appears in the integral of mott scattering. + * + * NOTE the sin(theta) is because dOmega = dTheta*dPhi*sin(theta) + */ + static double mottIntegral(double recoil, double scale, int bin, CustomBinning cb){ + double dPhi = 0; + for(int i = 0; i< cb.phiMax[bin].length; i++) + dPhi += 2*(cb.phiMax[bin][i] - cb.phiMin[bin][i]); //factor of 2 from top and bottom + + double Imax = integral(recoil, cb.thetaMax[bin]); + + double Imin = integral(recoil, cb.thetaMin[bin]); + double dI = Imax-Imin; + + + double retval = scale*dPhi*dI; + return retval; + } + + static double mottIntegral(double recoil, double scale, double thetaMin, double thetaMax){ + double Imax = integral(recoil, thetaMax); + + double Imin = integral(recoil, thetaMin); + double dI = Imax-Imin; + + double dPhi = 2*Math.PI; //full range in phi + double retval = scale*dPhi*dI; + return retval; + } + + static double integral(double a, double th){ + double sinth22 = Math.pow(Math.sin(th/2), 2); + return 2*(-1/sinth22+(1+a)*(Math.log(2/sinth22+2*a))); + } + + static double mottIntegralWithFormFactor(double recoil, double scale, double thetaMin, double thetaMax, FormFactor ff, int nsteps, double E){ + double sum = 0; + double prev = -1; - double dTheta = (thetaMax-thetaMin)/nsteps; - for(int i = 0; i<nsteps; i++){ - double theta = i*(thetaMax-thetaMin)/nsteps+thetaMin; - double I = integral(recoil, theta); - if(i != 0) - { - double ts = Math.pow(Math.sin(theta/2),2); - double q2 = 4*E*E*ts/(1+recoil*ts); - double f2 = ff.getFormFactorSquared(q2); - sum+= (I-prev)*f2; - } - prev = I; - - } - double dPhi = 2*Math.PI; //full range in phi - double retval = scale*dPhi*sum; - return retval; - } + double dTheta = (thetaMax-thetaMin)/nsteps; + for(int i = 0; i<nsteps; i++){ + double theta = i*(thetaMax-thetaMin)/nsteps+thetaMin; + double I = integral(recoil, theta); + if(i != 0) + { + double ts = Math.pow(Math.sin(theta/2),2); + double q2 = 4*E*E*ts/(1+recoil*ts); + double f2 = ff.getFormFactorSquared(q2); + sum+= (I-prev)*f2; + } + prev = I; + + } + double dPhi = 2*Math.PI; //full range in phi + double retval = scale*dPhi*sum; + return retval; + } } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/MultipleScattering.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/MultipleScattering.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/MultipleScattering.java Wed Mar 9 11:43:24 2016 @@ -8,99 +8,99 @@ import java.util.Random; public class MultipleScattering { - - - /* - V.L. Highland, Nucl. Instrum. Methods 129, 497 (1975); Nucl. Instrum. Methods 161, 171 (1979) - - G.R. Lynch and O.I. Dahl, Nucl. Instrum. Methods B58, 6 (1991). - - */ - /** - * @param t number of scattering lengths - * @param p momentum in GeV/c - * @return the rms scattering angle of an electron with beta == 1. - */ - static double getThetaRMS(double t, double p){ - return .0136/p*Math.sqrt(t)*(1+.038*Math.log(t)); - } - /** - * Mo Tsai equations A.4-5 - * @param Z - * @return - */ - static double b(int Z){ - double xi = Math.log(1440.*Math.pow(Z, -2/3.))/Math.log(183.*Math.pow(Z,-1/3.)); - System.out.println(xi); - return 4/3.*(1+1/9.*(Z+1.)/(Z+xi)/Math.log(183.*Math.pow(Z,-1/3.))); - - - } - - - public static void main(String arg[]){ - - System.out.println(b(6)); - System.out.println(b(74)); - - double bt = 0.03; - - IAnalysisFactory af = IAnalysisFactory.create(); - IHistogramFactory hf = af.createHistogramFactory(af.createTreeFactory().create()); - IHistogram1D h = hf.createHistogram1D("x", 100, 0, 1.5); - IPlotter p = af.createPlotterFactory().create(); - p.region(0).plot(h); - p.show(); - for(int i = 0; i< 100000; i++){ - h.fill(getRandomEnergyFraction(bt)*getRandomEnergyFraction(bt)*(1+r.nextGaussian()*.045)*1.056); - } - } - - static double pdf(double x, double bt){ - return bt/(1-x)*(x+3/4.*(1-x)*(1-x))*Math.pow(Math.log(1./x), bt); - } - static Random r = new Random(); - /************************** - * CONFIGURABLE VARIABLES * - **************************/ - /** - * step size in x - */ - static double dx = .001; - /** - * starting distance from peak to begin numerical integration - */ - static double delta0 = .05; - - /** - * fraction of the energy to cut off at. (all events with less than this energy will be blanked out, - * and therefore not simulated in slic. Slic was having problems dealing with low energy events. - */ - static double xCutoff = .5; - - static double getRandomEnergyFraction(double bt){ - double p = r.nextDouble(); - if(p< Math.pow(delta0, bt)){ - return 1-Math.pow(p, 1/bt); - } - double sum = Math.pow(delta0,bt); - if(sum > p){ - return 1; - } - double x = 1-delta0; - while(true){ - double contribution = pdf(x, bt)*dx; - if(sum + contribution > p) - { - return x - (p-sum)/contribution*dx; - } - if(x < 0) - { - return 0; - } - x -= dx; - sum += contribution; - } - //return 1; - } + + + /* + V.L. Highland, Nucl. Instrum. Methods 129, 497 (1975); Nucl. Instrum. Methods 161, 171 (1979) + + G.R. Lynch and O.I. Dahl, Nucl. Instrum. Methods B58, 6 (1991). + + */ + /** + * @param t number of scattering lengths + * @param p momentum in GeV/c + * @return the rms scattering angle of an electron with beta == 1. + */ + static double getThetaRMS(double t, double p){ + return .0136/p*Math.sqrt(t)*(1+.038*Math.log(t)); + } + /** + * Mo Tsai equations A.4-5 + * @param Z + * @return + */ + static double b(int Z){ + double xi = Math.log(1440.*Math.pow(Z, -2/3.))/Math.log(183.*Math.pow(Z,-1/3.)); + System.out.println(xi); + return 4/3.*(1+1/9.*(Z+1.)/(Z+xi)/Math.log(183.*Math.pow(Z,-1/3.))); + + + } + + + public static void main(String arg[]){ + + System.out.println(b(6)); + System.out.println(b(74)); + + double bt = 0.03; + + IAnalysisFactory af = IAnalysisFactory.create(); + IHistogramFactory hf = af.createHistogramFactory(af.createTreeFactory().create()); + IHistogram1D h = hf.createHistogram1D("x", 100, 0, 1.5); + IPlotter p = af.createPlotterFactory().create(); + p.region(0).plot(h); + p.show(); + for(int i = 0; i< 100000; i++){ + h.fill(getRandomEnergyFraction(bt)*getRandomEnergyFraction(bt)*(1+r.nextGaussian()*.045)*1.056); + } + } + + static double pdf(double x, double bt){ + return bt/(1-x)*(x+3/4.*(1-x)*(1-x))*Math.pow(Math.log(1./x), bt); + } + static Random r = new Random(); + /************************** + * CONFIGURABLE VARIABLES * + **************************/ + /** + * step size in x + */ + static double dx = .001; + /** + * starting distance from peak to begin numerical integration + */ + static double delta0 = .05; + + /** + * fraction of the energy to cut off at. (all events with less than this energy will be blanked out, + * and therefore not simulated in slic. Slic was having problems dealing with low energy events. + */ + static double xCutoff = .5; + + static double getRandomEnergyFraction(double bt){ + double p = r.nextDouble(); + if(p< Math.pow(delta0, bt)){ + return 1-Math.pow(p, 1/bt); + } + double sum = Math.pow(delta0,bt); + if(sum > p){ + return 1; + } + double x = 1-delta0; + while(true){ + double contribution = pdf(x, bt)*dx; + if(sum + contribution > p) + { + return x - (p-sum)/contribution*dx; + } + if(x < 0) + { + return 0; + } + x -= dx; + sum += contribution; + } + //return 1; + } } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/RemoveDuplicateParticles.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/RemoveDuplicateParticles.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/RemoveDuplicateParticles.java Wed Mar 9 11:43:24 2016 @@ -7,61 +7,61 @@ import org.lcsim.event.ReconstructedParticle; public class RemoveDuplicateParticles { - public static List<ReconstructedParticle> removeDuplicateParticles(List<ReconstructedParticle> input){ - //System.out.println("\n" + input.size()); - List<ReconstructedParticle> output = new ArrayList(); - for(ReconstructedParticle p : input){ - boolean add = true; - boolean replace = false; - ReconstructedParticle duplicate = null; - /*if(p.getTracks().size() == 0){ - //System.out.println("no track"); - continue; - } - if(!TrackType.isGBL(p.getTracks().get(0).getType())){ - //System.out.println("non gbl track"); - continue; - }*/ - inner : for(ReconstructedParticle p2 : output){ - if(p.getEnergy() == p2.getEnergy()){ - - if(betterThan(p, p2)){ - duplicate = p2; - replace = true; - } - else{ - add = false; //keep the one that is already there - } - break inner; - } - } - if(replace){ - output.remove(duplicate); - //System.out.println("replaced"); - output.add(p); - }else if(add){ - output.add(p); - //System.out.println("added"); - }else{ - //System.out.println("retained"); - } - } - //System.out.println(output.size()); - return output; - } + public static List<ReconstructedParticle> removeDuplicateParticles(List<ReconstructedParticle> input){ + //System.out.println("\n" + input.size()); + List<ReconstructedParticle> output = new ArrayList(); + for(ReconstructedParticle p : input){ + boolean add = true; + boolean replace = false; + ReconstructedParticle duplicate = null; + /*if(p.getTracks().size() == 0){ + //System.out.println("no track"); + continue; + } + if(!TrackType.isGBL(p.getTracks().get(0).getType())){ + //System.out.println("non gbl track"); + continue; + }*/ + inner : for(ReconstructedParticle p2 : output){ + if(p.getEnergy() == p2.getEnergy()){ + + if(betterThan(p, p2)){ + duplicate = p2; + replace = true; + } + else{ + add = false; //keep the one that is already there + } + break inner; + } + } + if(replace){ + output.remove(duplicate); + //System.out.println("replaced"); + output.add(p); + }else if(add){ + output.add(p); + //System.out.println("added"); + }else{ + //System.out.println("retained"); + } + } + //System.out.println(output.size()); + return output; + } - private static boolean betterThan(ReconstructedParticle p, - ReconstructedParticle p2) { - if(p.getTracks().size() == 0) - return false; - if(p.getTracks().size() == 1 && p.getTracks().size() == 0) - return true; - if(TrackType.isGBL(p.getTracks().get(0).getType()) && !TrackType.isGBL(p2.getTracks().get(0).getType())) - return true; - - if(p.getTracks().get(0).getChi2() < p2.getTracks().get(0).getChi2()){ - return true; - } - return false; - } + private static boolean betterThan(ReconstructedParticle p, + ReconstructedParticle p2) { + if(p.getTracks().size() == 0) + return false; + if(p.getTracks().size() == 1 && p.getTracks().size() == 0) + return true; + if(TrackType.isGBL(p.getTracks().get(0).getType()) && !TrackType.isGBL(p2.getTracks().get(0).getType())) + return true; + + if(p.getTracks().get(0).getChi2() < p2.getTracks().get(0).getChi2()){ + return true; + } + return false; + } } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ShowCustomBinning.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ShowCustomBinning.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ShowCustomBinning.java Wed Mar 9 11:43:24 2016 @@ -24,277 +24,277 @@ import hep.aida.ITreeFactory; public class ShowCustomBinning extends Canvas{ - /** - * show Rafo's fiducial cuts translated into rotated theta and phi, - * and overlay this with my bins in x and y. - * @param arg - * @throws FileNotFoundException - */ - public static void main(String arg[]) throws FileNotFoundException{ - JFrame frame = new JFrame(); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - Canvas c = new ShowCustomBinning(new File(arg[0])); - String outdir = arg[1]; - frame.add(c); - frame.setSize(1200, 800); - frame.setVisible(true); - - - try { - BufferedImage im = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_ARGB); - c.paint(im.getGraphics()); - ImageIO.write(im, "PNG", new File(outdir +"/bins.png")); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - frame = new JFrame(); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - c = new ShowCustomBinningXY(new File(arg[0])); - frame.add(c); - frame.setSize(1200, 615); - frame.setVisible(true); - - try { - BufferedImage im = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_ARGB); - c.paint(im.getGraphics()); - ImageIO.write(im, "PNG", new File(outdir + "/bins_xy.png")); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - public void paint(Graphics g){ - g.setFont(new Font(Font.DIALOG, Font.PLAIN, 24)); - - drawEcalOutline(g); - drawFidEcalOutline(g); - drawCustomBinRectangles(g); - g.setColor(Color.BLACK); - drawXAxis(g); - drawYAxis(g); - } - - void drawFidEcalOutline(Graphics g){ - g.setColor(Color.GRAY); - double x_edge_low = -262.74; - double x_edge_high = 347.7; - double y_edge_low = 33.54; - double y_edge_high = 75.18; - - double x_gap_low = -106.66; - double x_gap_high = 42.17; - double y_gap_high = 47.18; - double x1,y1, x2, y2; - double nPoints = 500; - for(int i = 0; i< nPoints-1; i++){ - x1 = x_gap_high+i/nPoints*(x_edge_high-x_gap_high); - x2 = x_gap_high+(i+1)/nPoints*(x_edge_high-x_gap_high); - y1 = y_edge_low; - y2 = y1; - drawEcalFaceLine(g, x1, y1, x2, y2); - drawEcalFaceLine(g, x1, -y1, x2, -y2); - - - x1 = x_edge_low+i/nPoints*(x_gap_low-x_edge_low); - x2 = x_edge_low+(i+1)/nPoints*(x_gap_low-x_edge_low); - y1 = y2 = y_edge_low; - drawEcalFaceLine(g, x1, y1, x2, y2); - drawEcalFaceLine(g, x1, -y1, x2, -y2); - - - - x1 = x_gap_low+i/nPoints*(x_gap_high-x_gap_low); - x2 = x_gap_low+(i+1)/nPoints*(x_gap_high-x_gap_low); - y1 = y2 = y_gap_high; - drawEcalFaceLine(g, x1, y1, x2, y2); - drawEcalFaceLine(g, x1, -y1, x2, -y2); - - x1 = x_edge_low+i/nPoints*(x_edge_high-x_edge_low); - x2 = x_edge_low+(i+1)/nPoints*(x_edge_high-x_edge_low); - y1 = y2 = y_edge_high; - drawEcalFaceLine(g, x1, y1, x2, y2); - drawEcalFaceLine(g, x1, -y1, x2, -y2); - } - drawEcalFaceLine(g, x_gap_low, y_edge_low, x_gap_low, y_gap_high); - drawEcalFaceLine(g, x_gap_high, y_edge_low, x_gap_high, y_gap_high); - - drawEcalFaceLine(g, x_edge_low, y_edge_low, x_edge_low, y_edge_high); - drawEcalFaceLine(g, x_edge_high, y_edge_low, x_edge_high, y_edge_high); - - - drawEcalFaceLine(g, x_gap_low, -y_edge_low, x_gap_low, -y_gap_high); - drawEcalFaceLine(g, x_gap_high, -y_edge_low, x_gap_high, -y_gap_high); - - drawEcalFaceLine(g, x_edge_low, -y_edge_low, x_edge_low, -y_edge_high); - drawEcalFaceLine(g, x_edge_high, -y_edge_low, x_edge_high, -y_edge_high); - - } - - void drawEcalOutline(Graphics g){ - /*double x_edge_low = -262.74; - double x_edge_high = 347.7; - double y_edge_low = 33.54; - double y_edge_high = 75.18; - - double x_gap_low = -106.66; - double x_gap_high = 42.17; - double y_gap_high = 47.18;*/ - - g.setColor(Color.BLACK); - double x_edge_low = -269.56; - double x_edge_high = 354.52; - double y_edge_low = 26.72; - double y_edge_high = 82; - - double x_gap_low = -99.84; - double x_gap_high = 33.35; - double y_gap_high = 40.36; - double x1,y1, x2, y2; - double nPoints = 500; - for(int i = 0; i< nPoints-1; i++){ - x1 = x_gap_high+i/nPoints*(x_edge_high-x_gap_high); - x2 = x_gap_high+(i+1)/nPoints*(x_edge_high-x_gap_high); - y1 = y_edge_low; - y2 = y1; - drawEcalFaceLine(g, x1, y1, x2, y2); - drawEcalFaceLine(g, x1, -y1, x2, -y2); - - - x1 = x_edge_low+i/nPoints*(x_gap_low-x_edge_low); - x2 = x_edge_low+(i+1)/nPoints*(x_gap_low-x_edge_low); - y1 = y2 = y_edge_low; - drawEcalFaceLine(g, x1, y1, x2, y2); - drawEcalFaceLine(g, x1, -y1, x2, -y2); - - - - x1 = x_gap_low+i/nPoints*(x_gap_high-x_gap_low); - x2 = x_gap_low+(i+1)/nPoints*(x_gap_high-x_gap_low); - y1 = y2 = y_gap_high; - drawEcalFaceLine(g, x1, y1, x2, y2); - drawEcalFaceLine(g, x1, -y1, x2, -y2); - - x1 = x_edge_low+i/nPoints*(x_edge_high-x_edge_low); - x2 = x_edge_low+(i+1)/nPoints*(x_edge_high-x_edge_low); - y1 = y2 = y_edge_high; - drawEcalFaceLine(g, x1, y1, x2, y2); - drawEcalFaceLine(g, x1, -y1, x2, -y2); - } - drawEcalFaceLine(g, x_gap_low, y_edge_low, x_gap_low, y_gap_high); - drawEcalFaceLine(g, x_gap_high, y_edge_low, x_gap_high, y_gap_high); - - drawEcalFaceLine(g, x_edge_low, y_edge_low, x_edge_low, y_edge_high); - drawEcalFaceLine(g, x_edge_high, y_edge_low, x_edge_high, y_edge_high); - - - drawEcalFaceLine(g, x_gap_low, -y_edge_low, x_gap_low, -y_gap_high); - drawEcalFaceLine(g, x_gap_high, -y_edge_low, x_gap_high, -y_gap_high); - - drawEcalFaceLine(g, x_edge_low, -y_edge_low, x_edge_low, -y_edge_high); - drawEcalFaceLine(g, x_edge_high, -y_edge_low, x_edge_high, -y_edge_high); - } - - CustomBinning binning; - - ShowCustomBinning(File file) throws FileNotFoundException{ - this.binning = new CustomBinning(file); - print(this.binning); - } - Color altBin1 = new Color(0, 0, 128); - Color altBin2 = new Color(0,128,0); - Color fillBin1 = new Color(196, 196, 255); - Color fillBin2 = new Color(196,255,196); - void drawCustomBinRectangles(Graphics g){ - for(int i = 0; i<binning.nTheta; i++){ - g.setColor(i%2 == 0 ? altBin1 : altBin2); - for(int j = 0; j<binning.phiMax[i].length; j++){ - double phi1 = binning.phiMax[i][j]; - double phi2 = binning.phiMin[i][j]; - double theta1 = binning.thetaMin[i]; - double theta2 = binning.thetaMax[i]; - - int x =getX(theta1)+1, y = getY(phi1), w = getX(theta2)-getX(theta1), h = getY(phi2)-getY(phi1); - - g.setColor(i%2 == 0 ? fillBin1 : fillBin2); - g.fillRect(x, y, w, h); - g.setColor(i%2 == 0 ? altBin1 : altBin2); - g.drawRect(x, y, w, h); - x =getX(theta1)+1; y = getY(-phi2); w = getX(theta2)-getX(theta1); h = getY(-phi1)-getY(-phi2); - g.setColor(i%2 == 0 ? fillBin1 : fillBin2); - g.fillRect(x, y, w, h); - g.setColor(i%2 == 0 ? altBin1 : altBin2); - g.drawRect(x, y, w, h); - } - - } - } - void drawXAxis(Graphics g){ - //x axis - g.drawString("θ", getX(.28), getY(0) - 40); - g.drawLine(getX(0), getY(0), getX(.28), getY(0)); - for(int i = 0; i< 28; i++){ - if(i%5 == 0 && i != 0){ - g.drawString(i/100.+"", getX(i/100.)-15, getY(0)-20); - g.drawLine(getX(i/100.), getY(0), getX(i/100.), getY(0)-15); - } - g.drawLine(getX(i/100.), getY(0), getX(i/100.), getY(0)-5); - } - } - void drawYAxis(Graphics g){ - g.drawString("Ï", getX(0)+70, getY(3)); - g.drawLine(getX(0), getY(-3), getX(0), getY(3)); - for(int i = -30; i<= 30; i++){ - if(i%5 == 0 && i != 0){ - g.drawString(i/10.+"", getX(0)+20, getY(i/10.) + 5); - - g.drawLine(getX(0), getY(i/10.), getX(0) + 15, getY(i/10.)); - } - if(i == 0){ - //g.drawString(i/10.+"", getX(0)+10, getY(i/10.) - 15); - } - g.drawLine(getX(0), getY(i/10.), getX(0) + 5, getY(i/10.)); - } - } - - - void drawEcalFaceLine(Graphics g, double x1, double y1, double x2, double y2){ - - double[] polar1 = EcalUtil.getThetaPhiSpherical(x1, y1); - double[] polar2 = EcalUtil.getThetaPhiSpherical(x2, y2); - g.drawLine(getX(polar1[0]), getY(polar1[1]), getX(polar2[0]), getY(polar2[1])); - - } - int getX(double theta){ - return (int)(this.getWidth()*theta/.3)+left_margin; - } - int left_margin = 20; - int getY(double phi){ - return (int)(this.getHeight()*(3.2-phi)/6.4); - } - static void print(CustomBinning binning){ - System.out.println(" Bin \\# & $\\theta_{\\textrm{min}}$ & $\\theta_{\\textrm{max}}$ & $\\phi_{\\textrm{min 1}}$ & $\\phi_{\\textrm{max 1}}$ & $\\phi_{\\textrm{min 2}}$ & $\\phi_{\\textrm{max 2}}$ & Solid angle \\\\"); - for(int i = 0; i<binning.nTheta; i++){ - if(binning.phiMax[i].length == 1) - System.out.printf("%d & %.0f & %.0f & %.0f & %.0f & -- & -- & %.0f \\\\\n", - i+1, - binning.thetaMin[i]*1000, - binning.thetaMax[i]*1000, - binning.phiMin[i][0]*1000, - binning.phiMax[i][0]*1000., - binning.getSteradians(i)*1e6); - if(binning.phiMax[i].length == 2) - System.out.printf("%d & %.0f & %.0f & %.0f & %.0f & %.0f & %.0f & %.0f \\\\\n", - i+1, - binning.thetaMin[i]*1000, - binning.thetaMax[i]*1000, - binning.phiMin[i][0]*1000, - binning.phiMax[i][0]*1000, - binning.phiMin[i][1]*1000, - binning.phiMax[i][1]*1000, - binning.getSteradians(i)*1e6); - } - System.out.println("total " + binning.getTotSteradians()*1e6 + " microsteradians"); - } + /** + * show Rafo's fiducial cuts translated into rotated theta and phi, + * and overlay this with my bins in x and y. + * @param arg + * @throws FileNotFoundException + */ + public static void main(String arg[]) throws FileNotFoundException{ + JFrame frame = new JFrame(); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + Canvas c = new ShowCustomBinning(new File(arg[0])); + String outdir = arg[1]; + frame.add(c); + frame.setSize(1200, 800); + frame.setVisible(true); + + + try { + BufferedImage im = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_ARGB); + c.paint(im.getGraphics()); + ImageIO.write(im, "PNG", new File(outdir +"/bins.png")); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + c = new ShowCustomBinningXY(new File(arg[0])); + frame.add(c); + frame.setSize(1200, 615); + frame.setVisible(true); + + try { + BufferedImage im = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_ARGB); + c.paint(im.getGraphics()); + ImageIO.write(im, "PNG", new File(outdir + "/bins_xy.png")); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + public void paint(Graphics g){ + g.setFont(new Font(Font.DIALOG, Font.PLAIN, 24)); + + drawEcalOutline(g); + drawFidEcalOutline(g); + drawCustomBinRectangles(g); + g.setColor(Color.BLACK); + drawXAxis(g); + drawYAxis(g); + } + + void drawFidEcalOutline(Graphics g){ + g.setColor(Color.GRAY); + double x_edge_low = -262.74; + double x_edge_high = 347.7; + double y_edge_low = 33.54; + double y_edge_high = 75.18; + + double x_gap_low = -106.66; + double x_gap_high = 42.17; + double y_gap_high = 47.18; + double x1,y1, x2, y2; + double nPoints = 500; + for(int i = 0; i< nPoints-1; i++){ + x1 = x_gap_high+i/nPoints*(x_edge_high-x_gap_high); + x2 = x_gap_high+(i+1)/nPoints*(x_edge_high-x_gap_high); + y1 = y_edge_low; + y2 = y1; + drawEcalFaceLine(g, x1, y1, x2, y2); + drawEcalFaceLine(g, x1, -y1, x2, -y2); + + + x1 = x_edge_low+i/nPoints*(x_gap_low-x_edge_low); + x2 = x_edge_low+(i+1)/nPoints*(x_gap_low-x_edge_low); + y1 = y2 = y_edge_low; + drawEcalFaceLine(g, x1, y1, x2, y2); + drawEcalFaceLine(g, x1, -y1, x2, -y2); + + + + x1 = x_gap_low+i/nPoints*(x_gap_high-x_gap_low); + x2 = x_gap_low+(i+1)/nPoints*(x_gap_high-x_gap_low); + y1 = y2 = y_gap_high; + drawEcalFaceLine(g, x1, y1, x2, y2); + drawEcalFaceLine(g, x1, -y1, x2, -y2); + + x1 = x_edge_low+i/nPoints*(x_edge_high-x_edge_low); + x2 = x_edge_low+(i+1)/nPoints*(x_edge_high-x_edge_low); + y1 = y2 = y_edge_high; + drawEcalFaceLine(g, x1, y1, x2, y2); + drawEcalFaceLine(g, x1, -y1, x2, -y2); + } + drawEcalFaceLine(g, x_gap_low, y_edge_low, x_gap_low, y_gap_high); + drawEcalFaceLine(g, x_gap_high, y_edge_low, x_gap_high, y_gap_high); + + drawEcalFaceLine(g, x_edge_low, y_edge_low, x_edge_low, y_edge_high); + drawEcalFaceLine(g, x_edge_high, y_edge_low, x_edge_high, y_edge_high); + + + drawEcalFaceLine(g, x_gap_low, -y_edge_low, x_gap_low, -y_gap_high); + drawEcalFaceLine(g, x_gap_high, -y_edge_low, x_gap_high, -y_gap_high); + + drawEcalFaceLine(g, x_edge_low, -y_edge_low, x_edge_low, -y_edge_high); + drawEcalFaceLine(g, x_edge_high, -y_edge_low, x_edge_high, -y_edge_high); + + } + + void drawEcalOutline(Graphics g){ + /*double x_edge_low = -262.74; + double x_edge_high = 347.7; + double y_edge_low = 33.54; + double y_edge_high = 75.18; + + double x_gap_low = -106.66; + double x_gap_high = 42.17; + double y_gap_high = 47.18;*/ + + g.setColor(Color.BLACK); + double x_edge_low = -269.56; + double x_edge_high = 354.52; + double y_edge_low = 26.72; + double y_edge_high = 82; + + double x_gap_low = -99.84; + double x_gap_high = 33.35; + double y_gap_high = 40.36; + double x1,y1, x2, y2; + double nPoints = 500; + for(int i = 0; i< nPoints-1; i++){ + x1 = x_gap_high+i/nPoints*(x_edge_high-x_gap_high); + x2 = x_gap_high+(i+1)/nPoints*(x_edge_high-x_gap_high); + y1 = y_edge_low; + y2 = y1; + drawEcalFaceLine(g, x1, y1, x2, y2); + drawEcalFaceLine(g, x1, -y1, x2, -y2); + + + x1 = x_edge_low+i/nPoints*(x_gap_low-x_edge_low); + x2 = x_edge_low+(i+1)/nPoints*(x_gap_low-x_edge_low); + y1 = y2 = y_edge_low; + drawEcalFaceLine(g, x1, y1, x2, y2); + drawEcalFaceLine(g, x1, -y1, x2, -y2); + + + + x1 = x_gap_low+i/nPoints*(x_gap_high-x_gap_low); + x2 = x_gap_low+(i+1)/nPoints*(x_gap_high-x_gap_low); + y1 = y2 = y_gap_high; + drawEcalFaceLine(g, x1, y1, x2, y2); + drawEcalFaceLine(g, x1, -y1, x2, -y2); + + x1 = x_edge_low+i/nPoints*(x_edge_high-x_edge_low); + x2 = x_edge_low+(i+1)/nPoints*(x_edge_high-x_edge_low); + y1 = y2 = y_edge_high; + drawEcalFaceLine(g, x1, y1, x2, y2); + drawEcalFaceLine(g, x1, -y1, x2, -y2); + } + drawEcalFaceLine(g, x_gap_low, y_edge_low, x_gap_low, y_gap_high); + drawEcalFaceLine(g, x_gap_high, y_edge_low, x_gap_high, y_gap_high); + + drawEcalFaceLine(g, x_edge_low, y_edge_low, x_edge_low, y_edge_high); + drawEcalFaceLine(g, x_edge_high, y_edge_low, x_edge_high, y_edge_high); + + + drawEcalFaceLine(g, x_gap_low, -y_edge_low, x_gap_low, -y_gap_high); + drawEcalFaceLine(g, x_gap_high, -y_edge_low, x_gap_high, -y_gap_high); + + drawEcalFaceLine(g, x_edge_low, -y_edge_low, x_edge_low, -y_edge_high); + drawEcalFaceLine(g, x_edge_high, -y_edge_low, x_edge_high, -y_edge_high); + } + + CustomBinning binning; + + ShowCustomBinning(File file) throws FileNotFoundException{ + this.binning = new CustomBinning(file); + print(this.binning); + } + Color altBin1 = new Color(0, 0, 128); + Color altBin2 = new Color(0,128,0); + Color fillBin1 = new Color(196, 196, 255); + Color fillBin2 = new Color(196,255,196); + void drawCustomBinRectangles(Graphics g){ + for(int i = 0; i<binning.nTheta; i++){ + g.setColor(i%2 == 0 ? altBin1 : altBin2); + for(int j = 0; j<binning.phiMax[i].length; j++){ + double phi1 = binning.phiMax[i][j]; + double phi2 = binning.phiMin[i][j]; + double theta1 = binning.thetaMin[i]; + double theta2 = binning.thetaMax[i]; + + int x =getX(theta1)+1, y = getY(phi1), w = getX(theta2)-getX(theta1), h = getY(phi2)-getY(phi1); + + g.setColor(i%2 == 0 ? fillBin1 : fillBin2); + g.fillRect(x, y, w, h); + g.setColor(i%2 == 0 ? altBin1 : altBin2); + g.drawRect(x, y, w, h); + x =getX(theta1)+1; y = getY(-phi2); w = getX(theta2)-getX(theta1); h = getY(-phi1)-getY(-phi2); + g.setColor(i%2 == 0 ? fillBin1 : fillBin2); + g.fillRect(x, y, w, h); + g.setColor(i%2 == 0 ? altBin1 : altBin2); + g.drawRect(x, y, w, h); + } + + } + } + void drawXAxis(Graphics g){ + //x axis + g.drawString("θ", getX(.28), getY(0) - 40); + g.drawLine(getX(0), getY(0), getX(.28), getY(0)); + for(int i = 0; i< 28; i++){ + if(i%5 == 0 && i != 0){ + g.drawString(i/100.+"", getX(i/100.)-15, getY(0)-20); + g.drawLine(getX(i/100.), getY(0), getX(i/100.), getY(0)-15); + } + g.drawLine(getX(i/100.), getY(0), getX(i/100.), getY(0)-5); + } + } + void drawYAxis(Graphics g){ + g.drawString("Ï", getX(0)+70, getY(3)); + g.drawLine(getX(0), getY(-3), getX(0), getY(3)); + for(int i = -30; i<= 30; i++){ + if(i%5 == 0 && i != 0){ + g.drawString(i/10.+"", getX(0)+20, getY(i/10.) + 5); + + g.drawLine(getX(0), getY(i/10.), getX(0) + 15, getY(i/10.)); + } + if(i == 0){ + //g.drawString(i/10.+"", getX(0)+10, getY(i/10.) - 15); + } + g.drawLine(getX(0), getY(i/10.), getX(0) + 5, getY(i/10.)); + } + } + + + void drawEcalFaceLine(Graphics g, double x1, double y1, double x2, double y2){ + + double[] polar1 = EcalUtil.getThetaPhiSpherical(x1, y1); + double[] polar2 = EcalUtil.getThetaPhiSpherical(x2, y2); + g.drawLine(getX(polar1[0]), getY(polar1[1]), getX(polar2[0]), getY(polar2[1])); + + } + int getX(double theta){ + return (int)(this.getWidth()*theta/.3)+left_margin; + } + int left_margin = 20; + int getY(double phi){ + return (int)(this.getHeight()*(3.2-phi)/6.4); + } + static void print(CustomBinning binning){ + System.out.println(" Bin \\# & $\\theta_{\\textrm{min}}$ & $\\theta_{\\textrm{max}}$ & $\\phi_{\\textrm{min 1}}$ & $\\phi_{\\textrm{max 1}}$ & $\\phi_{\\textrm{min 2}}$ & $\\phi_{\\textrm{max 2}}$ & Solid angle \\\\"); + for(int i = 0; i<binning.nTheta; i++){ + if(binning.phiMax[i].length == 1) + System.out.printf("%d & %.0f & %.0f & %.0f & %.0f & -- & -- & %.0f \\\\\n", + i+1, + binning.thetaMin[i]*1000, + binning.thetaMax[i]*1000, + binning.phiMin[i][0]*1000, + binning.phiMax[i][0]*1000., + binning.getSteradians(i)*1e6); + if(binning.phiMax[i].length == 2) + System.out.printf("%d & %.0f & %.0f & %.0f & %.0f & %.0f & %.0f & %.0f \\\\\n", + i+1, + binning.thetaMin[i]*1000, + binning.thetaMax[i]*1000, + binning.phiMin[i][0]*1000, + binning.phiMax[i][0]*1000, + binning.phiMin[i][1]*1000, + binning.phiMax[i][1]*1000, + binning.getSteradians(i)*1e6); + } + System.out.println("total " + binning.getTotSteradians()*1e6 + " microsteradians"); + } } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ShowCustomBinningXY.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ShowCustomBinningXY.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ShowCustomBinningXY.java Wed Mar 9 11:43:24 2016 @@ -8,241 +8,241 @@ import java.io.FileNotFoundException; public class ShowCustomBinningXY extends ShowCustomBinning{ - ShowCustomBinningXY(File file) throws FileNotFoundException - { - super(file); - } - @Override - void drawCustomBinRectangles(Graphics g){ - for(int i = 0; i<binning.nTheta; i++){ - g.setColor(i%2 == 0 ? altBin1 : altBin2); - for(int j = 0; j<binning.phiMax[i].length; j++){ - double phi1 = binning.phiMax[i][j]; - double phi2 = binning.phiMin[i][j]; - double theta1 = binning.thetaMin[i]; - double theta2 = binning.thetaMax[i]; - - double nK = 10; - for(int sign = -1; sign <=1; sign +=2){ - - Polygon p = new Polygon(); - for(int k = 0; k< nK; k++){ - drawLineFromPolar(theta1, sign*(phi1+(phi2-phi1)*k/nK), theta1, sign*(phi1+(phi2-phi1)*(k+1)/nK),g,p); - } - for(int k = 0; k< nK; k++){ - drawLineFromPolar(theta1 + (theta2-theta1)*k/nK, sign*phi2, theta1 + (theta2-theta1)*(k+1)/nK, sign*phi2,g,p); - } - for(int k = 0; k< nK; k++){ - drawLineFromPolar(theta2, sign*(phi2+(phi1-phi2)*k/nK), theta2, sign*(phi2+(phi1-phi2)*(k+1)/nK),g, p); - } - for(int k = 0; k< nK; k++){ - drawLineFromPolar(theta2 + (theta1-theta2)*k/nK, sign*phi1, theta2 + (theta1-theta2)*(k+1)/nK, sign*phi1,g, p); - } - - closePolarFigure(g, i%2 == 0 ? altBin1 : altBin2, i%2 == 0 ? fillBin1 : fillBin2, p); - } - - } - } - } - private void drawLineFromPolar(double theta1, double phi1, double theta2, - double phi2, Graphics g, Polygon p) { - double[] xy1 = toXY(theta1, phi1); - double[] xy2 = toXY(theta2, phi2); - - if(p == null) - p = new Polygon(); - /*g.drawLine(getX(xy1[0]), - getY(xy1[1]), - getX(xy2[0]), - getY(xy2[1]));*/ - p.addPoint(getX(xy2[0]), getY(xy2[1])); - } - private void closePolarFigure(Graphics g, Color outlineColor, Color fillColor, Polygon p){ - g.setColor(fillColor); - g.fillPolygon(p); - g.setColor(outlineColor); - g.drawPolygon(p); - - } - double xtilt = .0294; - double ytilt = -.00082; - double[] toXY(double theta, double phi){ - double ux = Math.cos(phi)*Math.sin(theta)*Math.cos(xtilt)+Math.cos(theta)*Math.sin(xtilt); - double uy = Math.sin(phi)*Math.sin(theta); - double uz = Math.cos(theta)*Math.cos(xtilt)-Math.cos(phi)*Math.sin(theta)*Math.sin(xtilt); - - double temp = Math.cos(ytilt)*uy+Math.sin(ytilt)*uz; - uz = Math.cos(ytilt)*uz-Math.sin(ytilt)*uy; - uy = temp; - - double pxpz = ux/uz; - double pypz = uy/uz; - return new double[]{pxpz, pypz}; - } - int getX(double pxpz){ - //return (int)((pxpz -(-.16))/(.34-(-.16))*getWidth()); - return (int)((.32-pxpz)/(.32-(-.18))*getWidth()); - } - int getY(double pypz){ - return getHeight()-(int)((pypz -(-.125))/(.125-(-.125))*getHeight()); - } - void drawFidEcalOutline(Graphics g){ - g.setColor(Color.GRAY); - double x_edge_low = -262.74; - double x_edge_high = 347.7; - double y_edge_low = 33.54; - double y_edge_high = 75.18; - - double x_gap_low = -106.66; - double x_gap_high = 42.17; - double y_gap_high = 47.18; - double x1,y1, x2, y2; - double nPoints = 500; - for(int i = 0; i< nPoints-1; i++){ - x1 = x_gap_high+i/nPoints*(x_edge_high-x_gap_high); - x2 = x_gap_high+(i+1)/nPoints*(x_edge_high-x_gap_high); - y1 = y_edge_low; - y2 = y1; - drawEcalFaceLine(g, x1, y1, x2, y2); - drawEcalFaceLine(g, x1, -y1, x2, -y2); - - - x1 = x_edge_low+i/nPoints*(x_gap_low-x_edge_low); - x2 = x_edge_low+(i+1)/nPoints*(x_gap_low-x_edge_low); - y1 = y2 = y_edge_low; - drawEcalFaceLine(g, x1, y1, x2, y2); - drawEcalFaceLine(g, x1, -y1, x2, -y2); - - - - x1 = x_gap_low+i/nPoints*(x_gap_high-x_gap_low); - x2 = x_gap_low+(i+1)/nPoints*(x_gap_high-x_gap_low); - y1 = y2 = y_gap_high; - drawEcalFaceLine(g, x1, y1, x2, y2); - drawEcalFaceLine(g, x1, -y1, x2, -y2); - - x1 = x_edge_low+i/nPoints*(x_edge_high-x_edge_low); - x2 = x_edge_low+(i+1)/nPoints*(x_edge_high-x_edge_low); - y1 = y2 = y_edge_high; - drawEcalFaceLine(g, x1, y1, x2, y2); - drawEcalFaceLine(g, x1, -y1, x2, -y2); - } - drawEcalFaceLine(g, x_gap_low, y_edge_low, x_gap_low, y_gap_high); - drawEcalFaceLine(g, x_gap_high, y_edge_low, x_gap_high, y_gap_high); - - drawEcalFaceLine(g, x_edge_low, y_edge_low, x_edge_low, y_edge_high); - drawEcalFaceLine(g, x_edge_high, y_edge_low, x_edge_high, y_edge_high); - - - drawEcalFaceLine(g, x_gap_low, -y_edge_low, x_gap_low, -y_gap_high); - drawEcalFaceLine(g, x_gap_high, -y_edge_low, x_gap_high, -y_gap_high); - - drawEcalFaceLine(g, x_edge_low, -y_edge_low, x_edge_low, -y_edge_high); - drawEcalFaceLine(g, x_edge_high, -y_edge_low, x_edge_high, -y_edge_high); - - } - - void drawEcalOutline(Graphics g){ - g.setColor(Color.BLACK); - double x_edge_low = -269.56; - double x_edge_high = 354.52; - double y_edge_low = 26.72; - double y_edge_high = 82; - - double x_gap_low = -99.84; - double x_gap_high = 33.35; - double y_gap_high = 40.36; - double x1,y1, x2, y2; - x1 = x_gap_high; - x2 = x_edge_high; - y1 = y_edge_low; - y2 = y1; - drawEcalFaceLine(g, x1, y1, x2, y2); - drawEcalFaceLine(g, x1, -y1, x2, -y2); - - - x1 = x_edge_low; - x2 = x_gap_low; - y1 = y2 = y_edge_low; - drawEcalFaceLine(g, x1, y1, x2, y2); - drawEcalFaceLine(g, x1, -y1, x2, -y2); - - - - x1 = x_gap_low; - x2 = x_gap_high; - y1 = y2 = y_gap_high; - drawEcalFaceLine(g, x1, y1, x2, y2); - drawEcalFaceLine(g, x1, -y1, x2, -y2); - - x1 = x_edge_low; - x2 = x_edge_high; - y1 = y2 = y_edge_high; - drawEcalFaceLine(g, x1, y1, x2, y2); - drawEcalFaceLine(g, x1, -y1, x2, -y2); - - drawEcalFaceLine(g, x_gap_low, y_edge_low, x_gap_low, y_gap_high); - drawEcalFaceLine(g, x_gap_high, y_edge_low, x_gap_high, y_gap_high); - - drawEcalFaceLine(g, x_edge_low, y_edge_low, x_edge_low, y_edge_high); - drawEcalFaceLine(g, x_edge_high, y_edge_low, x_edge_high, y_edge_high); - - - drawEcalFaceLine(g, x_gap_low, -y_edge_low, x_gap_low, -y_gap_high); - drawEcalFaceLine(g, x_gap_high, -y_edge_low, x_gap_high, -y_gap_high); - - drawEcalFaceLine(g, x_edge_low, -y_edge_low, x_edge_low, -y_edge_high); - drawEcalFaceLine(g, x_edge_high, -y_edge_low, x_edge_high, -y_edge_high); - } - void drawEcalFaceLine(Graphics g, double x1, double y1, double x2, double y2){ - - double[] h1 = EcalUtil.toHollysCoordinates(x1, y1, 1.057, 11); - double[] h2 = EcalUtil.toHollysCoordinates(x2, y2, 1.057, 11); - g.drawLine(getX(Math.tan(h1[1])), getY(Math.tan(h1[0])), getX(Math.tan(h2[1])), getY(Math.tan(h2[0]))); - - } - - void drawXAxis(Graphics g){ - //x axis - g.drawString("px/pz", getX(.30)-10, getY(0) - 45); - g.drawLine(getX(-.15), getY(0), getX(.30), getY(0)); - for(int i = -15; i<= 30; i++){ - if(i%5 == 0 && i != 0){ - g.drawString(i/100.+"", getX(i/100.)-15, getY(0)-20); - g.drawLine(getX(i/100.), getY(0), getX(i/100.), getY(0)-15); - } - g.drawLine(getX(i/100.), getY(0), getX(i/100.), getY(0)-5); - } - } - void drawYAxis(Graphics g){ - g.drawString("py/pz", getX(0), getY(.1)-20); - g.drawLine(getX(0), getY(-.1), getX(0), getY(.1)); - for(int i = -10; i<= 10; i++){ - if(i%5 == 0 && i != 0){ - g.drawString(i/100.+"", getX(0)+15, getY(i/100.) + 5); - - g.drawLine(getX(0), getY(i/100.), getX(0) + 10, getY(i/100.)); - } - if(i == 0){ - //g.drawString(i/10.+"", getX(0)+10, getY(i/10.) - 15); - } - g.drawLine(getX(0), getY(i/100.), getX(0) + 5, getY(i/100.)); - } - } - public void paint(Graphics g){ - super.paint(g); - drawBeamspot(g); - } - - void drawBeamspot(Graphics g){ - g.setColor(Color.red); - int x = getX(xtilt), y = getY(ytilt); - g.drawLine(x+10, y, x-10, y); - g.drawLine(x+10, y+1, x-10, y+1); - g.drawLine(x+10, y-1, x-10, y-1); - g.drawLine(x, y-10, x, y+10); - g.drawLine(x+1, y-10, x+1, y+10); - g.drawLine(x-1, y-10, x-1, y+10); - } + ShowCustomBinningXY(File file) throws FileNotFoundException + { + super(file); + } + @Override + void drawCustomBinRectangles(Graphics g){ + for(int i = 0; i<binning.nTheta; i++){ + g.setColor(i%2 == 0 ? altBin1 : altBin2); + for(int j = 0; j<binning.phiMax[i].length; j++){ + double phi1 = binning.phiMax[i][j]; + double phi2 = binning.phiMin[i][j]; + double theta1 = binning.thetaMin[i]; + double theta2 = binning.thetaMax[i]; + + double nK = 10; + for(int sign = -1; sign <=1; sign +=2){ + + Polygon p = new Polygon(); + for(int k = 0; k< nK; k++){ + drawLineFromPolar(theta1, sign*(phi1+(phi2-phi1)*k/nK), theta1, sign*(phi1+(phi2-phi1)*(k+1)/nK),g,p); + } + for(int k = 0; k< nK; k++){ + drawLineFromPolar(theta1 + (theta2-theta1)*k/nK, sign*phi2, theta1 + (theta2-theta1)*(k+1)/nK, sign*phi2,g,p); + } + for(int k = 0; k< nK; k++){ + drawLineFromPolar(theta2, sign*(phi2+(phi1-phi2)*k/nK), theta2, sign*(phi2+(phi1-phi2)*(k+1)/nK),g, p); + } + for(int k = 0; k< nK; k++){ + drawLineFromPolar(theta2 + (theta1-theta2)*k/nK, sign*phi1, theta2 + (theta1-theta2)*(k+1)/nK, sign*phi1,g, p); + } + + closePolarFigure(g, i%2 == 0 ? altBin1 : altBin2, i%2 == 0 ? fillBin1 : fillBin2, p); + } + + } + } + } + private void drawLineFromPolar(double theta1, double phi1, double theta2, + double phi2, Graphics g, Polygon p) { + double[] xy1 = toXY(theta1, phi1); + double[] xy2 = toXY(theta2, phi2); + + if(p == null) + p = new Polygon(); + /*g.drawLine(getX(xy1[0]), + getY(xy1[1]), + getX(xy2[0]), + getY(xy2[1]));*/ + p.addPoint(getX(xy2[0]), getY(xy2[1])); + } + private void closePolarFigure(Graphics g, Color outlineColor, Color fillColor, Polygon p){ + g.setColor(fillColor); + g.fillPolygon(p); + g.setColor(outlineColor); + g.drawPolygon(p); + + } + double xtilt = .0294; + double ytilt = -.00082; + double[] toXY(double theta, double phi){ + double ux = Math.cos(phi)*Math.sin(theta)*Math.cos(xtilt)+Math.cos(theta)*Math.sin(xtilt); + double uy = Math.sin(phi)*Math.sin(theta); + double uz = Math.cos(theta)*Math.cos(xtilt)-Math.cos(phi)*Math.sin(theta)*Math.sin(xtilt); + + double temp = Math.cos(ytilt)*uy+Math.sin(ytilt)*uz; + uz = Math.cos(ytilt)*uz-Math.sin(ytilt)*uy; + uy = temp; + + double pxpz = ux/uz; + double pypz = uy/uz; + return new double[]{pxpz, pypz}; + } + int getX(double pxpz){ + //return (int)((pxpz -(-.16))/(.34-(-.16))*getWidth()); + return (int)((.32-pxpz)/(.32-(-.18))*getWidth()); + } + int getY(double pypz){ + return getHeight()-(int)((pypz -(-.125))/(.125-(-.125))*getHeight()); + } + void drawFidEcalOutline(Graphics g){ + g.setColor(Color.GRAY); + double x_edge_low = -262.74; + double x_edge_high = 347.7; + double y_edge_low = 33.54; + double y_edge_high = 75.18; + + double x_gap_low = -106.66; + double x_gap_high = 42.17; + double y_gap_high = 47.18; + double x1,y1, x2, y2; + double nPoints = 500; + for(int i = 0; i< nPoints-1; i++){ + x1 = x_gap_high+i/nPoints*(x_edge_high-x_gap_high); + x2 = x_gap_high+(i+1)/nPoints*(x_edge_high-x_gap_high); + y1 = y_edge_low; + y2 = y1; + drawEcalFaceLine(g, x1, y1, x2, y2); + drawEcalFaceLine(g, x1, -y1, x2, -y2); + + + x1 = x_edge_low+i/nPoints*(x_gap_low-x_edge_low); + x2 = x_edge_low+(i+1)/nPoints*(x_gap_low-x_edge_low); + y1 = y2 = y_edge_low; + drawEcalFaceLine(g, x1, y1, x2, y2); + drawEcalFaceLine(g, x1, -y1, x2, -y2); + + + + x1 = x_gap_low+i/nPoints*(x_gap_high-x_gap_low); + x2 = x_gap_low+(i+1)/nPoints*(x_gap_high-x_gap_low); + y1 = y2 = y_gap_high; + drawEcalFaceLine(g, x1, y1, x2, y2); + drawEcalFaceLine(g, x1, -y1, x2, -y2); + + x1 = x_edge_low+i/nPoints*(x_edge_high-x_edge_low); + x2 = x_edge_low+(i+1)/nPoints*(x_edge_high-x_edge_low); + y1 = y2 = y_edge_high; + drawEcalFaceLine(g, x1, y1, x2, y2); + drawEcalFaceLine(g, x1, -y1, x2, -y2); + } + drawEcalFaceLine(g, x_gap_low, y_edge_low, x_gap_low, y_gap_high); + drawEcalFaceLine(g, x_gap_high, y_edge_low, x_gap_high, y_gap_high); + + drawEcalFaceLine(g, x_edge_low, y_edge_low, x_edge_low, y_edge_high); + drawEcalFaceLine(g, x_edge_high, y_edge_low, x_edge_high, y_edge_high); + + + drawEcalFaceLine(g, x_gap_low, -y_edge_low, x_gap_low, -y_gap_high); + drawEcalFaceLine(g, x_gap_high, -y_edge_low, x_gap_high, -y_gap_high); + + drawEcalFaceLine(g, x_edge_low, -y_edge_low, x_edge_low, -y_edge_high); + drawEcalFaceLine(g, x_edge_high, -y_edge_low, x_edge_high, -y_edge_high); + + } + + void drawEcalOutline(Graphics g){ + g.setColor(Color.BLACK); + double x_edge_low = -269.56; + double x_edge_high = 354.52; + double y_edge_low = 26.72; + double y_edge_high = 82; + + double x_gap_low = -99.84; + double x_gap_high = 33.35; + double y_gap_high = 40.36; + double x1,y1, x2, y2; + x1 = x_gap_high; + x2 = x_edge_high; + y1 = y_edge_low; + y2 = y1; + drawEcalFaceLine(g, x1, y1, x2, y2); + drawEcalFaceLine(g, x1, -y1, x2, -y2); + + + x1 = x_edge_low; + x2 = x_gap_low; + y1 = y2 = y_edge_low; + drawEcalFaceLine(g, x1, y1, x2, y2); + drawEcalFaceLine(g, x1, -y1, x2, -y2); + + + + x1 = x_gap_low; + x2 = x_gap_high; + y1 = y2 = y_gap_high; + drawEcalFaceLine(g, x1, y1, x2, y2); + drawEcalFaceLine(g, x1, -y1, x2, -y2); + + x1 = x_edge_low; + x2 = x_edge_high; + y1 = y2 = y_edge_high; + drawEcalFaceLine(g, x1, y1, x2, y2); + drawEcalFaceLine(g, x1, -y1, x2, -y2); + + drawEcalFaceLine(g, x_gap_low, y_edge_low, x_gap_low, y_gap_high); + drawEcalFaceLine(g, x_gap_high, y_edge_low, x_gap_high, y_gap_high); + + drawEcalFaceLine(g, x_edge_low, y_edge_low, x_edge_low, y_edge_high); + drawEcalFaceLine(g, x_edge_high, y_edge_low, x_edge_high, y_edge_high); + + + drawEcalFaceLine(g, x_gap_low, -y_edge_low, x_gap_low, -y_gap_high); + drawEcalFaceLine(g, x_gap_high, -y_edge_low, x_gap_high, -y_gap_high); + + drawEcalFaceLine(g, x_edge_low, -y_edge_low, x_edge_low, -y_edge_high); + drawEcalFaceLine(g, x_edge_high, -y_edge_low, x_edge_high, -y_edge_high); + } + void drawEcalFaceLine(Graphics g, double x1, double y1, double x2, double y2){ + + double[] h1 = EcalUtil.toHollysCoordinates(x1, y1, 1.057, 11); + double[] h2 = EcalUtil.toHollysCoordinates(x2, y2, 1.057, 11); + g.drawLine(getX(Math.tan(h1[1])), getY(Math.tan(h1[0])), getX(Math.tan(h2[1])), getY(Math.tan(h2[0]))); + + } + + void drawXAxis(Graphics g){ + //x axis + g.drawString("px/pz", getX(.30)-10, getY(0) - 45); + g.drawLine(getX(-.15), getY(0), getX(.30), getY(0)); + for(int i = -15; i<= 30; i++){ + if(i%5 == 0 && i != 0){ + g.drawString(i/100.+"", getX(i/100.)-15, getY(0)-20); + g.drawLine(getX(i/100.), getY(0), getX(i/100.), getY(0)-15); + } + g.drawLine(getX(i/100.), getY(0), getX(i/100.), getY(0)-5); + } + } + void drawYAxis(Graphics g){ + g.drawString("py/pz", getX(0), getY(.1)-20); + g.drawLine(getX(0), getY(-.1), getX(0), getY(.1)); + for(int i = -10; i<= 10; i++){ + if(i%5 == 0 && i != 0){ + g.drawString(i/100.+"", getX(0)+15, getY(i/100.) + 5); + + g.drawLine(getX(0), getY(i/100.), getX(0) + 10, getY(i/100.)); + } + if(i == 0){ + //g.drawString(i/10.+"", getX(0)+10, getY(i/10.) - 15); + } + g.drawLine(getX(0), getY(i/100.), getX(0) + 5, getY(i/100.)); + } + } + public void paint(Graphics g){ + super.paint(g); + drawBeamspot(g); + } + + void drawBeamspot(Graphics g){ + g.setColor(Color.red); + int x = getX(xtilt), y = getY(ytilt); + g.drawLine(x+10, y, x-10, y); + g.drawLine(x+10, y+1, x-10, y+1); + g.drawLine(x+10, y-1, x-10, y-1); + g.drawLine(x, y-10, x, y+10); + g.drawLine(x+1, y-10, x+1, y+10); + g.drawLine(x-1, y-10, x-1, y+10); + } } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/moller/FitAllProfiles.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/moller/FitAllProfiles.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/moller/FitAllProfiles.java Wed Mar 9 11:43:24 2016 @@ -12,45 +12,45 @@ import java.io.IOException; public class FitAllProfiles { - static IAnalysisFactory af = IAnalysisFactory.create(); - static IFitFactory ff = af.createFitFactory(); - - public static void main(String arg[]) throws IllegalArgumentException, IOException{ - - ITree tree = af.createTreeFactory().create(arg[0]); - IPlotter p = af.createPlotterFactory().create(); - p.createRegions(3,2); - plotAndFit(p, 0, (IHistogram1D)tree.find("pypz")); - plotAndFit(p, 1, (IHistogram1D)tree.find("pxpz")); - plotAndFit(p, 2, (IProfile1D)tree.find("pypz vs diff")); - plotAndFit(p, 3, (IProfile1D)tree.find("pxpz vs diff")); - - p.show(); - } - public static void plotAndFit(IPlotter p, int r, IHistogram1D h){ - p.region(r).plot(h); - IFitResult fit = ff.createFitter().fit(h, "g"); - IFunction func = fit.fittedFunction(); - System.out.println("\n" + h.title()); - String names[] = func.parameterNames(); - double params[] = func.parameters(); - for(int i = 0; i< names.length; i++){ - System.out.printf("%s: %f\n", names[i], params[i]); - } - p.region(r).plot(func); - - } - public static void plotAndFit(IPlotter p, int r, IProfile1D h){ - p.region(r).plot(h); - IFitResult fit = ff.createFitter().fit(h, "p4"); - IFunction func = fit.fittedFunction(); - System.out.println("\n" + h.title()); - String names[] = func.parameterNames(); - double params[] = func.parameters(); - for(int i = 0; i< names.length; i++){ - System.out.printf("%s: %f\t", names[i], params[i]); - } - p.region(r).plot(func); - - } + static IAnalysisFactory af = IAnalysisFactory.create(); + static IFitFactory ff = af.createFitFactory(); + + public static void main(String arg[]) throws IllegalArgumentException, IOException{ + + ITree tree = af.createTreeFactory().create(arg[0]); + IPlotter p = af.createPlotterFactory().create(); + p.createRegions(3,2); + plotAndFit(p, 0, (IHistogram1D)tree.find("pypz")); + plotAndFit(p, 1, (IHistogram1D)tree.find("pxpz")); + plotAndFit(p, 2, (IProfile1D)tree.find("pypz vs diff")); + plotAndFit(p, 3, (IProfile1D)tree.find("pxpz vs diff")); + + p.show(); + } + public static void plotAndFit(IPlotter p, int r, IHistogram1D h){ + p.region(r).plot(h); + IFitResult fit = ff.createFitter().fit(h, "g"); + IFunction func = fit.fittedFunction(); + System.out.println("\n" + h.title()); + String names[] = func.parameterNames(); + double params[] = func.parameters(); + for(int i = 0; i< names.length; i++){ + System.out.printf("%s: %f\n", names[i], params[i]); + } + p.region(r).plot(func); + + } + public static void plotAndFit(IPlotter p, int r, IProfile1D h){ + p.region(r).plot(h); + IFitResult fit = ff.createFitter().fit(h, "p4"); + IFunction func = fit.fittedFunction(); + System.out.println("\n" + h.title()); + String names[] = func.parameterNames(); + double params[] = func.parameters(); + for(int i = 0; i< names.length; i++){ + System.out.printf("%s: %f\t", names[i], params[i]); + } + p.region(r).plot(func); + + } } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/moller/FitMollerPyPzGraphs.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/moller/FitMollerPyPzGraphs.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/moller/FitMollerPyPzGraphs.java Wed Mar 9 11:43:24 2016 @@ -8,67 +8,67 @@ import hep.aida.*; public class FitMollerPyPzGraphs { - static IAnalysisFactory af = IAnalysisFactory.create(); - static IFitFactory ff = af.createFitFactory(); - - public static void main(String arg[]) throws IllegalArgumentException, IOException{ - - ITree tree = af.createTreeFactory().create(arg[0]); - /*IPlotter p = af.createPlotterFactory().create(); - p.createRegions(4,2); - plotAndFit(p, 0, (IHistogram1D)tree.find("pypz"), "uy all", "uy"); - plotAndFit(p, 1, (IHistogram1D)tree.find("pxpz"), "ux all", "ux"); - plotAndFit(p, 2, (IHistogram1D)tree.find("pypz bot"), "uy (bot)", "uy"); - plotAndFit(p, 3, (IHistogram1D)tree.find("pxpz bot"), "ux (bot)", "ux"); - plotAndFit(p, 4, (IHistogram1D)tree.find("pypz mid"), "uy (mid)", "uy"); - plotAndFit(p, 5, (IHistogram1D)tree.find("pxpz mid"), "ux (mid)", "ux"); - plotAndFit(p, 6, (IHistogram1D)tree.find("pypz top"), "uy (top)", "uy"); - plotAndFit(p, 7, (IHistogram1D)tree.find("pxpz top"), "ux (top)", "ux"); + static IAnalysisFactory af = IAnalysisFactory.create(); + static IFitFactory ff = af.createFitFactory(); + + public static void main(String arg[]) throws IllegalArgumentException, IOException{ + + ITree tree = af.createTreeFactory().create(arg[0]); + /*IPlotter p = af.createPlotterFactory().create(); + p.createRegions(4,2); + plotAndFit(p, 0, (IHistogram1D)tree.find("pypz"), "uy all", "uy"); + plotAndFit(p, 1, (IHistogram1D)tree.find("pxpz"), "ux all", "ux"); + plotAndFit(p, 2, (IHistogram1D)tree.find("pypz bot"), "uy (bot)", "uy"); + plotAndFit(p, 3, (IHistogram1D)tree.find("pxpz bot"), "ux (bot)", "ux"); + plotAndFit(p, 4, (IHistogram1D)tree.find("pypz mid"), "uy (mid)", "uy"); + plotAndFit(p, 5, (IHistogram1D)tree.find("pxpz mid"), "ux (mid)", "ux"); + plotAndFit(p, 6, (IHistogram1D)tree.find("pypz top"), "uy (top)", "uy"); + plotAndFit(p, 7, (IHistogram1D)tree.find("pxpz top"), "ux (top)", "ux"); - StyleUtil.setSize(p, 1000, 500); - p.show();*/ - + StyleUtil.setSize(p, 1000, 500); + p.show();*/ + - IPlotter p; - p = af.createPlotterFactory().create(); - p.region(0).plot((IHistogram1D) tree.find("diff")); - StyleUtil.stylize(p.region(0), "pz top - pz bottom (GeV)", "#"); - p.show(); - - p = af.createPlotterFactory().create(); - p.createRegions(2, 1); - plotAndFit(p, 0, (IHistogram1D)tree.find("pypz bot"), "bot", "uy"); - plotAndFit(p, 1, (IHistogram1D)tree.find("pxpz bot"), "bot", "ux"); - plotAndFit(p, 0, (IHistogram1D)tree.find("pypz mid"), "mid", "uy"); - plotAndFit(p, 1, (IHistogram1D)tree.find("pxpz mid"), "mid", "ux"); - plotAndFit(p, 0, (IHistogram1D)tree.find("pypz top"), "top", "uy"); - plotAndFit(p, 1, (IHistogram1D)tree.find("pxpz top"), "top", "ux"); - StyleUtil.setSize(p, 1000, 500); - p.show(); - - } - public static void plotAndFit(IPlotter p, int r, IHistogram1D h, String title, String xAxis){ - p.region(r).plot(h); - h.setTitle(title); - StyleUtil.noFillHistogramBars(p.region(r)); - IFitResult fit = ff.createFitter().fit(h, "g"); - StyleUtil.stylize(p.region(r), title, xAxis, "#"); - IFunction func = fit.fittedFunction(); - System.out.println("\n" + h.title()); - String names[] = func.parameterNames(); - double params[] = func.parameters(); - for(int i = 0; i< names.length; i++){ - System.out.printf("%s: %f\t", names[i], params[i]); - } - //System.out.println(Arrays.toString(fit.); - - p.region(r).plot(func); - StyleUtil.stylize(p.region(r), title, xAxis, "#"); - p.region(r).style().statisticsBoxStyle().setVisible(true); - p.region(r).style().legendBoxStyle().setVisible(false); - //System.out.println(Arrays.toString(p.region(r).style().statisticsBoxStyle().availableParameters())); - //p.show(); - } - - + IPlotter p; + p = af.createPlotterFactory().create(); + p.region(0).plot((IHistogram1D) tree.find("diff")); + StyleUtil.stylize(p.region(0), "pz top - pz bottom (GeV)", "#"); + p.show(); + + p = af.createPlotterFactory().create(); + p.createRegions(2, 1); + plotAndFit(p, 0, (IHistogram1D)tree.find("pypz bot"), "bot", "uy"); + plotAndFit(p, 1, (IHistogram1D)tree.find("pxpz bot"), "bot", "ux"); + plotAndFit(p, 0, (IHistogram1D)tree.find("pypz mid"), "mid", "uy"); + plotAndFit(p, 1, (IHistogram1D)tree.find("pxpz mid"), "mid", "ux"); + plotAndFit(p, 0, (IHistogram1D)tree.find("pypz top"), "top", "uy"); + plotAndFit(p, 1, (IHistogram1D)tree.find("pxpz top"), "top", "ux"); + StyleUtil.setSize(p, 1000, 500); + p.show(); + + } + public static void plotAndFit(IPlotter p, int r, IHistogram1D h, String title, String xAxis){ + p.region(r).plot(h); + h.setTitle(title); + StyleUtil.noFillHistogramBars(p.region(r)); + IFitResult fit = ff.createFitter().fit(h, "g"); + StyleUtil.stylize(p.region(r), title, xAxis, "#"); + IFunction func = fit.fittedFunction(); + System.out.println("\n" + h.title()); + String names[] = func.parameterNames(); + double params[] = func.parameters(); + for(int i = 0; i< names.length; i++){ + System.out.printf("%s: %f\t", names[i], params[i]); + } + //System.out.println(Arrays.toString(fit.); + + p.region(r).plot(func); + StyleUtil.stylize(p.region(r), title, xAxis, "#"); + p.region(r).style().statisticsBoxStyle().setVisible(true); + p.region(r).style().legendBoxStyle().setVisible(false); + //System.out.println(Arrays.toString(p.region(r).style().statisticsBoxStyle().availableParameters())); + //p.show(); + } + + } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerBeamtiltAnalysis.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerBeamtiltAnalysis.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerBeamtiltAnalysis.java Wed Mar 9 11:43:24 2016 @@ -16,299 +16,299 @@ import org.lcsim.util.aida.AIDA; public class MollerBeamtiltAnalysis extends Driver{ - @Override - public void process(EventHeader event){ - List<Vertex> mollers = event.get(Vertex.class, "TargetConstrainedMollerVertices"); - for(Vertex v : mollers){ - if(!passesCuts(v)) - continue; - ReconstructedParticle m = v.getAssociatedParticle(); - ReconstructedParticle top; - ReconstructedParticle bottom; - if(m.getParticles().get(0).getMomentum().y()>0){ - top = m.getParticles().get(0); - bottom = m.getParticles().get(1); - }else{ - top = m.getParticles().get(1); - bottom = m.getParticles().get(0); - } - - double pypz = m.getMomentum().y()/m.getMomentum().z(); - double pxpz = m.getMomentum().x()/m.getMomentum().z(); - //double pypz = (top.getMomentum().y()+bottom.getMomentum().y())/(top.getMomentum().z()+bottom.getMomentum().z()); - //double pxpz = (top.getMomentum().x()+bottom.getMomentum().x())/(top.getMomentum().z()+bottom.getMomentum().z()); - - hpypz.fill(pypz); - hpxpz.fill(pxpz); - - - double diff = top.getMomentum().z()-bottom.getMomentum().z(); - double sum = m.getMomentum().z();//top.getMomentum().z()+bottom.getMomentum().z(); - double mass = m.getMass(); - - if(diff > -.05 && diff < .05){ - hpypz_mid.fill(pypz); - hpxpz_mid.fill(pxpz); - } - - if(diff > .2 && diff < .3){ - hpypz_topHighE.fill(pypz); - hpxpz_topHighE.fill(pxpz); - } - - if(diff > -.3 && diff < -.2){ - hpypz_botHighE.fill(pypz); - hpxpz_botHighE.fill(pxpz); - } - - - this.diff.fill(diff); - this.sum.fill(sum); - this.mass.fill(mass); - pypz_vs_diff.fill(diff,pypz ); - pxpz_vs_diff.fill(diff, pxpz ); - - - - pxpz_vs_sum.fill(sum, pxpz ); - pypz_vs_sum.fill(sum, pypz ); - - pxpz_vs_mass.fill(mass, pxpz ); - pypz_vs_mass.fill(mass, pypz ); - timediff.fill(top.getClusters().get(0).getCalorimeterHits().get(0).getTime() - -bottom.getClusters().get(0).getCalorimeterHits().get(0).getTime()); - /*if(moreEnergetic.getMomentum().y() > 0) - { - pypz_tophighE.fill(pypz); - pxpz_tophighE.fill(pxpz); - } - if(moreEnergetic.getMomentum().y() < 0) - { - pypz_bottomhighE.fill(pypz); - pxpz_bottomhighE.fill(pxpz); - }*/ - } - } - - double _maxVtxChi2 = 15; - double _maxTrkChi2 = 30; - double _maxMass = .037; - double _minMass = .030; - double _minPz = 1.0; - double _maxPz = 1.1; - boolean passesCuts(Vertex vertex){ - ReconstructedParticle m = vertex.getAssociatedParticle(); - if(!TrackType.isGBL(m.getType())) - return false; - if(m.getMomentum().z() > _maxPz || m.getMomentum().z() < _minPz) - return false; - if(m.getMass() > _maxMass || m.getMass() < _minMass) - return false; - - if(m.getParticles().get(0).getCharge() != -1 - || m.getParticles().get(1).getCharge() != -1 ) - return false; - - if(vertex.getChi2() > _maxVtxChi2) - return false; - - - if(m.getParticles().get(0).getClusters().size() == 0) - return false; - if(m.getParticles().get(1).getClusters().size() == 0) - return false; - - if(m.getParticles().get(0).getTracks().get(0).getChi2() > _maxTrkChi2) - return false; - if(m.getParticles().get(1).getTracks().get(0).getChi2() > _maxTrkChi2) - return false; - return true; - } - - IHistogram1D hpypz, hpxpz, diff, sum, mass, - hpypz_topHighE, hpxpz_topHighE, - hpypz_botHighE, hpxpz_botHighE, - hpypz_mid, hpxpz_mid; - - boolean display = false; - - - - - public double getMaxVtxChi2() { - return _maxVtxChi2; - } - - - public void setMaxVtxChi2(double _maxVtxChi2) { - this._maxVtxChi2 = _maxVtxChi2; - } - - - public double getMaxTrkChi2() { - return _maxTrkChi2; - } - - - public void setMaxTrkChi2(double _maxTrkChi2) { - this._maxTrkChi2 = _maxTrkChi2; - } - - - public double getMaxMass() { - return _maxMass; - } - - - public void setMaxMass(double _maxMass) { - this._maxMass = _maxMass; - } - - - public double getMinMass() { - return _minMass; - } - - - public void setMinMass(double _minMass) { - this._minMass = _minMass; - } - - - public double getMinPz() { - return _minPz; - } - - - public void setMinPz(double _minPz) { - this._minPz = _minPz; - } - - - public double getMaxPz() { - return _maxPz; - } - - - public void setMaxPz(double _maxPz) { - this._maxPz = _maxPz; - } - - - public boolean getDisplay() { - return display; - } - - - public void setDisplay(boolean display) { - this.display = display; - } - - IHistogram1D vtx_x, vtx_y, timediff; - - IProfile1D pxpz_vs_diff, pypz_vs_diff, pxpz_vs_sum, pypz_vs_sum, - pxpz_vs_mass, pypz_vs_mass; - - - //IHistogram1D pypz_tophighE, pxpz_tophighE; - //IHistogram1D pypz_bottomhighE, pxpz_bottomhighE; - @Override - public void startOfData(){ - AIDA aida = AIDA.defaultInstance(); - hpypz = aida.histogram1D("pypz", 60, -.005,.005); - hpxpz = aida.histogram1D("pxpz", 60, .025,.035); - - - hpypz_mid = aida.histogram1D("pypz mid", 60, -.005,.005); - hpxpz_mid = aida.histogram1D("pxpz mid", 60, .025,.035); - - hpypz_topHighE = aida.histogram1D("pypz top", 30, -.005,.005); - hpxpz_topHighE = aida.histogram1D("pxpz top", 30, .025,.035); - - hpypz_botHighE = aida.histogram1D("pypz bot", 30, -.005,.005); - hpxpz_botHighE = aida.histogram1D("pxpz bot", 30, .025,.035); - - - pxpz_vs_diff = aida.profile1D("pxpz vs diff", 25, -.60, .60); - pypz_vs_diff = aida.profile1D("pypz vs diff", 25, -.60, .60); - - diff = aida.histogram1D("diff", 50, -.60, .60); - - sum = aida.histogram1D("sum", 50, 1.0, 1.1); - - pxpz_vs_sum = aida.profile1D("pxpz vs sum", 25, 1.0, 1.1); - pypz_vs_sum = aida.profile1D("pypz vs sum", 25, 1.0, 1.1); - - pxpz_vs_mass = aida.profile1D("pxpz vs mass", 25, .03, .037); - pypz_vs_mass = aida.profile1D("pypz vs mass", 25, .03, .037); - - //vtx_x = aida.histogram1D("vtx x", 60, -1, 1); - //vtx_y = aida.histogram1D("vtx y", 60, -1, 1); - mass = aida.histogram1D("mass", 60, .030, .037); - timediff = aida.histogram1D("time diff", 60, -6, 6); - - - /*pypz_tophighE = aida.histogram1D("topHighE pypz", 60, -.005,.005); - pxpz_tophighE = aida.histogram1D("topHighE pxpz", 60, .025,.035); - pypz_bottomhighE = aida.histogram1D("bottomHighE pypz", 60, -.005,.005); - pxpz_bottomhighE = aida.histogram1D("bottomHighE pxpz", 60, .025,.035);*/ - if(display){ - IPlotter p = aida.analysisFactory().createPlotterFactory().create(); - StyleUtil.setSize(p, 1300, 900); - //p.createRegions(3, 2); - p.createRegions(4, 3); - - p.region(0).plot(hpypz); - p.region(1).plot(hpxpz); - p.region(2).plot(timediff); - p.region(3).plot(pypz_vs_diff); - p.region(4).plot(pxpz_vs_diff); - p.region(5).plot(diff); - p.region(6).plot(pypz_vs_sum); - p.region(7).plot(pxpz_vs_sum); - p.region(8).plot(sum); - - p.region(9).plot(pypz_vs_mass); - p.region(10).plot(pxpz_vs_mass); - p.region(11).plot(mass); - /*p.region(2).plot(pypz_tophighE); - p.region(3).plot(pxpz_tophighE); - p.region(4).plot(pypz_bottomhighE); - p.region(5).plot(pxpz_bottomhighE);*/ - StyleUtil.stylize(p.region(0),"py/pz", "py/pz", "#"); - StyleUtil.stylize(p.region(1),"px/pz", "px/pz", "#"); - StyleUtil.stylize(p.region(2),"time diff (t-b)", "diff (ns)", "#"); - StyleUtil.stylize(p.region(3),"py/pz vs diff", "diff (GeV)", "py/pz"); - StyleUtil.stylize(p.region(4),"px/pz vs diff", "diff (GeV)", "px/pz"); - StyleUtil.stylize(p.region(5),"diff", "diff (GeV)", "#"); - - StyleUtil.stylize(p.region(6),"py/pz vs sum", "sum (GeV)", "py/pz"); - StyleUtil.stylize(p.region(7),"px/pz vs sum", "sum (GeV)", "px/pz"); - StyleUtil.stylize(p.region(8),"sum", "sum (GeV)", "#"); - - StyleUtil.stylize(p.region(9),"py/pz vs mass", "mass (GeV)", "py/pz"); - StyleUtil.stylize(p.region(10),"px/pz vs mass", "mass (GeV)", "px/pz"); - StyleUtil.stylize(p.region(11),"mass", "mass (GeV)", "#"); - - p.show(); - - IPlotter p2 = aida.analysisFactory().createPlotterFactory().create(); - - p2.createRegions(2, 1); - - - p2.region(0).plot(hpypz_botHighE); - p2.region(1).plot(hpxpz_botHighE); - p2.region(0).plot(hpypz_mid); - p2.region(1).plot(hpxpz_mid); - p2.region(0).plot(hpypz_topHighE); - p2.region(1).plot(hpxpz_topHighE); - - StyleUtil.stylize(p2.region(0),"py/pz", "py/pz", "#"); - StyleUtil.stylize(p2.region(1),"px/pz", "py/pz", "#"); - StyleUtil.noFillHistogramBars(p2.region(0)); - StyleUtil.noFillHistogramBars(p2.region(1)); - p2.show(); - } - } + @Override + public void process(EventHeader event){ + List<Vertex> mollers = event.get(Vertex.class, "TargetConstrainedMollerVertices"); + for(Vertex v : mollers){ + if(!passesCuts(v)) + continue; + ReconstructedParticle m = v.getAssociatedParticle(); + ReconstructedParticle top; + ReconstructedParticle bottom; + if(m.getParticles().get(0).getMomentum().y()>0){ + top = m.getParticles().get(0); + bottom = m.getParticles().get(1); + }else{ + top = m.getParticles().get(1); + bottom = m.getParticles().get(0); + } + + double pypz = m.getMomentum().y()/m.getMomentum().z(); + double pxpz = m.getMomentum().x()/m.getMomentum().z(); + //double pypz = (top.getMomentum().y()+bottom.getMomentum().y())/(top.getMomentum().z()+bottom.getMomentum().z()); + //double pxpz = (top.getMomentum().x()+bottom.getMomentum().x())/(top.getMomentum().z()+bottom.getMomentum().z()); + + hpypz.fill(pypz); + hpxpz.fill(pxpz); + + + double diff = top.getMomentum().z()-bottom.getMomentum().z(); + double sum = m.getMomentum().z();//top.getMomentum().z()+bottom.getMomentum().z(); + double mass = m.getMass(); + + if(diff > -.05 && diff < .05){ + hpypz_mid.fill(pypz); + hpxpz_mid.fill(pxpz); + } + + if(diff > .2 && diff < .3){ + hpypz_topHighE.fill(pypz); + hpxpz_topHighE.fill(pxpz); + } + + if(diff > -.3 && diff < -.2){ + hpypz_botHighE.fill(pypz); + hpxpz_botHighE.fill(pxpz); + } + + + this.diff.fill(diff); + this.sum.fill(sum); + this.mass.fill(mass); + pypz_vs_diff.fill(diff,pypz ); + pxpz_vs_diff.fill(diff, pxpz ); + + + + pxpz_vs_sum.fill(sum, pxpz ); + pypz_vs_sum.fill(sum, pypz ); + + pxpz_vs_mass.fill(mass, pxpz ); + pypz_vs_mass.fill(mass, pypz ); + timediff.fill(top.getClusters().get(0).getCalorimeterHits().get(0).getTime() + -bottom.getClusters().get(0).getCalorimeterHits().get(0).getTime()); + /*if(moreEnergetic.getMomentum().y() > 0) + { + pypz_tophighE.fill(pypz); + pxpz_tophighE.fill(pxpz); + } + if(moreEnergetic.getMomentum().y() < 0) + { + pypz_bottomhighE.fill(pypz); + pxpz_bottomhighE.fill(pxpz); + }*/ + } + } + + double _maxVtxChi2 = 15; + double _maxTrkChi2 = 30; + double _maxMass = .037; + double _minMass = .030; + double _minPz = 1.0; + double _maxPz = 1.1; + boolean passesCuts(Vertex vertex){ + ReconstructedParticle m = vertex.getAssociatedParticle(); + if(!TrackType.isGBL(m.getType())) + return false; + if(m.getMomentum().z() > _maxPz || m.getMomentum().z() < _minPz) + return false; + if(m.getMass() > _maxMass || m.getMass() < _minMass) + return false; + + if(m.getParticles().get(0).getCharge() != -1 + || m.getParticles().get(1).getCharge() != -1 ) + return false; + + if(vertex.getChi2() > _maxVtxChi2) + return false; + + + if(m.getParticles().get(0).getClusters().size() == 0) + return false; + if(m.getParticles().get(1).getClusters().size() == 0) + return false; + + if(m.getParticles().get(0).getTracks().get(0).getChi2() > _maxTrkChi2) + return false; + if(m.getParticles().get(1).getTracks().get(0).getChi2() > _maxTrkChi2) + return false; + return true; + } + + IHistogram1D hpypz, hpxpz, diff, sum, mass, + hpypz_topHighE, hpxpz_topHighE, + hpypz_botHighE, hpxpz_botHighE, + hpypz_mid, hpxpz_mid; + + boolean display = false; + + + + + public double getMaxVtxChi2() { + return _maxVtxChi2; + } + + + public void setMaxVtxChi2(double _maxVtxChi2) { + this._maxVtxChi2 = _maxVtxChi2; + } + + + public double getMaxTrkChi2() { + return _maxTrkChi2; + } + + + public void setMaxTrkChi2(double _maxTrkChi2) { + this._maxTrkChi2 = _maxTrkChi2; + } + + + public double getMaxMass() { + return _maxMass; + } + + + public void setMaxMass(double _maxMass) { + this._maxMass = _maxMass; + } + + + public double getMinMass() { + return _minMass; + } + + + public void setMinMass(double _minMass) { + this._minMass = _minMass; + } + + + public double getMinPz() { + return _minPz; + } + + + public void setMinPz(double _minPz) { + this._minPz = _minPz; + } + + + public double getMaxPz() { + return _maxPz; + } + + + public void setMaxPz(double _maxPz) { + this._maxPz = _maxPz; + } + + + public boolean getDisplay() { + return display; + } + + + public void setDisplay(boolean display) { + this.display = display; + } + + IHistogram1D vtx_x, vtx_y, timediff; + + IProfile1D pxpz_vs_diff, pypz_vs_diff, pxpz_vs_sum, pypz_vs_sum, + pxpz_vs_mass, pypz_vs_mass; + + + //IHistogram1D pypz_tophighE, pxpz_tophighE; + //IHistogram1D pypz_bottomhighE, pxpz_bottomhighE; + @Override + public void startOfData(){ + AIDA aida = AIDA.defaultInstance(); + hpypz = aida.histogram1D("pypz", 60, -.005,.005); + hpxpz = aida.histogram1D("pxpz", 60, .025,.035); + + + hpypz_mid = aida.histogram1D("pypz mid", 60, -.005,.005); + hpxpz_mid = aida.histogram1D("pxpz mid", 60, .025,.035); + + hpypz_topHighE = aida.histogram1D("pypz top", 30, -.005,.005); + hpxpz_topHighE = aida.histogram1D("pxpz top", 30, .025,.035); + + hpypz_botHighE = aida.histogram1D("pypz bot", 30, -.005,.005); + hpxpz_botHighE = aida.histogram1D("pxpz bot", 30, .025,.035); + + + pxpz_vs_diff = aida.profile1D("pxpz vs diff", 25, -.60, .60); + pypz_vs_diff = aida.profile1D("pypz vs diff", 25, -.60, .60); + + diff = aida.histogram1D("diff", 50, -.60, .60); + + sum = aida.histogram1D("sum", 50, 1.0, 1.1); + + pxpz_vs_sum = aida.profile1D("pxpz vs sum", 25, 1.0, 1.1); + pypz_vs_sum = aida.profile1D("pypz vs sum", 25, 1.0, 1.1); + + pxpz_vs_mass = aida.profile1D("pxpz vs mass", 25, .03, .037); + pypz_vs_mass = aida.profile1D("pypz vs mass", 25, .03, .037); + + //vtx_x = aida.histogram1D("vtx x", 60, -1, 1); + //vtx_y = aida.histogram1D("vtx y", 60, -1, 1); + mass = aida.histogram1D("mass", 60, .030, .037); + timediff = aida.histogram1D("time diff", 60, -6, 6); + + + /*pypz_tophighE = aida.histogram1D("topHighE pypz", 60, -.005,.005); + pxpz_tophighE = aida.histogram1D("topHighE pxpz", 60, .025,.035); + pypz_bottomhighE = aida.histogram1D("bottomHighE pypz", 60, -.005,.005); + pxpz_bottomhighE = aida.histogram1D("bottomHighE pxpz", 60, .025,.035);*/ + if(display){ + IPlotter p = aida.analysisFactory().createPlotterFactory().create(); + StyleUtil.setSize(p, 1300, 900); + //p.createRegions(3, 2); + p.createRegions(4, 3); + + p.region(0).plot(hpypz); + p.region(1).plot(hpxpz); + p.region(2).plot(timediff); + p.region(3).plot(pypz_vs_diff); + p.region(4).plot(pxpz_vs_diff); + p.region(5).plot(diff); + p.region(6).plot(pypz_vs_sum); + p.region(7).plot(pxpz_vs_sum); + p.region(8).plot(sum); + + p.region(9).plot(pypz_vs_mass); + p.region(10).plot(pxpz_vs_mass); + p.region(11).plot(mass); + /*p.region(2).plot(pypz_tophighE); + p.region(3).plot(pxpz_tophighE); + p.region(4).plot(pypz_bottomhighE); + p.region(5).plot(pxpz_bottomhighE);*/ + StyleUtil.stylize(p.region(0),"py/pz", "py/pz", "#"); + StyleUtil.stylize(p.region(1),"px/pz", "px/pz", "#"); + StyleUtil.stylize(p.region(2),"time diff (t-b)", "diff (ns)", "#"); + StyleUtil.stylize(p.region(3),"py/pz vs diff", "diff (GeV)", "py/pz"); + StyleUtil.stylize(p.region(4),"px/pz vs diff", "diff (GeV)", "px/pz"); + StyleUtil.stylize(p.region(5),"diff", "diff (GeV)", "#"); + + StyleUtil.stylize(p.region(6),"py/pz vs sum", "sum (GeV)", "py/pz"); + StyleUtil.stylize(p.region(7),"px/pz vs sum", "sum (GeV)", "px/pz"); + StyleUtil.stylize(p.region(8),"sum", "sum (GeV)", "#"); + + StyleUtil.stylize(p.region(9),"py/pz vs mass", "mass (GeV)", "py/pz"); + StyleUtil.stylize(p.region(10),"px/pz vs mass", "mass (GeV)", "px/pz"); + StyleUtil.stylize(p.region(11),"mass", "mass (GeV)", "#"); + + p.show(); + + IPlotter p2 = aida.analysisFactory().createPlotterFactory().create(); + + p2.createRegions(2, 1); + + + p2.region(0).plot(hpypz_botHighE); + p2.region(1).plot(hpxpz_botHighE); + p2.region(0).plot(hpypz_mid); + p2.region(1).plot(hpxpz_mid); + p2.region(0).plot(hpypz_topHighE); + p2.region(1).plot(hpxpz_topHighE); + + StyleUtil.stylize(p2.region(0),"py/pz", "py/pz", "#"); + StyleUtil.stylize(p2.region(1),"px/pz", "py/pz", "#"); + StyleUtil.noFillHistogramBars(p2.region(0)); + StyleUtil.noFillHistogramBars(p2.region(1)); + p2.show(); + } + } } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerBeamtiltFitter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerBeamtiltFitter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerBeamtiltFitter.java Wed Mar 9 11:43:24 2016 @@ -15,51 +15,51 @@ import org.hps.users.spaul.StyleUtil; public class MollerBeamtiltFitter { - static IAnalysisFactory af = IAnalysisFactory.create(); - static IFitFactory ff = af.createFitFactory(); - static IPlotterFactory pf = af.createPlotterFactory(); - - public static void main(String arg[]) throws IllegalArgumentException, IOException{ - - ITree tree = af.createTreeFactory().create(arg[0]); - + static IAnalysisFactory af = IAnalysisFactory.create(); + static IFitFactory ff = af.createFitFactory(); + static IPlotterFactory pf = af.createPlotterFactory(); + + public static void main(String arg[]) throws IllegalArgumentException, IOException{ + + ITree tree = af.createTreeFactory().create(arg[0]); + - IPlotter p; - - p = pf.create(); - p.createRegions(2, 1); + IPlotter p; + + p = pf.create(); + p.createRegions(2, 1); - plotAndFit(p, 0, (IHistogram1D)tree.find("pxpz"), "ux", "ux"); - plotAndFit(p, 1, (IHistogram1D)tree.find("pypz"), "uy", "uy"); - StyleUtil.setSize(p, 1000, 500); - p.show(); - - } - public static void plotAndFit(IPlotter p, int r, IHistogram1D h, String title, String xAxis){ - p.region(r).plot(h); - h.setTitle(title); - - double xmin = h.mean()-2*h.rms(); - double xmax = h.mean()+2*h.rms(); - String range = String.format("range=\"(%f,%f)\"", xmin, xmax); - //range = ""; - IFitResult fit = ff.createFitter().fit(h, "g", range); - IFunction func = fit.fittedFunction(); - System.out.println("\n" + h.title()); - String names[] = func.parameterNames(); - double params[] = func.parameters(); - for(int i = 0; i< names.length; i++){ - System.out.printf("%s: %f\t", names[i], params[i]); - } - //System.out.println(Arrays.toString(fit.); - IPlotterStyle style = p.region(r).style(); - style.dataStyle().outlineStyle().setColor("blue"); - p.region(r).plot(func, style); - StyleUtil.noFillHistogramBars(p.region(r)); - StyleUtil.stylize(p.region(r), title, xAxis, "#"); - p.region(r).style().statisticsBoxStyle().setVisible(true); - p.region(r).style().legendBoxStyle().setVisible(false); - //System.out.println(Arrays.toString(p.region(r).style().statisticsBoxStyle().availableParameters())); - //p.show(); - } + plotAndFit(p, 0, (IHistogram1D)tree.find("pxpz"), "ux", "ux"); + plotAndFit(p, 1, (IHistogram1D)tree.find("pypz"), "uy", "uy"); + StyleUtil.setSize(p, 1000, 500); + p.show(); + + } + public static void plotAndFit(IPlotter p, int r, IHistogram1D h, String title, String xAxis){ + p.region(r).plot(h); + h.setTitle(title); + + double xmin = h.mean()-2*h.rms(); + double xmax = h.mean()+2*h.rms(); + String range = String.format("range=\"(%f,%f)\"", xmin, xmax); + //range = ""; + IFitResult fit = ff.createFitter().fit(h, "g", range); + IFunction func = fit.fittedFunction(); + System.out.println("\n" + h.title()); + String names[] = func.parameterNames(); + double params[] = func.parameters(); + for(int i = 0; i< names.length; i++){ + System.out.printf("%s: %f\t", names[i], params[i]); + } + //System.out.println(Arrays.toString(fit.); + IPlotterStyle style = p.region(r).style(); + style.dataStyle().outlineStyle().setColor("blue"); + p.region(r).plot(func, style); + StyleUtil.noFillHistogramBars(p.region(r)); + StyleUtil.stylize(p.region(r), title, xAxis, "#"); + p.region(r).style().statisticsBoxStyle().setVisible(true); + p.region(r).style().legendBoxStyle().setVisible(false); + //System.out.println(Arrays.toString(p.region(r).style().statisticsBoxStyle().availableParameters())); + //p.show(); + } } Modified: java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerStdhepTest.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerStdhepTest.java (original) +++ java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerStdhepTest.java Wed Mar 9 11:43:24 2016 @@ -8,8 +8,8 @@ public class MollerStdhepTest { - public static void main(String arg[]) throws IOException - { - - } + public static void main(String arg[]) throws IOException + { + + } } Modified: java/trunk/util/src/main/java/org/hps/util/ConvertToStdhep.java ============================================================================= --- java/trunk/util/src/main/java/org/hps/util/ConvertToStdhep.java (original) +++ java/trunk/util/src/main/java/org/hps/util/ConvertToStdhep.java Wed Mar 9 11:43:24 2016 @@ -502,10 +502,10 @@ }*/ static private double getDecayLength(double gamma){ - Random generator = new Random(); - double a = generator.nextDouble(); - double l = -gamma*_declength*Math.log(1-a); - return l; + Random generator = new Random(); + double a = generator.nextDouble(); + double l = -gamma*_declength*Math.log(1-a); + return l; } /* @@ -724,7 +724,7 @@ double gamma = ApEnergy / ApMass; if (expDecay) { decLen = getDecayLength(gamma); - // decLen = getDecayLength(maxWght, gamma); + // decLen = getDecayLength(maxWght, gamma); } if (flatDecay) { decLen = generator.nextDouble() * maxLen; Modified: java/trunk/util/src/main/java/org/hps/util/DumpLHEEventsToASCII.java ============================================================================= --- java/trunk/util/src/main/java/org/hps/util/DumpLHEEventsToASCII.java (original) +++ java/trunk/util/src/main/java/org/hps/util/DumpLHEEventsToASCII.java Wed Mar 9 11:43:24 2016 @@ -108,7 +108,7 @@ String sigyString = String.valueOf(sigy); eptString = convertDecimal(eptString); if (cl.hasOption("t")) { - trident=true; + trident=true; } if (cl.hasOption("m")) { massString = cl.getOptionValue("m"); @@ -475,7 +475,7 @@ throw new RuntimeException("Unexpected entry for number of particles"); } int nhep = nums.get(0).intValue(); - // System.out.println("Number of particles for event " + nevhep + ": " + nhep); + // System.out.println("Number of particles for event " + nevhep + ": " + nhep); double decLen = 0; double maxWght = 0; @@ -503,14 +503,14 @@ if (vals.size() != 13) { throw new RuntimeException("Unexpected entry for a particle"); } - idhepTmp = vals.get(0).intValue(); -// System.out.println(idhepTmp); + idhepTmp = vals.get(0).intValue(); +// System.out.println(idhepTmp); if (vals.get(1).intValue() == 9) {//apparently, vertices aren't counted in nhep - nhep++; - } + nhep++; + } if (vals.get(1).intValue() == 1) {//ignore initial & intermediate state particles - // System.out.println("Ok...good"+idhepTmp); + // System.out.println("Ok...good"+idhepTmp); @@ -523,8 +523,8 @@ phepRec[j] = vals.get(j + 6); if (idhepTmp == -623){ phepNuc[j] = vals.get(j + 6); - // System.out.println("Found the recoil nucleus"); - } + // System.out.println("Found the recoil nucleus"); + } }