Author: [log in to unmask] Date: Mon Nov 3 01:04:28 2014 New Revision: 1421 Log: Merge trunk changes through r1420 into hps_java_trunk_HPSJAVA-255. This is the final merge before attempting to merge into the trunk. Added: java/branches/hps_java_trunk_HPSJAVA-255/conditions/src/main/java/org/hps/conditions/cli/ - copied from r1420, java/trunk/conditions/src/main/java/org/hps/conditions/cli/ java/branches/hps_java_trunk_HPSJAVA-255/detector-data/detectors/HPSTestRunTracker2014-v0-test1/ - copied from r1420, java/trunk/detector-data/detectors/HPSTestRunTracker2014-v0-test1/ java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/DataFileViewer.java - copied unchanged from r1420, java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/DataFileViewer.java java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PDataEventViewer.java - copied unchanged from r1420, java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PDataEventViewer.java java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ResizableFieldPanel.java - copied unchanged from r1420, java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ResizableFieldPanel.java java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/CrystalDataSet.java - copied unchanged from r1420, java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/CrystalDataSet.java java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/EcalWiringManager.java - copied unchanged from r1420, java/trunk/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/util/EcalWiringManager.java java/branches/hps_java_trunk_HPSJAVA-255/integration-tests/src/test/java/org/hps/DataQualityMonitorTest.java - copied unchanged from r1420, java/trunk/integration-tests/src/test/java/org/hps/DataQualityMonitorTest.java java/branches/hps_java_trunk_HPSJAVA-255/integration-tests/src/test/resources/org/hps/steering/test/DataQualityTest.lcsim - copied unchanged from r1420, java/trunk/integration-tests/src/test/resources/org/hps/steering/test/DataQualityTest.lcsim java/branches/hps_java_trunk_HPSJAVA-255/steering-files/src/main/resources/org/hps/steering/users/phansson/TestRunOfflineRecon.lcsim - copied unchanged from r1420, java/trunk/steering-files/src/main/resources/org/hps/steering/users/phansson/TestRunOfflineRecon.lcsim java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/recon/tracking/nobfield/StraightTrack2DFitter.java - copied unchanged from r1420, java/trunk/tracking/src/main/java/org/hps/recon/tracking/nobfield/StraightTrack2DFitter.java java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/recon/tracking/nobfield/StraightTrackConfirmerExtender.java - copied unchanged from r1420, java/trunk/tracking/src/main/java/org/hps/recon/tracking/nobfield/StraightTrackConfirmerExtender.java java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/recon/tracking/nobfield/StraightTrackFitter.java - copied unchanged from r1420, java/trunk/tracking/src/main/java/org/hps/recon/tracking/nobfield/StraightTrackFitter.java java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/recon/tracking/nobfield/StraightTrackReconDriver.java - copied unchanged from r1420, java/trunk/tracking/src/main/java/org/hps/recon/tracking/nobfield/StraightTrackReconDriver.java java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/recon/tracking/nobfield/StraightTracker.java - copied unchanged from r1420, java/trunk/tracking/src/main/java/org/hps/recon/tracking/nobfield/StraightTracker.java java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/svt/alignment/BuildMillepedeCompact.java - copied unchanged from r1420, java/trunk/tracking/src/main/java/org/hps/svt/alignment/BuildMillepedeCompact.java java/branches/hps_java_trunk_HPSJAVA-255/users/src/main/java/org/hps/users/luca/TruthReader.java - copied unchanged from r1420, java/trunk/users/src/main/java/org/hps/users/luca/TruthReader.java java/branches/hps_java_trunk_HPSJAVA-255/users/src/main/java/org/hps/users/phansson/TrackingReconstructionPlots.java - copied unchanged from r1420, java/trunk/users/src/main/java/org/hps/users/phansson/TrackingReconstructionPlots.java Removed: java/branches/hps_java_trunk_HPSJAVA-255/conditions/src/test/java/org/hps/conditions/ecal/EcalDaqTest.java java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/recon/tracking/nobfield/HitOnTrackChecker.java java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/recon/tracking/nobfield/StraightTrack.java java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/recon/tracking/nobfield/TrackChecker.java java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/recon/tracking/nobfield/TrackCollectionUtilities.java Modified: java/branches/hps_java_trunk_HPSJAVA-255/ (props changed) java/branches/hps_java_trunk_HPSJAVA-255/analysis/pom.xml java/branches/hps_java_trunk_HPSJAVA-255/analysis/src/main/java/org/hps/analysis/examples/TrackAnalysis.java java/branches/hps_java_trunk_HPSJAVA-255/conditions/ (props changed) java/branches/hps_java_trunk_HPSJAVA-255/conditions/pom.xml java/branches/hps_java_trunk_HPSJAVA-255/conditions/src/main/java/org/hps/conditions/DatabaseConditionsManager.java java/branches/hps_java_trunk_HPSJAVA-255/conditions/src/main/java/org/hps/conditions/QueryBuilder.java java/branches/hps_java_trunk_HPSJAVA-255/conditions/src/test/java/org/hps/conditions/ecal/PhysicalToGainTest.java java/branches/hps_java_trunk_HPSJAVA-255/detector-data/detectors/HPSTestRunTracker2014-v0/HPSTestRunTracker2014-v0.lcdd java/branches/hps_java_trunk_HPSJAVA-255/detector-data/detectors/HPSTestRunTracker2014-v0/compact.xml java/branches/hps_java_trunk_HPSJAVA-255/detector-data/pom.xml java/branches/hps_java_trunk_HPSJAVA-255/distribution/ (props changed) java/branches/hps_java_trunk_HPSJAVA-255/distribution/pom.xml java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/pom.xml java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ActiveViewer.java java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ClusterViewer.java java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/FileViewer.java java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/OccupancyViewer.java java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PEventViewer.java java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/POccupancyViewer.java java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PassiveViewer.java java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/StatusPanel.java java/branches/hps_java_trunk_HPSJAVA-255/ecal-readout-sim/pom.xml java/branches/hps_java_trunk_HPSJAVA-255/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCPrimaryTriggerDriver.java java/branches/hps_java_trunk_HPSJAVA-255/ecal-readout-sim/src/main/java/org/hps/readout/ecal/MollerTriggerDriver.java java/branches/hps_java_trunk_HPSJAVA-255/ecal-recon/pom.xml java/branches/hps_java_trunk_HPSJAVA-255/evio/pom.xml java/branches/hps_java_trunk_HPSJAVA-255/integration-tests/ (props changed) java/branches/hps_java_trunk_HPSJAVA-255/integration-tests/pom.xml java/branches/hps_java_trunk_HPSJAVA-255/integration-tests/src/test/java/org/hps/HPSTestRunTracker2014GeometryTrackReconTest.java java/branches/hps_java_trunk_HPSJAVA-255/integration-tests/src/test/java/org/hps/SimpleSvtReadoutTest.java java/branches/hps_java_trunk_HPSJAVA-255/monitoring-app/pom.xml java/branches/hps_java_trunk_HPSJAVA-255/monitoring-app/src/main/java/org/hps/monitoring/gui/MonitoringApplication.java java/branches/hps_java_trunk_HPSJAVA-255/monitoring-app/src/main/java/org/hps/monitoring/subsys/SystemStatusImpl.java java/branches/hps_java_trunk_HPSJAVA-255/monitoring-drivers/pom.xml java/branches/hps_java_trunk_HPSJAVA-255/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/example/DummyErrorDriver.java java/branches/hps_java_trunk_HPSJAVA-255/parent/pom.xml java/branches/hps_java_trunk_HPSJAVA-255/plugin/pom.xml java/branches/hps_java_trunk_HPSJAVA-255/pom.xml java/branches/hps_java_trunk_HPSJAVA-255/recon/pom.xml java/branches/hps_java_trunk_HPSJAVA-255/recon/src/main/java/org/hps/recon/particle/HpsReconParticleDriver.java java/branches/hps_java_trunk_HPSJAVA-255/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java java/branches/hps_java_trunk_HPSJAVA-255/recon/src/main/java/org/hps/recon/particle/TestRunReconParticleDriver.java java/branches/hps_java_trunk_HPSJAVA-255/record-util/pom.xml java/branches/hps_java_trunk_HPSJAVA-255/steering-files/pom.xml java/branches/hps_java_trunk_HPSJAVA-255/steering-files/src/main/resources/org/hps/steering/monitoring/DummyError.lcsim java/branches/hps_java_trunk_HPSJAVA-255/tracking/pom.xml java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/recon/tracking/MultipleScattering.java java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/recon/tracking/nobfield/StraightTrackFinder.java java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/svt/alignment/BuildCompact.java java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/test/java/org/hps/recon/tracking/TrackRecoFromScratchTest.java (contents, props changed) java/branches/hps_java_trunk_HPSJAVA-255/users/pom.xml java/branches/hps_java_trunk_HPSJAVA-255/users/src/main/java/org/hps/users/luca/FEETrigger.java java/branches/hps_java_trunk_HPSJAVA-255/users/src/main/java/org/hps/users/luca/RawDataReader.java java/branches/hps_java_trunk_HPSJAVA-255/users/src/main/java/org/hps/users/mgraham/StraightTrackAnalysis.java java/branches/hps_java_trunk_HPSJAVA-255/util/pom.xml Modified: java/branches/hps_java_trunk_HPSJAVA-255/analysis/pom.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/analysis/pom.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/analysis/pom.xml Mon Nov 3 01:04:28 2014 @@ -8,7 +8,7 @@ <groupId>org.hps</groupId> <artifactId>hps-parent</artifactId> <relativePath>../parent/pom.xml</relativePath> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <scm> <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/analysis/</url> Modified: java/branches/hps_java_trunk_HPSJAVA-255/analysis/src/main/java/org/hps/analysis/examples/TrackAnalysis.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/analysis/src/main/java/org/hps/analysis/examples/TrackAnalysis.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/analysis/src/main/java/org/hps/analysis/examples/TrackAnalysis.java Mon Nov 3 01:04:28 2014 @@ -97,9 +97,6 @@ _hasLayerOne = false; // Loop over the hits on the track and make sure we have HelicalTrackHits (which contain the MC particle) for (TrackerHit hit : trk.getTrackerHits()) { - HelicalTrackHit htc = (HelicalTrackHit) hit; - if (htc.Detector().equals("BeamSpot")) - continue; // get the set of MCParticles associated with this hit and update the hit count for each MCParticle Set<MCParticle> mclist = hittomc.allFrom(hit); @@ -115,7 +112,7 @@ countHit((HelicalTrackCross) hit); else if (hit instanceof HelicalTrack2DHit) countHit((HelicalTrack2DHit) hit); - else + else if (!(hit instanceof HelicalTrack2DHit )) //probably SOITrackerHit countHit(hit, rthtosimhit, hittostrip, hittorotated); } Modified: java/branches/hps_java_trunk_HPSJAVA-255/conditions/pom.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/conditions/pom.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/conditions/pom.xml Mon Nov 3 01:04:28 2014 @@ -8,7 +8,7 @@ <groupId>org.hps</groupId> <artifactId>hps-parent</artifactId> <relativePath>../parent/pom.xml</relativePath> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <scm> <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/conditions/</url> Modified: java/branches/hps_java_trunk_HPSJAVA-255/conditions/src/main/java/org/hps/conditions/DatabaseConditionsManager.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/conditions/src/main/java/org/hps/conditions/DatabaseConditionsManager.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/conditions/src/main/java/org/hps/conditions/DatabaseConditionsManager.java Mon Nov 3 01:04:28 2014 @@ -26,8 +26,6 @@ import org.lcsim.conditions.ConditionsConverter; import org.lcsim.conditions.ConditionsManager; import org.lcsim.conditions.ConditionsManagerImplementation; -import org.lcsim.conditions.ConditionsReader; -import org.lcsim.conditions.readers.BaseClasspathConditionsReader; import org.lcsim.geometry.Detector; import org.lcsim.util.loop.DetectorConditionsConverter; @@ -269,6 +267,33 @@ logger.fine("new collection ID " + collectionId + " created for table " + tableName); return collectionId; } + + /** + * This method will return true if the given collection ID already exists in the table. + * @param tableName The name of the table. + * @param collectionID The collection ID value. + * @return True if collection exists. + */ + public boolean collectionExists(String tableName, int collectionID) { + String sql = "SELECT * FROM " + tableName + " where collection_id = " + collectionID; + ResultSet resultSet = selectQuery(sql); + try { + resultSet.last(); + } catch (SQLException e) { + e.printStackTrace(); + } + int rowCount = 0; + try { + rowCount = resultSet.getRow(); + } catch (SQLException e) { + e.printStackTrace(); + } + if (rowCount != 0) { + return true; + } else { + return false; + } + } /** * Get the list of table meta data. @@ -297,6 +322,7 @@ * @param type The collection class. * @return The table meta data. */ + // FIXME: This should return a list in case of multiple conditions defined with same type. public TableMetaData findTableMetaData(Class type) { for (TableMetaData meta : tableMetaData) { if (meta.getCollectionClass().equals(type)) { Modified: java/branches/hps_java_trunk_HPSJAVA-255/conditions/src/main/java/org/hps/conditions/QueryBuilder.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/conditions/src/main/java/org/hps/conditions/QueryBuilder.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/conditions/src/main/java/org/hps/conditions/QueryBuilder.java Mon Nov 3 01:04:28 2014 @@ -1,16 +1,18 @@ package org.hps.conditions; + +import java.util.List; /** * This is a static utility class for building SQL queries for the conditions system. * * @author Jeremy McCormick <[log in to unmask]> */ -final class QueryBuilder { +public final class QueryBuilder { private QueryBuilder() { } - static String buildSelect(String tableName, int collectionId, String[] fields, String order) { + public static String buildSelect(String tableName, int collectionId, String[] fields, String order) { StringBuffer buff = new StringBuffer(); buff.append("SELECT "); if (fields == null) { @@ -32,7 +34,7 @@ return buff.toString(); } - static String buildUpdate(String tableName, int rowId, String[] fields, Object[] values) { + public static String buildUpdate(String tableName, int rowId, String[] fields, Object[] values) { if (fields.length != values.length) throw new IllegalArgumentException("The field and value arrays are different lengths."); StringBuffer buff = new StringBuffer(); @@ -45,7 +47,7 @@ return buff.toString(); } - static String buildInsert(String tableName, int collectionId, String[] fields, Object[] values) { + public static String buildInsert(String tableName, int collectionId, String[] fields, Object[] values) { if (fields.length != values.length) throw new IllegalArgumentException("The field and value arrays are different lengths."); StringBuffer buff = new StringBuffer(); @@ -60,12 +62,31 @@ buff.append(") "); return buff.toString(); } + + public static String buildInsert(String tableName, int collectionID, List<String> columnNames, List<List<String>> rows) { + StringBuffer buff = new StringBuffer(); + buff.append("INSERT INTO " + tableName + " ( collection_id"); + for (String column : columnNames) { + buff.append(", " + column); + } + buff.append(" ) VALUES "); + for (List<String> values : rows) { + buff.append("( "); + buff.append(collectionID); + for (String value : values) { + buff.append(", '" + value + "'"); + } + buff.append("), "); + } + buff.setLength(buff.length() - 2); + return buff.toString(); + } + - static String buildDelete(String tableName, int rowId) { + public static String buildDelete(String tableName, int rowId) { if (rowId <= 0) throw new IllegalArgumentException("Invalid row ID: " + rowId); String query = "DELETE FROM " + tableName + " WHERE id = " + rowId; return query; - } - + } } Modified: java/branches/hps_java_trunk_HPSJAVA-255/conditions/src/test/java/org/hps/conditions/ecal/PhysicalToGainTest.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/conditions/src/test/java/org/hps/conditions/ecal/PhysicalToGainTest.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/conditions/src/test/java/org/hps/conditions/ecal/PhysicalToGainTest.java Mon Nov 3 01:04:28 2014 @@ -25,8 +25,6 @@ * This is a simple example of how to retrieve the gain and noise by physical ID (X,Y) in * the ECAL. * @author Jeremy McCormick <[log in to unmask]> - * - * @version $Id$ * */ public class PhysicalToGainTest extends TestCase { Modified: java/branches/hps_java_trunk_HPSJAVA-255/detector-data/detectors/HPSTestRunTracker2014-v0/HPSTestRunTracker2014-v0.lcdd ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/detector-data/detectors/HPSTestRunTracker2014-v0/HPSTestRunTracker2014-v0.lcdd (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/detector-data/detectors/HPSTestRunTracker2014-v0/HPSTestRunTracker2014-v0.lcdd Mon Nov 3 01:04:28 2014 @@ -2,7 +2,7 @@ <lcdd xmlns:lcdd="http://www.lcsim.org/schemas/lcdd/1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcdd/1.0/lcdd.xsd"> <header> <detector name="HPSTestRunTracker2014-v0" /> - <generator name="GeomConverter" version="1.0" file="../../hps-java/detector-data/detectors/HPSTestRunTracker2014-v0/compact.xml" checksum="1324664074" /> + <generator name="GeomConverter" version="1.0" file="compact.xml" checksum="3588067236" /> <author name="NONE" /> <comment>new SVT test run geometry</comment> </header> @@ -130,275 +130,273 @@ <constant name="tracking_region_zmax" value="1318.0" /> <constant name="ecal_back" value="8.0" /> <constant name="dipoleMagnetHeight" value="177.8" /> - <position name="beamPlaneVol_position" x="0.0" y="4.999999999999999E-9" z="1.1368683772161603E-13" unit="mm" /> - <rotation name="beamPlaneVol_rotation" x="1.5707963267948963" y="-0.0" z="0.0" unit="radian" /> <position name="base_position" x="30.19999999999999" y="0.9999999999999858" z="318.59000000000015" unit="mm" /> <rotation name="base_rotation" x="1.5707963267948963" y="-0.0" z="0.0" unit="radian" /> <position name="baseplate_position" x="0.0" y="-1.1368683772161603E-13" z="-84.725" unit="mm" /> <rotation name="baseplate_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="support_plate_bottom_position" x="-103.25405804451006" y="-95.60825753895892" z="-65.19999999999999" unit="mm" /> - <rotation name="support_plate_bottom_rotation" x="0.0" y="-0.0" z="-0.030004635148837874" unit="radian" /> + <position name="support_plate_bottom_position" x="-103.25405804451009" y="-95.60825753895904" z="-65.19999999999999" unit="mm" /> + <rotation name="support_plate_bottom_rotation" x="0.0" y="-0.0" z="-0.030004635148837944" unit="radian" /> <position name="support_plate_top_position" x="-103.25405804451009" y="-95.60825753895904" z="63.2" unit="mm" /> - <rotation name="support_plate_top_rotation" x="0.0" y="-0.0" z="-0.030004635148837947" unit="radian" /> - <position name="module_L1b_position" x="-44.47602421588729" y="199.33784811297414" z="-20.85" unit="mm" /> - <rotation name="module_L1b_rotation" x="0.0" y="-0.0" z="-0.03000463514883733" unit="radian" /> + <rotation name="support_plate_top_rotation" x="0.0" y="-0.0" z="-0.030004635148837944" unit="radian" /> + <position name="module_L1b_position" x="-44.47602421588735" y="199.33784811297414" z="-20.85" unit="mm" /> + <rotation name="module_L1b_rotation" x="0.0" y="-0.0" z="-0.030004635148837944" unit="radian" /> <position name="module_L1b_halfmodule_axial_position" x="-3.8499999999999943" y="-3.94375" z="-4.234999999999999" unit="mm" /> - <rotation name="module_L1b_halfmodule_axial_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L1b_halfmodule_axial_sensor_position" x="30.0" y="0.48375" z="3.414999999999999" unit="mm" /> - <rotation name="module_L1b_halfmodule_axial_sensor_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <rotation name="module_L1b_halfmodule_axial_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <position name="module_L1b_halfmodule_axial_sensor_position" x="3.414999999999999" y="30.0" z="0.48375" unit="mm" /> + <rotation name="module_L1b_halfmodule_axial_sensor_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L1b_halfmodule_axial_sensor_active_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="module_L1b_halfmodule_axial_sensor_active_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L1b_halfmodule_axial_lamination_position" x="0.5" y="0.66875" z="2.414999999999999" unit="mm" /> + <position name="module_L1b_halfmodule_axial_lamination_position" x="2.414999999999999" y="0.5" z="0.66875" unit="mm" /> <rotation name="module_L1b_halfmodule_axial_lamination_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L1b_halfmodule_axial_cf_position" x="0.0" y="0.8187500000000001" z="-1.0850000000000009" unit="mm" /> + <position name="module_L1b_halfmodule_axial_cf_position" x="-1.0850000000000009" y="0.0" z="0.8187500000000001" unit="mm" /> <rotation name="module_L1b_halfmodule_axial_cf_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L1b_halfmodule_axial_hybrid_position" x="-55.0" y="-0.1499999999999999" z="3.4149999999999956" unit="mm" /> + <position name="module_L1b_halfmodule_axial_hybrid_position" x="3.414999999999999" y="-55.0" z="-0.1499999999999999" unit="mm" /> <rotation name="module_L1b_halfmodule_axial_hybrid_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L1b_halfmodule_stereo_position" x="-4.04105607618969" y="3.9437500000000005" z="-0.41706327498038576" unit="mm" /> - <rotation name="module_L1b_halfmodule_stereo_rotation" x="-3.141592653589793" y="-0.09999999999999999" z="-1.2287453501294631E-17" unit="radian" /> - <position name="module_L1b_halfmodule_stereo_sensor_position" x="30.0" y="0.48375" z="3.414999999999999" unit="mm" /> - <rotation name="module_L1b_halfmodule_stereo_sensor_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <rotation name="module_L1b_halfmodule_stereo_rotation" x="-1.5707963267948963" y="5.551115123125783E-17" z="1.4707963267948965" unit="radian" /> + <position name="module_L1b_halfmodule_stereo_sensor_position" x="3.414999999999999" y="30.0" z="0.48375" unit="mm" /> + <rotation name="module_L1b_halfmodule_stereo_sensor_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L1b_halfmodule_stereo_sensor_active_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="module_L1b_halfmodule_stereo_sensor_active_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L1b_halfmodule_stereo_lamination_position" x="0.5" y="0.66875" z="2.414999999999999" unit="mm" /> + <position name="module_L1b_halfmodule_stereo_lamination_position" x="2.414999999999999" y="0.5" z="0.66875" unit="mm" /> <rotation name="module_L1b_halfmodule_stereo_lamination_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L1b_halfmodule_stereo_cf_position" x="0.0" y="0.8187500000000001" z="-1.0850000000000009" unit="mm" /> + <position name="module_L1b_halfmodule_stereo_cf_position" x="-1.0850000000000009" y="0.0" z="0.8187500000000001" unit="mm" /> <rotation name="module_L1b_halfmodule_stereo_cf_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L1b_halfmodule_stereo_hybrid_position" x="-55.0" y="-0.1499999999999999" z="3.4149999999999956" unit="mm" /> + <position name="module_L1b_halfmodule_stereo_hybrid_position" x="3.414999999999999" y="-55.0" z="-0.1499999999999999" unit="mm" /> <rotation name="module_L1b_halfmodule_stereo_hybrid_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L1t_position" x="-44.92602621486762" y="214.3310965335436" z="18.85000000000001" unit="mm" /> - <rotation name="module_L1t_rotation" x="3.141592653589793" y="-0.0" z="0.030004635148837337" unit="radian" /> + <position name="module_L1t_position" x="-44.92602621486762" y="214.3310965335438" z="18.85000000000001" unit="mm" /> + <rotation name="module_L1t_rotation" x="3.141592653589793" y="-0.0" z="0.030004635148837944" unit="radian" /> <position name="module_L1t_halfmodule_axial_position" x="-3.8499999999999943" y="-3.94375" z="-4.234999999999999" unit="mm" /> - <rotation name="module_L1t_halfmodule_axial_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L1t_halfmodule_axial_sensor_position" x="30.0" y="0.48375" z="3.414999999999999" unit="mm" /> - <rotation name="module_L1t_halfmodule_axial_sensor_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <rotation name="module_L1t_halfmodule_axial_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <position name="module_L1t_halfmodule_axial_sensor_position" x="3.414999999999999" y="30.0" z="0.48375" unit="mm" /> + <rotation name="module_L1t_halfmodule_axial_sensor_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L1t_halfmodule_axial_sensor_active_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="module_L1t_halfmodule_axial_sensor_active_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L1t_halfmodule_axial_lamination_position" x="0.5" y="0.66875" z="2.414999999999999" unit="mm" /> + <position name="module_L1t_halfmodule_axial_lamination_position" x="2.414999999999999" y="0.5" z="0.66875" unit="mm" /> <rotation name="module_L1t_halfmodule_axial_lamination_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L1t_halfmodule_axial_cf_position" x="0.0" y="0.8187500000000001" z="-1.0850000000000009" unit="mm" /> + <position name="module_L1t_halfmodule_axial_cf_position" x="-1.0850000000000009" y="0.0" z="0.8187500000000001" unit="mm" /> <rotation name="module_L1t_halfmodule_axial_cf_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L1t_halfmodule_axial_hybrid_position" x="-55.0" y="-0.1499999999999999" z="3.4149999999999956" unit="mm" /> + <position name="module_L1t_halfmodule_axial_hybrid_position" x="3.414999999999999" y="-55.0" z="-0.1499999999999999" unit="mm" /> <rotation name="module_L1t_halfmodule_axial_hybrid_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L1t_halfmodule_stereo_position" x="-4.04105607618969" y="3.9437500000000005" z="-0.41706327498038576" unit="mm" /> - <rotation name="module_L1t_halfmodule_stereo_rotation" x="-3.141592653589793" y="-0.09999999999999999" z="-1.2287453501294631E-17" unit="radian" /> - <position name="module_L1t_halfmodule_stereo_sensor_position" x="30.0" y="0.48375" z="3.414999999999999" unit="mm" /> - <rotation name="module_L1t_halfmodule_stereo_sensor_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <rotation name="module_L1t_halfmodule_stereo_rotation" x="-1.5707963267948963" y="5.551115123125783E-17" z="1.4707963267948965" unit="radian" /> + <position name="module_L1t_halfmodule_stereo_sensor_position" x="3.414999999999999" y="30.0" z="0.48375" unit="mm" /> + <rotation name="module_L1t_halfmodule_stereo_sensor_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L1t_halfmodule_stereo_sensor_active_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="module_L1t_halfmodule_stereo_sensor_active_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L1t_halfmodule_stereo_lamination_position" x="0.5" y="0.66875" z="2.414999999999999" unit="mm" /> + <position name="module_L1t_halfmodule_stereo_lamination_position" x="2.414999999999999" y="0.5" z="0.66875" unit="mm" /> <rotation name="module_L1t_halfmodule_stereo_lamination_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L1t_halfmodule_stereo_cf_position" x="0.0" y="0.8187500000000001" z="-1.0850000000000009" unit="mm" /> + <position name="module_L1t_halfmodule_stereo_cf_position" x="-1.0850000000000009" y="0.0" z="0.8187500000000001" unit="mm" /> <rotation name="module_L1t_halfmodule_stereo_cf_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L1t_halfmodule_stereo_hybrid_position" x="-55.0" y="-0.1499999999999999" z="3.4149999999999956" unit="mm" /> + <position name="module_L1t_halfmodule_stereo_hybrid_position" x="3.414999999999999" y="-55.0" z="-0.1499999999999999" unit="mm" /> <rotation name="module_L1t_halfmodule_stereo_hybrid_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L2b_position" x="-41.47601088935221" y="99.38285864250997" z="-22.35" unit="mm" /> - <rotation name="module_L2b_rotation" x="0.0" y="-0.0" z="-0.03000463514883733" unit="radian" /> + <position name="module_L2b_position" x="-41.47601088935227" y="99.38285864250997" z="-22.35" unit="mm" /> + <rotation name="module_L2b_rotation" x="0.0" y="-0.0" z="-0.030004635148837944" unit="radian" /> <position name="module_L2b_halfmodule_axial_position" x="-3.8499999999999943" y="-3.94375" z="-4.234999999999999" unit="mm" /> - <rotation name="module_L2b_halfmodule_axial_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L2b_halfmodule_axial_sensor_position" x="30.0" y="0.48375" z="3.414999999999999" unit="mm" /> - <rotation name="module_L2b_halfmodule_axial_sensor_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <rotation name="module_L2b_halfmodule_axial_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <position name="module_L2b_halfmodule_axial_sensor_position" x="3.414999999999999" y="30.0" z="0.48375" unit="mm" /> + <rotation name="module_L2b_halfmodule_axial_sensor_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L2b_halfmodule_axial_sensor_active_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="module_L2b_halfmodule_axial_sensor_active_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L2b_halfmodule_axial_lamination_position" x="0.5" y="0.66875" z="2.414999999999999" unit="mm" /> + <position name="module_L2b_halfmodule_axial_lamination_position" x="2.414999999999999" y="0.5" z="0.66875" unit="mm" /> <rotation name="module_L2b_halfmodule_axial_lamination_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L2b_halfmodule_axial_cf_position" x="0.0" y="0.8187500000000001" z="-1.0850000000000009" unit="mm" /> + <position name="module_L2b_halfmodule_axial_cf_position" x="-1.0850000000000009" y="0.0" z="0.8187500000000001" unit="mm" /> <rotation name="module_L2b_halfmodule_axial_cf_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L2b_halfmodule_axial_hybrid_position" x="-55.0" y="-0.1499999999999999" z="3.4149999999999956" unit="mm" /> + <position name="module_L2b_halfmodule_axial_hybrid_position" x="3.414999999999999" y="-55.0" z="-0.1499999999999999" unit="mm" /> <rotation name="module_L2b_halfmodule_axial_hybrid_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L2b_halfmodule_stereo_position" x="-4.04105607618969" y="3.9437500000000005" z="-0.41706327498038576" unit="mm" /> - <rotation name="module_L2b_halfmodule_stereo_rotation" x="-3.141592653589793" y="-0.09999999999999999" z="-1.2287453501294631E-17" unit="radian" /> - <position name="module_L2b_halfmodule_stereo_sensor_position" x="30.0" y="0.48375" z="3.414999999999999" unit="mm" /> - <rotation name="module_L2b_halfmodule_stereo_sensor_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <rotation name="module_L2b_halfmodule_stereo_rotation" x="-1.5707963267948963" y="5.551115123125783E-17" z="1.4707963267948965" unit="radian" /> + <position name="module_L2b_halfmodule_stereo_sensor_position" x="3.414999999999999" y="30.0" z="0.48375" unit="mm" /> + <rotation name="module_L2b_halfmodule_stereo_sensor_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L2b_halfmodule_stereo_sensor_active_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="module_L2b_halfmodule_stereo_sensor_active_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L2b_halfmodule_stereo_lamination_position" x="0.5" y="0.66875" z="2.414999999999999" unit="mm" /> + <position name="module_L2b_halfmodule_stereo_lamination_position" x="2.414999999999999" y="0.5" z="0.66875" unit="mm" /> <rotation name="module_L2b_halfmodule_stereo_lamination_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L2b_halfmodule_stereo_cf_position" x="0.0" y="0.8187500000000001" z="-1.0850000000000009" unit="mm" /> + <position name="module_L2b_halfmodule_stereo_cf_position" x="-1.0850000000000009" y="0.0" z="0.8187500000000001" unit="mm" /> <rotation name="module_L2b_halfmodule_stereo_cf_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L2b_halfmodule_stereo_hybrid_position" x="-55.0" y="-0.1499999999999999" z="3.4149999999999956" unit="mm" /> + <position name="module_L2b_halfmodule_stereo_hybrid_position" x="3.414999999999999" y="-55.0" z="-0.1499999999999999" unit="mm" /> <rotation name="module_L2b_halfmodule_stereo_hybrid_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L2t_position" x="-41.92601288833254" y="114.37610706307942" z="20.35000000000001" unit="mm" /> - <rotation name="module_L2t_rotation" x="3.141592653589793" y="-0.0" z="0.030004635148837337" unit="radian" /> + <position name="module_L2t_position" x="-41.92601288833254" y="114.37610706307953" z="20.35000000000001" unit="mm" /> + <rotation name="module_L2t_rotation" x="3.141592653589793" y="-0.0" z="0.030004635148837944" unit="radian" /> <position name="module_L2t_halfmodule_axial_position" x="-3.8499999999999943" y="-3.94375" z="-4.234999999999999" unit="mm" /> - <rotation name="module_L2t_halfmodule_axial_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L2t_halfmodule_axial_sensor_position" x="30.0" y="0.48375" z="3.414999999999999" unit="mm" /> - <rotation name="module_L2t_halfmodule_axial_sensor_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <rotation name="module_L2t_halfmodule_axial_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <position name="module_L2t_halfmodule_axial_sensor_position" x="3.414999999999999" y="30.0" z="0.48375" unit="mm" /> + <rotation name="module_L2t_halfmodule_axial_sensor_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L2t_halfmodule_axial_sensor_active_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="module_L2t_halfmodule_axial_sensor_active_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L2t_halfmodule_axial_lamination_position" x="0.5" y="0.66875" z="2.414999999999999" unit="mm" /> + <position name="module_L2t_halfmodule_axial_lamination_position" x="2.414999999999999" y="0.5" z="0.66875" unit="mm" /> <rotation name="module_L2t_halfmodule_axial_lamination_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L2t_halfmodule_axial_cf_position" x="0.0" y="0.8187500000000001" z="-1.0850000000000009" unit="mm" /> + <position name="module_L2t_halfmodule_axial_cf_position" x="-1.0850000000000009" y="0.0" z="0.8187500000000001" unit="mm" /> <rotation name="module_L2t_halfmodule_axial_cf_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L2t_halfmodule_axial_hybrid_position" x="-55.0" y="-0.1499999999999999" z="3.4149999999999956" unit="mm" /> + <position name="module_L2t_halfmodule_axial_hybrid_position" x="3.414999999999999" y="-55.0" z="-0.1499999999999999" unit="mm" /> <rotation name="module_L2t_halfmodule_axial_hybrid_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L2t_halfmodule_stereo_position" x="-4.04105607618969" y="3.9437500000000005" z="-0.41706327498038576" unit="mm" /> - <rotation name="module_L2t_halfmodule_stereo_rotation" x="-3.141592653589793" y="-0.09999999999999999" z="-1.2287453501294631E-17" unit="radian" /> - <position name="module_L2t_halfmodule_stereo_sensor_position" x="30.0" y="0.48375" z="3.414999999999999" unit="mm" /> - <rotation name="module_L2t_halfmodule_stereo_sensor_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <rotation name="module_L2t_halfmodule_stereo_rotation" x="-1.5707963267948963" y="5.551115123125783E-17" z="1.4707963267948965" unit="radian" /> + <position name="module_L2t_halfmodule_stereo_sensor_position" x="3.414999999999999" y="30.0" z="0.48375" unit="mm" /> + <rotation name="module_L2t_halfmodule_stereo_sensor_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L2t_halfmodule_stereo_sensor_active_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="module_L2t_halfmodule_stereo_sensor_active_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L2t_halfmodule_stereo_lamination_position" x="0.5" y="0.66875" z="2.414999999999999" unit="mm" /> + <position name="module_L2t_halfmodule_stereo_lamination_position" x="2.414999999999999" y="0.5" z="0.66875" unit="mm" /> <rotation name="module_L2t_halfmodule_stereo_lamination_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L2t_halfmodule_stereo_cf_position" x="0.0" y="0.8187500000000001" z="-1.0850000000000009" unit="mm" /> + <position name="module_L2t_halfmodule_stereo_cf_position" x="-1.0850000000000009" y="0.0" z="0.8187500000000001" unit="mm" /> <rotation name="module_L2t_halfmodule_stereo_cf_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L2t_halfmodule_stereo_hybrid_position" x="-55.0" y="-0.1499999999999999" z="3.4149999999999956" unit="mm" /> + <position name="module_L2t_halfmodule_stereo_hybrid_position" x="3.414999999999999" y="-55.0" z="-0.1499999999999999" unit="mm" /> <rotation name="module_L2t_halfmodule_stereo_hybrid_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L3b_position" x="-38.475997562817156" y="-0.5721308279543109" z="-23.85" unit="mm" /> - <rotation name="module_L3b_rotation" x="0.0" y="-0.0" z="-0.03000463514883733" unit="radian" /> + <position name="module_L3b_position" x="-38.475997562817184" y="-0.5721308279543109" z="-23.85" unit="mm" /> + <rotation name="module_L3b_rotation" x="0.0" y="-0.0" z="-0.030004635148837944" unit="radian" /> <position name="module_L3b_halfmodule_axial_position" x="-3.8499999999999943" y="-3.94375" z="-4.234999999999999" unit="mm" /> - <rotation name="module_L3b_halfmodule_axial_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L3b_halfmodule_axial_sensor_position" x="30.0" y="0.48375" z="3.414999999999999" unit="mm" /> - <rotation name="module_L3b_halfmodule_axial_sensor_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <rotation name="module_L3b_halfmodule_axial_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <position name="module_L3b_halfmodule_axial_sensor_position" x="3.414999999999999" y="30.0" z="0.48375" unit="mm" /> + <rotation name="module_L3b_halfmodule_axial_sensor_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L3b_halfmodule_axial_sensor_active_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="module_L3b_halfmodule_axial_sensor_active_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L3b_halfmodule_axial_lamination_position" x="0.5" y="0.66875" z="2.414999999999999" unit="mm" /> + <position name="module_L3b_halfmodule_axial_lamination_position" x="2.414999999999999" y="0.5" z="0.66875" unit="mm" /> <rotation name="module_L3b_halfmodule_axial_lamination_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L3b_halfmodule_axial_cf_position" x="0.0" y="0.8187500000000001" z="-1.0850000000000009" unit="mm" /> + <position name="module_L3b_halfmodule_axial_cf_position" x="-1.0850000000000009" y="0.0" z="0.8187500000000001" unit="mm" /> <rotation name="module_L3b_halfmodule_axial_cf_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L3b_halfmodule_axial_hybrid_position" x="-55.0" y="-0.1499999999999999" z="3.4149999999999956" unit="mm" /> + <position name="module_L3b_halfmodule_axial_hybrid_position" x="3.414999999999999" y="-55.0" z="-0.1499999999999999" unit="mm" /> <rotation name="module_L3b_halfmodule_axial_hybrid_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L3b_halfmodule_stereo_position" x="-4.04105607618969" y="3.9437500000000005" z="-0.41706327498038576" unit="mm" /> - <rotation name="module_L3b_halfmodule_stereo_rotation" x="-3.141592653589793" y="-0.09999999999999999" z="-1.2287453501294631E-17" unit="radian" /> - <position name="module_L3b_halfmodule_stereo_sensor_position" x="30.0" y="0.48375" z="3.414999999999999" unit="mm" /> - <rotation name="module_L3b_halfmodule_stereo_sensor_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <rotation name="module_L3b_halfmodule_stereo_rotation" x="-1.5707963267948963" y="5.551115123125783E-17" z="1.4707963267948965" unit="radian" /> + <position name="module_L3b_halfmodule_stereo_sensor_position" x="3.414999999999999" y="30.0" z="0.48375" unit="mm" /> + <rotation name="module_L3b_halfmodule_stereo_sensor_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L3b_halfmodule_stereo_sensor_active_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="module_L3b_halfmodule_stereo_sensor_active_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L3b_halfmodule_stereo_lamination_position" x="0.5" y="0.66875" z="2.414999999999999" unit="mm" /> + <position name="module_L3b_halfmodule_stereo_lamination_position" x="2.414999999999999" y="0.5" z="0.66875" unit="mm" /> <rotation name="module_L3b_halfmodule_stereo_lamination_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L3b_halfmodule_stereo_cf_position" x="0.0" y="0.8187500000000001" z="-1.0850000000000009" unit="mm" /> + <position name="module_L3b_halfmodule_stereo_cf_position" x="-1.0850000000000009" y="0.0" z="0.8187500000000001" unit="mm" /> <rotation name="module_L3b_halfmodule_stereo_cf_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L3b_halfmodule_stereo_hybrid_position" x="-55.0" y="-0.1499999999999999" z="3.4149999999999956" unit="mm" /> + <position name="module_L3b_halfmodule_stereo_hybrid_position" x="3.414999999999999" y="-55.0" z="-0.1499999999999999" unit="mm" /> <rotation name="module_L3b_halfmodule_stereo_hybrid_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L3t_position" x="-38.925999561797454" y="14.42111759261536" z="21.85000000000001" unit="mm" /> - <rotation name="module_L3t_rotation" x="3.141592653589793" y="-0.0" z="0.03000463514883896" unit="radian" /> + <rotation name="module_L3t_rotation" x="3.141592653589793" y="-0.0" z="0.030004635148837944" unit="radian" /> <position name="module_L3t_halfmodule_axial_position" x="-3.8499999999999943" y="-3.94375" z="-4.234999999999999" unit="mm" /> - <rotation name="module_L3t_halfmodule_axial_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L3t_halfmodule_axial_sensor_position" x="30.0" y="0.48375" z="3.414999999999999" unit="mm" /> - <rotation name="module_L3t_halfmodule_axial_sensor_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <rotation name="module_L3t_halfmodule_axial_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <position name="module_L3t_halfmodule_axial_sensor_position" x="3.414999999999999" y="30.0" z="0.48375" unit="mm" /> + <rotation name="module_L3t_halfmodule_axial_sensor_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L3t_halfmodule_axial_sensor_active_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="module_L3t_halfmodule_axial_sensor_active_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L3t_halfmodule_axial_lamination_position" x="0.5" y="0.66875" z="2.414999999999999" unit="mm" /> + <position name="module_L3t_halfmodule_axial_lamination_position" x="2.414999999999999" y="0.5" z="0.66875" unit="mm" /> <rotation name="module_L3t_halfmodule_axial_lamination_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L3t_halfmodule_axial_cf_position" x="0.0" y="0.8187500000000001" z="-1.0850000000000009" unit="mm" /> + <position name="module_L3t_halfmodule_axial_cf_position" x="-1.0850000000000009" y="0.0" z="0.8187500000000001" unit="mm" /> <rotation name="module_L3t_halfmodule_axial_cf_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L3t_halfmodule_axial_hybrid_position" x="-55.0" y="-0.1499999999999999" z="3.4149999999999956" unit="mm" /> + <position name="module_L3t_halfmodule_axial_hybrid_position" x="3.414999999999999" y="-55.0" z="-0.1499999999999999" unit="mm" /> <rotation name="module_L3t_halfmodule_axial_hybrid_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L3t_halfmodule_stereo_position" x="-4.04105607618969" y="3.9437500000000005" z="-0.41706327498038576" unit="mm" /> - <rotation name="module_L3t_halfmodule_stereo_rotation" x="-3.141592653589793" y="-0.09999999999999999" z="-1.2287453501294631E-17" unit="radian" /> - <position name="module_L3t_halfmodule_stereo_sensor_position" x="30.0" y="0.48375" z="3.414999999999999" unit="mm" /> - <rotation name="module_L3t_halfmodule_stereo_sensor_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <rotation name="module_L3t_halfmodule_stereo_rotation" x="-1.5707963267948963" y="5.551115123125783E-17" z="1.4707963267948965" unit="radian" /> + <position name="module_L3t_halfmodule_stereo_sensor_position" x="3.414999999999999" y="30.0" z="0.48375" unit="mm" /> + <rotation name="module_L3t_halfmodule_stereo_sensor_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L3t_halfmodule_stereo_sensor_active_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="module_L3t_halfmodule_stereo_sensor_active_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L3t_halfmodule_stereo_lamination_position" x="0.5" y="0.66875" z="2.414999999999999" unit="mm" /> + <position name="module_L3t_halfmodule_stereo_lamination_position" x="2.414999999999999" y="0.5" z="0.66875" unit="mm" /> <rotation name="module_L3t_halfmodule_stereo_lamination_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L3t_halfmodule_stereo_cf_position" x="0.0" y="0.8187500000000001" z="-1.0850000000000009" unit="mm" /> + <position name="module_L3t_halfmodule_stereo_cf_position" x="-1.0850000000000009" y="0.0" z="0.8187500000000001" unit="mm" /> <rotation name="module_L3t_halfmodule_stereo_cf_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L3t_halfmodule_stereo_hybrid_position" x="-55.0" y="-0.1499999999999999" z="3.4149999999999956" unit="mm" /> + <position name="module_L3t_halfmodule_stereo_hybrid_position" x="3.414999999999999" y="-55.0" z="-0.1499999999999999" unit="mm" /> <rotation name="module_L3t_halfmodule_stereo_hybrid_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L4b_position" x="-32.47597090974699" y="-200.4821097688827" z="-24.35" unit="mm" /> - <rotation name="module_L4b_rotation" x="0.0" y="-0.0" z="-0.03000463514883733" unit="radian" /> + <position name="module_L4b_position" x="-32.47597090974702" y="-200.48210976888276" z="-24.35" unit="mm" /> + <rotation name="module_L4b_rotation" x="0.0" y="-0.0" z="-0.030004635148837944" unit="radian" /> <position name="module_L4b_halfmodule_axial_position" x="-3.8499999999999943" y="-3.94375" z="-6.732999999999997" unit="mm" /> - <rotation name="module_L4b_halfmodule_axial_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L4b_halfmodule_axial_sensor_position" x="30.0" y="0.48375" z="3.414999999999999" unit="mm" /> - <rotation name="module_L4b_halfmodule_axial_sensor_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <rotation name="module_L4b_halfmodule_axial_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <position name="module_L4b_halfmodule_axial_sensor_position" x="3.414999999999999" y="30.0" z="0.48375" unit="mm" /> + <rotation name="module_L4b_halfmodule_axial_sensor_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L4b_halfmodule_axial_sensor_active_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="module_L4b_halfmodule_axial_sensor_active_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L4b_halfmodule_axial_lamination_position" x="0.5" y="0.66875" z="2.414999999999999" unit="mm" /> + <position name="module_L4b_halfmodule_axial_lamination_position" x="2.414999999999999" y="0.5" z="0.66875" unit="mm" /> <rotation name="module_L4b_halfmodule_axial_lamination_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L4b_halfmodule_axial_cf_position" x="0.0" y="0.8187500000000001" z="-1.0850000000000009" unit="mm" /> + <position name="module_L4b_halfmodule_axial_cf_position" x="-1.0850000000000009" y="0.0" z="0.8187500000000001" unit="mm" /> <rotation name="module_L4b_halfmodule_axial_cf_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L4b_halfmodule_axial_hybrid_position" x="-55.0" y="-0.1499999999999999" z="3.4149999999999956" unit="mm" /> + <position name="module_L4b_halfmodule_axial_hybrid_position" x="3.414999999999999" y="-55.0" z="-0.1499999999999999" unit="mm" /> <rotation name="module_L4b_halfmodule_axial_hybrid_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L4b_halfmodule_stereo_position" x="-3.983186674908353" y="3.9437500000000005" z="-1.4066429388715385" unit="mm" /> - <rotation name="module_L4b_halfmodule_stereo_rotation" x="-3.141592653589793" y="-0.04999999999999999" z="-6.128341798596887E-18" unit="radian" /> - <position name="module_L4b_halfmodule_stereo_sensor_position" x="30.0" y="0.48375" z="3.414999999999999" unit="mm" /> - <rotation name="module_L4b_halfmodule_stereo_sensor_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <rotation name="module_L4b_halfmodule_stereo_rotation" x="-1.5707963267948963" y="5.551115123125783E-17" z="1.5207963267948965" unit="radian" /> + <position name="module_L4b_halfmodule_stereo_sensor_position" x="3.414999999999999" y="30.0" z="0.48375" unit="mm" /> + <rotation name="module_L4b_halfmodule_stereo_sensor_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L4b_halfmodule_stereo_sensor_active_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="module_L4b_halfmodule_stereo_sensor_active_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L4b_halfmodule_stereo_lamination_position" x="0.5" y="0.66875" z="2.414999999999999" unit="mm" /> + <position name="module_L4b_halfmodule_stereo_lamination_position" x="2.414999999999999" y="0.5" z="0.66875" unit="mm" /> <rotation name="module_L4b_halfmodule_stereo_lamination_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L4b_halfmodule_stereo_cf_position" x="0.0" y="0.8187500000000001" z="-1.0850000000000009" unit="mm" /> + <position name="module_L4b_halfmodule_stereo_cf_position" x="-1.0850000000000009" y="0.0" z="0.8187500000000001" unit="mm" /> <rotation name="module_L4b_halfmodule_stereo_cf_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L4b_halfmodule_stereo_hybrid_position" x="-55.0" y="-0.1499999999999999" z="3.4149999999999956" unit="mm" /> + <position name="module_L4b_halfmodule_stereo_hybrid_position" x="3.414999999999999" y="-55.0" z="-0.1499999999999999" unit="mm" /> <rotation name="module_L4b_halfmodule_stereo_hybrid_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L4t_position" x="-32.92597290872729" y="-185.48886134831315" z="22.35000000000001" unit="mm" /> - <rotation name="module_L4t_rotation" x="3.141592653589793" y="-0.0" z="0.030004635148837337" unit="radian" /> + <position name="module_L4t_position" x="-32.92597290872729" y="-185.4888613483131" z="22.35000000000001" unit="mm" /> + <rotation name="module_L4t_rotation" x="3.141592653589793" y="-0.0" z="0.030004635148837944" unit="radian" /> <position name="module_L4t_halfmodule_axial_position" x="-3.8499999999999943" y="-3.94375" z="-6.732999999999997" unit="mm" /> - <rotation name="module_L4t_halfmodule_axial_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L4t_halfmodule_axial_sensor_position" x="30.0" y="0.48375" z="3.414999999999999" unit="mm" /> - <rotation name="module_L4t_halfmodule_axial_sensor_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <rotation name="module_L4t_halfmodule_axial_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <position name="module_L4t_halfmodule_axial_sensor_position" x="3.414999999999999" y="30.0" z="0.48375" unit="mm" /> + <rotation name="module_L4t_halfmodule_axial_sensor_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L4t_halfmodule_axial_sensor_active_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="module_L4t_halfmodule_axial_sensor_active_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L4t_halfmodule_axial_lamination_position" x="0.5" y="0.66875" z="2.414999999999999" unit="mm" /> + <position name="module_L4t_halfmodule_axial_lamination_position" x="2.414999999999999" y="0.5" z="0.66875" unit="mm" /> <rotation name="module_L4t_halfmodule_axial_lamination_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L4t_halfmodule_axial_cf_position" x="0.0" y="0.8187500000000001" z="-1.0850000000000009" unit="mm" /> + <position name="module_L4t_halfmodule_axial_cf_position" x="-1.0850000000000009" y="0.0" z="0.8187500000000001" unit="mm" /> <rotation name="module_L4t_halfmodule_axial_cf_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L4t_halfmodule_axial_hybrid_position" x="-55.0" y="-0.1499999999999999" z="3.4149999999999956" unit="mm" /> + <position name="module_L4t_halfmodule_axial_hybrid_position" x="3.414999999999999" y="-55.0" z="-0.1499999999999999" unit="mm" /> <rotation name="module_L4t_halfmodule_axial_hybrid_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L4t_halfmodule_stereo_position" x="-3.983186674908353" y="3.9437500000000005" z="-1.4066429388715385" unit="mm" /> - <rotation name="module_L4t_halfmodule_stereo_rotation" x="-3.141592653589793" y="-0.04999999999999999" z="-6.128341798596887E-18" unit="radian" /> - <position name="module_L4t_halfmodule_stereo_sensor_position" x="30.0" y="0.48375" z="3.414999999999999" unit="mm" /> - <rotation name="module_L4t_halfmodule_stereo_sensor_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <rotation name="module_L4t_halfmodule_stereo_rotation" x="-1.5707963267948963" y="5.551115123125783E-17" z="1.5207963267948965" unit="radian" /> + <position name="module_L4t_halfmodule_stereo_sensor_position" x="3.414999999999999" y="30.0" z="0.48375" unit="mm" /> + <rotation name="module_L4t_halfmodule_stereo_sensor_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L4t_halfmodule_stereo_sensor_active_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="module_L4t_halfmodule_stereo_sensor_active_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L4t_halfmodule_stereo_lamination_position" x="0.5" y="0.66875" z="2.414999999999999" unit="mm" /> + <position name="module_L4t_halfmodule_stereo_lamination_position" x="2.414999999999999" y="0.5" z="0.66875" unit="mm" /> <rotation name="module_L4t_halfmodule_stereo_lamination_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L4t_halfmodule_stereo_cf_position" x="0.0" y="0.8187500000000001" z="-1.0850000000000009" unit="mm" /> + <position name="module_L4t_halfmodule_stereo_cf_position" x="-1.0850000000000009" y="0.0" z="0.8187500000000001" unit="mm" /> <rotation name="module_L4t_halfmodule_stereo_cf_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L4t_halfmodule_stereo_hybrid_position" x="-55.0" y="-0.1499999999999999" z="3.4149999999999956" unit="mm" /> + <position name="module_L4t_halfmodule_stereo_hybrid_position" x="3.414999999999999" y="-55.0" z="-0.1499999999999999" unit="mm" /> <rotation name="module_L4t_halfmodule_stereo_hybrid_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L5b_position" x="-26.475944256676854" y="-400.39208870981116" z="-27.35" unit="mm" /> - <rotation name="module_L5b_rotation" x="0.0" y="-0.0" z="-0.030004635148837742" unit="radian" /> + <position name="module_L5b_position" x="-26.475944256676854" y="-400.3920887098111" z="-27.35" unit="mm" /> + <rotation name="module_L5b_rotation" x="0.0" y="-0.0" z="-0.030004635148837944" unit="radian" /> <position name="module_L5b_halfmodule_axial_position" x="-3.8499999999999943" y="-3.94375" z="-6.732999999999997" unit="mm" /> - <rotation name="module_L5b_halfmodule_axial_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L5b_halfmodule_axial_sensor_position" x="30.0" y="0.48375" z="3.414999999999999" unit="mm" /> - <rotation name="module_L5b_halfmodule_axial_sensor_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <rotation name="module_L5b_halfmodule_axial_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <position name="module_L5b_halfmodule_axial_sensor_position" x="3.414999999999999" y="30.0" z="0.48375" unit="mm" /> + <rotation name="module_L5b_halfmodule_axial_sensor_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L5b_halfmodule_axial_sensor_active_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="module_L5b_halfmodule_axial_sensor_active_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L5b_halfmodule_axial_lamination_position" x="0.5" y="0.66875" z="2.414999999999999" unit="mm" /> + <position name="module_L5b_halfmodule_axial_lamination_position" x="2.414999999999999" y="0.5" z="0.66875" unit="mm" /> <rotation name="module_L5b_halfmodule_axial_lamination_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L5b_halfmodule_axial_cf_position" x="0.0" y="0.8187500000000001" z="-1.0850000000000009" unit="mm" /> + <position name="module_L5b_halfmodule_axial_cf_position" x="-1.0850000000000009" y="0.0" z="0.8187500000000001" unit="mm" /> <rotation name="module_L5b_halfmodule_axial_cf_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L5b_halfmodule_axial_hybrid_position" x="-55.0" y="-0.1499999999999999" z="3.4149999999999956" unit="mm" /> + <position name="module_L5b_halfmodule_axial_hybrid_position" x="3.414999999999999" y="-55.0" z="-0.1499999999999999" unit="mm" /> <rotation name="module_L5b_halfmodule_axial_hybrid_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L5b_halfmodule_stereo_position" x="-3.983186674908353" y="3.9437500000000005" z="-1.4066429388715385" unit="mm" /> - <rotation name="module_L5b_halfmodule_stereo_rotation" x="-3.141592653589793" y="-0.04999999999999999" z="-6.128341798596887E-18" unit="radian" /> - <position name="module_L5b_halfmodule_stereo_sensor_position" x="30.0" y="0.48375" z="3.414999999999999" unit="mm" /> - <rotation name="module_L5b_halfmodule_stereo_sensor_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <rotation name="module_L5b_halfmodule_stereo_rotation" x="-1.5707963267948963" y="5.551115123125783E-17" z="1.5207963267948965" unit="radian" /> + <position name="module_L5b_halfmodule_stereo_sensor_position" x="3.414999999999999" y="30.0" z="0.48375" unit="mm" /> + <rotation name="module_L5b_halfmodule_stereo_sensor_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L5b_halfmodule_stereo_sensor_active_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="module_L5b_halfmodule_stereo_sensor_active_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L5b_halfmodule_stereo_lamination_position" x="0.5" y="0.66875" z="2.414999999999999" unit="mm" /> + <position name="module_L5b_halfmodule_stereo_lamination_position" x="2.414999999999999" y="0.5" z="0.66875" unit="mm" /> <rotation name="module_L5b_halfmodule_stereo_lamination_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L5b_halfmodule_stereo_cf_position" x="0.0" y="0.8187500000000001" z="-1.0850000000000009" unit="mm" /> + <position name="module_L5b_halfmodule_stereo_cf_position" x="-1.0850000000000009" y="0.0" z="0.8187500000000001" unit="mm" /> <rotation name="module_L5b_halfmodule_stereo_cf_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L5b_halfmodule_stereo_hybrid_position" x="-55.0" y="-0.1499999999999999" z="3.4149999999999956" unit="mm" /> + <position name="module_L5b_halfmodule_stereo_hybrid_position" x="3.414999999999999" y="-55.0" z="-0.1499999999999999" unit="mm" /> <rotation name="module_L5b_halfmodule_stereo_hybrid_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L5t_position" x="-26.925946255657124" y="-385.39884028924155" z="25.35000000000001" unit="mm" /> - <rotation name="module_L5t_rotation" x="3.141592653589793" y="-0.0" z="0.030004635148837742" unit="radian" /> + <rotation name="module_L5t_rotation" x="3.141592653589793" y="-0.0" z="0.030004635148837944" unit="radian" /> <position name="module_L5t_halfmodule_axial_position" x="-3.8499999999999943" y="-3.94375" z="-6.732999999999997" unit="mm" /> - <rotation name="module_L5t_halfmodule_axial_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L5t_halfmodule_axial_sensor_position" x="30.0" y="0.48375" z="3.414999999999999" unit="mm" /> - <rotation name="module_L5t_halfmodule_axial_sensor_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <rotation name="module_L5t_halfmodule_axial_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <position name="module_L5t_halfmodule_axial_sensor_position" x="3.414999999999999" y="30.0" z="0.48375" unit="mm" /> + <rotation name="module_L5t_halfmodule_axial_sensor_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L5t_halfmodule_axial_sensor_active_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="module_L5t_halfmodule_axial_sensor_active_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L5t_halfmodule_axial_lamination_position" x="0.5" y="0.66875" z="2.414999999999999" unit="mm" /> + <position name="module_L5t_halfmodule_axial_lamination_position" x="2.414999999999999" y="0.5" z="0.66875" unit="mm" /> <rotation name="module_L5t_halfmodule_axial_lamination_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L5t_halfmodule_axial_cf_position" x="0.0" y="0.8187500000000001" z="-1.0850000000000009" unit="mm" /> + <position name="module_L5t_halfmodule_axial_cf_position" x="-1.0850000000000009" y="0.0" z="0.8187500000000001" unit="mm" /> <rotation name="module_L5t_halfmodule_axial_cf_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L5t_halfmodule_axial_hybrid_position" x="-55.0" y="-0.1499999999999999" z="3.4149999999999956" unit="mm" /> + <position name="module_L5t_halfmodule_axial_hybrid_position" x="3.414999999999999" y="-55.0" z="-0.1499999999999999" unit="mm" /> <rotation name="module_L5t_halfmodule_axial_hybrid_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L5t_halfmodule_stereo_position" x="-3.983186674908353" y="3.9437500000000005" z="-1.4066429388715385" unit="mm" /> - <rotation name="module_L5t_halfmodule_stereo_rotation" x="-3.141592653589793" y="-0.04999999999999999" z="-6.128341798596887E-18" unit="radian" /> - <position name="module_L5t_halfmodule_stereo_sensor_position" x="30.0" y="0.48375" z="3.414999999999999" unit="mm" /> - <rotation name="module_L5t_halfmodule_stereo_sensor_rotation" x="1.5707963267948966" y="-0.0" z="1.5707963267948966" unit="radian" /> + <rotation name="module_L5t_halfmodule_stereo_rotation" x="-1.5707963267948963" y="5.551115123125783E-17" z="1.5207963267948965" unit="radian" /> + <position name="module_L5t_halfmodule_stereo_sensor_position" x="3.414999999999999" y="30.0" z="0.48375" unit="mm" /> + <rotation name="module_L5t_halfmodule_stereo_sensor_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="module_L5t_halfmodule_stereo_sensor_active_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="module_L5t_halfmodule_stereo_sensor_active_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L5t_halfmodule_stereo_lamination_position" x="0.5" y="0.66875" z="2.414999999999999" unit="mm" /> + <position name="module_L5t_halfmodule_stereo_lamination_position" x="2.414999999999999" y="0.5" z="0.66875" unit="mm" /> <rotation name="module_L5t_halfmodule_stereo_lamination_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L5t_halfmodule_stereo_cf_position" x="0.0" y="0.8187500000000001" z="-1.0850000000000009" unit="mm" /> + <position name="module_L5t_halfmodule_stereo_cf_position" x="-1.0850000000000009" y="0.0" z="0.8187500000000001" unit="mm" /> <rotation name="module_L5t_halfmodule_stereo_cf_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> - <position name="module_L5t_halfmodule_stereo_hybrid_position" x="-55.0" y="-0.1499999999999999" z="3.4149999999999956" unit="mm" /> + <position name="module_L5t_halfmodule_stereo_hybrid_position" x="3.414999999999999" y="-55.0" z="-0.1499999999999999" unit="mm" /> <rotation name="module_L5t_halfmodule_stereo_hybrid_rotation" x="0.0" y="-0.0" z="0.0" unit="radian" /> <position name="TestRunModuleFieldDefVolume_component0_position" x="0.0" y="0.0" z="0.0" unit="mm" /> <rotation name="TestRunModuleFieldDefVolume_component0_rotation" x="0.0" y="0.0" z="0.0" unit="radian" /> @@ -1384,152 +1382,146 @@ <solids> <box name="world_box" x="world_x" y="world_y" z="world_z" /> <tube name="tracking_cylinder" deltaphi="6.283185307179586" rmin="0.0" rmax="tracking_region_radius" z="2*tracking_region_zmax" /> - <box name="beamPlaneVolBox" x="385.0" y="2432.0" z="1.0E-8" /> <box name="baseBox" x="385.0" y="1216.0" z="175.79999999999998" /> <box name="baseplateBox" x="385.0" y="1216.0" z="6.35" /> <box name="support_plate_bottomBox" x="120.0" y="736.1" z="12.7" /> <box name="support_plate_topBox" x="120.0" y="736.1" z="12.7" /> <box name="module_L1bBox" x="215.2" y="13.5" z="73.3" /> - <box name="module_L1b_halfmodule_axialBox" x="200.0" y="1.8875" z="47.17" /> + <box name="module_L1b_halfmodule_axialBox" x="47.17" y="200.0" z="1.8875" /> <box name="module_L1b_halfmodule_axial_sensorBox" x="40.34" y="100.0" z="0.32" /> <box name="module_L1b_halfmodule_axial_sensor_activeBox" x="38.3399" y="98.33" z="0.32" /> - <box name="module_L1b_halfmodule_axial_laminationBox" x="184.0" y="0.05" z="40.0" /> - <box name="module_L1b_halfmodule_axial_cfBox" x="200.0" y="0.25" z="45.0" /> - <box name="module_L1b_halfmodule_axial_hybridBox" x="70.0" y="1.5875" z="40.34" /> - <box name="module_L1b_halfmodule_stereoBox" x="200.0" y="1.8875" z="47.17" /> + <box name="module_L1b_halfmodule_axial_laminationBox" x="40.0" y="184.0" z="0.05" /> + <box name="module_L1b_halfmodule_axial_cfBox" x="45.0" y="200.0" z="0.25" /> + <box name="module_L1b_halfmodule_axial_hybridBox" x="40.34" y="70.0" z="1.5875" /> + <box name="module_L1b_halfmodule_stereoBox" x="47.17" y="200.0" z="1.8875" /> <box name="module_L1b_halfmodule_stereo_sensorBox" x="40.34" y="100.0" z="0.32" /> <box name="module_L1b_halfmodule_stereo_sensor_activeBox" x="38.3399" y="98.33" z="0.32" /> - <box name="module_L1b_halfmodule_stereo_laminationBox" x="184.0" y="0.05" z="40.0" /> - <box name="module_L1b_halfmodule_stereo_cfBox" x="200.0" y="0.25" z="45.0" /> - <box name="module_L1b_halfmodule_stereo_hybridBox" x="70.0" y="1.5875" z="40.34" /> + <box name="module_L1b_halfmodule_stereo_laminationBox" x="40.0" y="184.0" z="0.05" /> + <box name="module_L1b_halfmodule_stereo_cfBox" x="45.0" y="200.0" z="0.25" /> + <box name="module_L1b_halfmodule_stereo_hybridBox" x="40.34" y="70.0" z="1.5875" /> <box name="module_L1tBox" x="215.2" y="13.5" z="73.3" /> - <box name="module_L1t_halfmodule_axialBox" x="200.0" y="1.8875" z="47.17" /> + <box name="module_L1t_halfmodule_axialBox" x="47.17" y="200.0" z="1.8875" /> <box name="module_L1t_halfmodule_axial_sensorBox" x="40.34" y="100.0" z="0.32" /> <box name="module_L1t_halfmodule_axial_sensor_activeBox" x="38.3399" y="98.33" z="0.32" /> - <box name="module_L1t_halfmodule_axial_laminationBox" x="184.0" y="0.05" z="40.0" /> - <box name="module_L1t_halfmodule_axial_cfBox" x="200.0" y="0.25" z="45.0" /> - <box name="module_L1t_halfmodule_axial_hybridBox" x="70.0" y="1.5875" z="40.34" /> - <box name="module_L1t_halfmodule_stereoBox" x="200.0" y="1.8875" z="47.17" /> + <box name="module_L1t_halfmodule_axial_laminationBox" x="40.0" y="184.0" z="0.05" /> + <box name="module_L1t_halfmodule_axial_cfBox" x="45.0" y="200.0" z="0.25" /> + <box name="module_L1t_halfmodule_axial_hybridBox" x="40.34" y="70.0" z="1.5875" /> + <box name="module_L1t_halfmodule_stereoBox" x="47.17" y="200.0" z="1.8875" /> <box name="module_L1t_halfmodule_stereo_sensorBox" x="40.34" y="100.0" z="0.32" /> <box name="module_L1t_halfmodule_stereo_sensor_activeBox" x="38.3399" y="98.33" z="0.32" /> - <box name="module_L1t_halfmodule_stereo_laminationBox" x="184.0" y="0.05" z="40.0" /> - <box name="module_L1t_halfmodule_stereo_cfBox" x="200.0" y="0.25" z="45.0" /> - <box name="module_L1t_halfmodule_stereo_hybridBox" x="70.0" y="1.5875" z="40.34" /> + <box name="module_L1t_halfmodule_stereo_laminationBox" x="40.0" y="184.0" z="0.05" /> + <box name="module_L1t_halfmodule_stereo_cfBox" x="45.0" y="200.0" z="0.25" /> + <box name="module_L1t_halfmodule_stereo_hybridBox" x="40.34" y="70.0" z="1.5875" /> <box name="module_L2bBox" x="215.2" y="13.5" z="73.3" /> - <box name="module_L2b_halfmodule_axialBox" x="200.0" y="1.8875" z="47.17" /> + <box name="module_L2b_halfmodule_axialBox" x="47.17" y="200.0" z="1.8875" /> <box name="module_L2b_halfmodule_axial_sensorBox" x="40.34" y="100.0" z="0.32" /> <box name="module_L2b_halfmodule_axial_sensor_activeBox" x="38.3399" y="98.33" z="0.32" /> - <box name="module_L2b_halfmodule_axial_laminationBox" x="184.0" y="0.05" z="40.0" /> - <box name="module_L2b_halfmodule_axial_cfBox" x="200.0" y="0.25" z="45.0" /> - <box name="module_L2b_halfmodule_axial_hybridBox" x="70.0" y="1.5875" z="40.34" /> - <box name="module_L2b_halfmodule_stereoBox" x="200.0" y="1.8875" z="47.17" /> + <box name="module_L2b_halfmodule_axial_laminationBox" x="40.0" y="184.0" z="0.05" /> + <box name="module_L2b_halfmodule_axial_cfBox" x="45.0" y="200.0" z="0.25" /> + <box name="module_L2b_halfmodule_axial_hybridBox" x="40.34" y="70.0" z="1.5875" /> + <box name="module_L2b_halfmodule_stereoBox" x="47.17" y="200.0" z="1.8875" /> <box name="module_L2b_halfmodule_stereo_sensorBox" x="40.34" y="100.0" z="0.32" /> <box name="module_L2b_halfmodule_stereo_sensor_activeBox" x="38.3399" y="98.33" z="0.32" /> - <box name="module_L2b_halfmodule_stereo_laminationBox" x="184.0" y="0.05" z="40.0" /> - <box name="module_L2b_halfmodule_stereo_cfBox" x="200.0" y="0.25" z="45.0" /> - <box name="module_L2b_halfmodule_stereo_hybridBox" x="70.0" y="1.5875" z="40.34" /> + <box name="module_L2b_halfmodule_stereo_laminationBox" x="40.0" y="184.0" z="0.05" /> + <box name="module_L2b_halfmodule_stereo_cfBox" x="45.0" y="200.0" z="0.25" /> + <box name="module_L2b_halfmodule_stereo_hybridBox" x="40.34" y="70.0" z="1.5875" /> <box name="module_L2tBox" x="215.2" y="13.5" z="73.3" /> - <box name="module_L2t_halfmodule_axialBox" x="200.0" y="1.8875" z="47.17" /> + <box name="module_L2t_halfmodule_axialBox" x="47.17" y="200.0" z="1.8875" /> <box name="module_L2t_halfmodule_axial_sensorBox" x="40.34" y="100.0" z="0.32" /> <box name="module_L2t_halfmodule_axial_sensor_activeBox" x="38.3399" y="98.33" z="0.32" /> - <box name="module_L2t_halfmodule_axial_laminationBox" x="184.0" y="0.05" z="40.0" /> - <box name="module_L2t_halfmodule_axial_cfBox" x="200.0" y="0.25" z="45.0" /> - <box name="module_L2t_halfmodule_axial_hybridBox" x="70.0" y="1.5875" z="40.34" /> - <box name="module_L2t_halfmodule_stereoBox" x="200.0" y="1.8875" z="47.17" /> + <box name="module_L2t_halfmodule_axial_laminationBox" x="40.0" y="184.0" z="0.05" /> + <box name="module_L2t_halfmodule_axial_cfBox" x="45.0" y="200.0" z="0.25" /> + <box name="module_L2t_halfmodule_axial_hybridBox" x="40.34" y="70.0" z="1.5875" /> + <box name="module_L2t_halfmodule_stereoBox" x="47.17" y="200.0" z="1.8875" /> <box name="module_L2t_halfmodule_stereo_sensorBox" x="40.34" y="100.0" z="0.32" /> <box name="module_L2t_halfmodule_stereo_sensor_activeBox" x="38.3399" y="98.33" z="0.32" /> - <box name="module_L2t_halfmodule_stereo_laminationBox" x="184.0" y="0.05" z="40.0" /> - <box name="module_L2t_halfmodule_stereo_cfBox" x="200.0" y="0.25" z="45.0" /> - <box name="module_L2t_halfmodule_stereo_hybridBox" x="70.0" y="1.5875" z="40.34" /> + <box name="module_L2t_halfmodule_stereo_laminationBox" x="40.0" y="184.0" z="0.05" /> + <box name="module_L2t_halfmodule_stereo_cfBox" x="45.0" y="200.0" z="0.25" /> + <box name="module_L2t_halfmodule_stereo_hybridBox" x="40.34" y="70.0" z="1.5875" /> <box name="module_L3bBox" x="215.2" y="13.5" z="73.3" /> - <box name="module_L3b_halfmodule_axialBox" x="200.0" y="1.8875" z="47.17" /> + <box name="module_L3b_halfmodule_axialBox" x="47.17" y="200.0" z="1.8875" /> <box name="module_L3b_halfmodule_axial_sensorBox" x="40.34" y="100.0" z="0.32" /> <box name="module_L3b_halfmodule_axial_sensor_activeBox" x="38.3399" y="98.33" z="0.32" /> - <box name="module_L3b_halfmodule_axial_laminationBox" x="184.0" y="0.05" z="40.0" /> - <box name="module_L3b_halfmodule_axial_cfBox" x="200.0" y="0.25" z="45.0" /> - <box name="module_L3b_halfmodule_axial_hybridBox" x="70.0" y="1.5875" z="40.34" /> - <box name="module_L3b_halfmodule_stereoBox" x="200.0" y="1.8875" z="47.17" /> + <box name="module_L3b_halfmodule_axial_laminationBox" x="40.0" y="184.0" z="0.05" /> + <box name="module_L3b_halfmodule_axial_cfBox" x="45.0" y="200.0" z="0.25" /> + <box name="module_L3b_halfmodule_axial_hybridBox" x="40.34" y="70.0" z="1.5875" /> + <box name="module_L3b_halfmodule_stereoBox" x="47.17" y="200.0" z="1.8875" /> <box name="module_L3b_halfmodule_stereo_sensorBox" x="40.34" y="100.0" z="0.32" /> <box name="module_L3b_halfmodule_stereo_sensor_activeBox" x="38.3399" y="98.33" z="0.32" /> - <box name="module_L3b_halfmodule_stereo_laminationBox" x="184.0" y="0.05" z="40.0" /> - <box name="module_L3b_halfmodule_stereo_cfBox" x="200.0" y="0.25" z="45.0" /> - <box name="module_L3b_halfmodule_stereo_hybridBox" x="70.0" y="1.5875" z="40.34" /> + <box name="module_L3b_halfmodule_stereo_laminationBox" x="40.0" y="184.0" z="0.05" /> + <box name="module_L3b_halfmodule_stereo_cfBox" x="45.0" y="200.0" z="0.25" /> + <box name="module_L3b_halfmodule_stereo_hybridBox" x="40.34" y="70.0" z="1.5875" /> <box name="module_L3tBox" x="215.2" y="13.5" z="73.3" /> - <box name="module_L3t_halfmodule_axialBox" x="200.0" y="1.8875" z="47.17" /> + <box name="module_L3t_halfmodule_axialBox" x="47.17" y="200.0" z="1.8875" /> <box name="module_L3t_halfmodule_axial_sensorBox" x="40.34" y="100.0" z="0.32" /> <box name="module_L3t_halfmodule_axial_sensor_activeBox" x="38.3399" y="98.33" z="0.32" /> - <box name="module_L3t_halfmodule_axial_laminationBox" x="184.0" y="0.05" z="40.0" /> - <box name="module_L3t_halfmodule_axial_cfBox" x="200.0" y="0.25" z="45.0" /> - <box name="module_L3t_halfmodule_axial_hybridBox" x="70.0" y="1.5875" z="40.34" /> - <box name="module_L3t_halfmodule_stereoBox" x="200.0" y="1.8875" z="47.17" /> + <box name="module_L3t_halfmodule_axial_laminationBox" x="40.0" y="184.0" z="0.05" /> + <box name="module_L3t_halfmodule_axial_cfBox" x="45.0" y="200.0" z="0.25" /> + <box name="module_L3t_halfmodule_axial_hybridBox" x="40.34" y="70.0" z="1.5875" /> + <box name="module_L3t_halfmodule_stereoBox" x="47.17" y="200.0" z="1.8875" /> <box name="module_L3t_halfmodule_stereo_sensorBox" x="40.34" y="100.0" z="0.32" /> <box name="module_L3t_halfmodule_stereo_sensor_activeBox" x="38.3399" y="98.33" z="0.32" /> - <box name="module_L3t_halfmodule_stereo_laminationBox" x="184.0" y="0.05" z="40.0" /> - <box name="module_L3t_halfmodule_stereo_cfBox" x="200.0" y="0.25" z="45.0" /> - <box name="module_L3t_halfmodule_stereo_hybridBox" x="70.0" y="1.5875" z="40.34" /> + <box name="module_L3t_halfmodule_stereo_laminationBox" x="40.0" y="184.0" z="0.05" /> + <box name="module_L3t_halfmodule_stereo_cfBox" x="45.0" y="200.0" z="0.25" /> + <box name="module_L3t_halfmodule_stereo_hybridBox" x="40.34" y="70.0" z="1.5875" /> <box name="module_L4bBox" x="215.2" y="13.5" z="68.3" /> - <box name="module_L4b_halfmodule_axialBox" x="200.0" y="1.8875" z="47.17" /> + <box name="module_L4b_halfmodule_axialBox" x="47.17" y="200.0" z="1.8875" /> <box name="module_L4b_halfmodule_axial_sensorBox" x="40.34" y="100.0" z="0.32" /> <box name="module_L4b_halfmodule_axial_sensor_activeBox" x="38.3399" y="98.33" z="0.32" /> - <box name="module_L4b_halfmodule_axial_laminationBox" x="184.0" y="0.05" z="40.0" /> - <box name="module_L4b_halfmodule_axial_cfBox" x="200.0" y="0.25" z="45.0" /> - <box name="module_L4b_halfmodule_axial_hybridBox" x="70.0" y="1.5875" z="40.34" /> - <box name="module_L4b_halfmodule_stereoBox" x="200.0" y="1.8875" z="47.17" /> + <box name="module_L4b_halfmodule_axial_laminationBox" x="40.0" y="184.0" z="0.05" /> + <box name="module_L4b_halfmodule_axial_cfBox" x="45.0" y="200.0" z="0.25" /> + <box name="module_L4b_halfmodule_axial_hybridBox" x="40.34" y="70.0" z="1.5875" /> + <box name="module_L4b_halfmodule_stereoBox" x="47.17" y="200.0" z="1.8875" /> <box name="module_L4b_halfmodule_stereo_sensorBox" x="40.34" y="100.0" z="0.32" /> <box name="module_L4b_halfmodule_stereo_sensor_activeBox" x="38.3399" y="98.33" z="0.32" /> - <box name="module_L4b_halfmodule_stereo_laminationBox" x="184.0" y="0.05" z="40.0" /> - <box name="module_L4b_halfmodule_stereo_cfBox" x="200.0" y="0.25" z="45.0" /> - <box name="module_L4b_halfmodule_stereo_hybridBox" x="70.0" y="1.5875" z="40.34" /> + <box name="module_L4b_halfmodule_stereo_laminationBox" x="40.0" y="184.0" z="0.05" /> + <box name="module_L4b_halfmodule_stereo_cfBox" x="45.0" y="200.0" z="0.25" /> + <box name="module_L4b_halfmodule_stereo_hybridBox" x="40.34" y="70.0" z="1.5875" /> <box name="module_L4tBox" x="215.2" y="13.5" z="68.3" /> - <box name="module_L4t_halfmodule_axialBox" x="200.0" y="1.8875" z="47.17" /> + <box name="module_L4t_halfmodule_axialBox" x="47.17" y="200.0" z="1.8875" /> <box name="module_L4t_halfmodule_axial_sensorBox" x="40.34" y="100.0" z="0.32" /> <box name="module_L4t_halfmodule_axial_sensor_activeBox" x="38.3399" y="98.33" z="0.32" /> - <box name="module_L4t_halfmodule_axial_laminationBox" x="184.0" y="0.05" z="40.0" /> - <box name="module_L4t_halfmodule_axial_cfBox" x="200.0" y="0.25" z="45.0" /> - <box name="module_L4t_halfmodule_axial_hybridBox" x="70.0" y="1.5875" z="40.34" /> - <box name="module_L4t_halfmodule_stereoBox" x="200.0" y="1.8875" z="47.17" /> + <box name="module_L4t_halfmodule_axial_laminationBox" x="40.0" y="184.0" z="0.05" /> + <box name="module_L4t_halfmodule_axial_cfBox" x="45.0" y="200.0" z="0.25" /> + <box name="module_L4t_halfmodule_axial_hybridBox" x="40.34" y="70.0" z="1.5875" /> + <box name="module_L4t_halfmodule_stereoBox" x="47.17" y="200.0" z="1.8875" /> <box name="module_L4t_halfmodule_stereo_sensorBox" x="40.34" y="100.0" z="0.32" /> <box name="module_L4t_halfmodule_stereo_sensor_activeBox" x="38.3399" y="98.33" z="0.32" /> - <box name="module_L4t_halfmodule_stereo_laminationBox" x="184.0" y="0.05" z="40.0" /> - <box name="module_L4t_halfmodule_stereo_cfBox" x="200.0" y="0.25" z="45.0" /> - <box name="module_L4t_halfmodule_stereo_hybridBox" x="70.0" y="1.5875" z="40.34" /> + <box name="module_L4t_halfmodule_stereo_laminationBox" x="40.0" y="184.0" z="0.05" /> + <box name="module_L4t_halfmodule_stereo_cfBox" x="45.0" y="200.0" z="0.25" /> + <box name="module_L4t_halfmodule_stereo_hybridBox" x="40.34" y="70.0" z="1.5875" /> <box name="module_L5bBox" x="215.2" y="13.5" z="68.3" /> - <box name="module_L5b_halfmodule_axialBox" x="200.0" y="1.8875" z="47.17" /> + <box name="module_L5b_halfmodule_axialBox" x="47.17" y="200.0" z="1.8875" /> <box name="module_L5b_halfmodule_axial_sensorBox" x="40.34" y="100.0" z="0.32" /> <box name="module_L5b_halfmodule_axial_sensor_activeBox" x="38.3399" y="98.33" z="0.32" /> - <box name="module_L5b_halfmodule_axial_laminationBox" x="184.0" y="0.05" z="40.0" /> - <box name="module_L5b_halfmodule_axial_cfBox" x="200.0" y="0.25" z="45.0" /> - <box name="module_L5b_halfmodule_axial_hybridBox" x="70.0" y="1.5875" z="40.34" /> - <box name="module_L5b_halfmodule_stereoBox" x="200.0" y="1.8875" z="47.17" /> + <box name="module_L5b_halfmodule_axial_laminationBox" x="40.0" y="184.0" z="0.05" /> + <box name="module_L5b_halfmodule_axial_cfBox" x="45.0" y="200.0" z="0.25" /> + <box name="module_L5b_halfmodule_axial_hybridBox" x="40.34" y="70.0" z="1.5875" /> + <box name="module_L5b_halfmodule_stereoBox" x="47.17" y="200.0" z="1.8875" /> <box name="module_L5b_halfmodule_stereo_sensorBox" x="40.34" y="100.0" z="0.32" /> <box name="module_L5b_halfmodule_stereo_sensor_activeBox" x="38.3399" y="98.33" z="0.32" /> - <box name="module_L5b_halfmodule_stereo_laminationBox" x="184.0" y="0.05" z="40.0" /> - <box name="module_L5b_halfmodule_stereo_cfBox" x="200.0" y="0.25" z="45.0" /> - <box name="module_L5b_halfmodule_stereo_hybridBox" x="70.0" y="1.5875" z="40.34" /> + <box name="module_L5b_halfmodule_stereo_laminationBox" x="40.0" y="184.0" z="0.05" /> + <box name="module_L5b_halfmodule_stereo_cfBox" x="45.0" y="200.0" z="0.25" /> + <box name="module_L5b_halfmodule_stereo_hybridBox" x="40.34" y="70.0" z="1.5875" /> <box name="module_L5tBox" x="215.2" y="13.5" z="68.3" /> - <box name="module_L5t_halfmodule_axialBox" x="200.0" y="1.8875" z="47.17" /> + <box name="module_L5t_halfmodule_axialBox" x="47.17" y="200.0" z="1.8875" /> <box name="module_L5t_halfmodule_axial_sensorBox" x="40.34" y="100.0" z="0.32" /> <box name="module_L5t_halfmodule_axial_sensor_activeBox" x="38.3399" y="98.33" z="0.32" /> - <box name="module_L5t_halfmodule_axial_laminationBox" x="184.0" y="0.05" z="40.0" /> - <box name="module_L5t_halfmodule_axial_cfBox" x="200.0" y="0.25" z="45.0" /> - <box name="module_L5t_halfmodule_axial_hybridBox" x="70.0" y="1.5875" z="40.34" /> - <box name="module_L5t_halfmodule_stereoBox" x="200.0" y="1.8875" z="47.17" /> + <box name="module_L5t_halfmodule_axial_laminationBox" x="40.0" y="184.0" z="0.05" /> + <box name="module_L5t_halfmodule_axial_cfBox" x="45.0" y="200.0" z="0.25" /> + <box name="module_L5t_halfmodule_axial_hybridBox" x="40.34" y="70.0" z="1.5875" /> + <box name="module_L5t_halfmodule_stereoBox" x="47.17" y="200.0" z="1.8875" /> <box name="module_L5t_halfmodule_stereo_sensorBox" x="40.34" y="100.0" z="0.32" /> <box name="module_L5t_halfmodule_stereo_sensor_activeBox" x="38.3399" y="98.33" z="0.32" /> - <box name="module_L5t_halfmodule_stereo_laminationBox" x="184.0" y="0.05" z="40.0" /> - <box name="module_L5t_halfmodule_stereo_cfBox" x="200.0" y="0.25" z="45.0" /> - <box name="module_L5t_halfmodule_stereo_hybridBox" x="70.0" y="1.5875" z="40.34" /> + <box name="module_L5t_halfmodule_stereo_laminationBox" x="40.0" y="184.0" z="0.05" /> + <box name="module_L5t_halfmodule_stereo_cfBox" x="45.0" y="200.0" z="0.25" /> + <box name="module_L5t_halfmodule_stereo_hybridBox" x="40.34" y="70.0" z="1.5875" /> <box name="TestRunModuleFieldDefBox" x="712.2" y="1665.208" z="1.0E-8" /> <box name="TestRunModuleFieldDefVolume_component0Box" x="712.2" y="1665.208" z="1.0E-8" /> <box name="TestRunModuleFieldDefVolume_component0Sensor0Box" x="711.2" y="1664.208" z="1.0E-8" /> <trd name="crystal_trap" x1="13.3" x2="16.0" y1="13.3" y2="16.0" z="160.0" /> </solids> <structure> - <volume name="beamPlaneVol_volume"> - <materialref ref="Vacuum" /> - <solidref ref="beamPlaneVolBox" /> - <visref ref="BeamPlaneVis" /> - </volume> <volume name="baseplate_volume"> <materialref ref="Aluminum" /> <solidref ref="baseplateBox" /> @@ -3088,11 +3080,6 @@ <volume name="tracking_volume"> <materialref ref="TrackingMaterial" /> <solidref ref="tracking_cylinder" /> - <physvol> - <volumeref ref="beamPlaneVol_volume" /> - <positionref ref="beamPlaneVol_position" /> - <rotationref ref="beamPlaneVol_rotation" /> - </physvol> <physvol> <volumeref ref="base_volume" /> <positionref ref="base_position" /> Modified: java/branches/hps_java_trunk_HPSJAVA-255/detector-data/detectors/HPSTestRunTracker2014-v0/compact.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/detector-data/detectors/HPSTestRunTracker2014-v0/compact.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/detector-data/detectors/HPSTestRunTracker2014-v0/compact.xml Mon Nov 3 01:04:28 2014 @@ -79,36 +79,159 @@ <detectors> <detector id="1" name="Tracker" type="HPSTestRunTracker2014" readout="TrackerHits"> - - <!-- Definition of half module logical volume. --> - <half_modules> - <half_module name="SvtHalfModuleLayers1-3"> - <component x="50.0" y="100.0" z="0.0" material="Silicon" sensitive="true" /> - </half_module> - </half_modules> - - <!-- Alignment of entire tracker box. --> - <alignment x="0.0" y="0.0" z="0.0" /> - <support_plate name="SupportPlateL1-3bot"> - <position name="ball" x="0.0" y="0.0" z="0.0"/> - <position name="vee" x="0.0" y="0.0" z="0.0"/> - <position name="flat" x="0.0" y="0.0" z="0.0"/> - <alignment x="5.0" y="5.0" z="5.0" rx="0.1" ry="0.1" rz="0.1"/> - <modules> - <module layer="1" ref="SvtModule"> - <position name="ball" x="0.0" y="0.0" z="0.0"/> - <position name="vee" x="0.0" y="0.0" z="0.0"/> - <position name="flat" x="0.0" y="0.0" z="0.0"/> - <alignment x="4.0" y="4.0" z="4.0" rx="0.1" ry="0.1" rz="0.1"/> - <half_module type="axial" ref="SvtHalfModuleLayers1-3"> - <position name="ball" x="0.0" y="0.0" z="0.0"/> - <position name="vee" x="0.0" y="0.0" z="0.0"/> - <position name="flat" x="0.0" y="0.0" z="0.0"/> - <alignment x="3.0" y="3.0" z="3.0" rx="0.1" ry="0.1" rz="0.1" /> - </half_module> - </module> - </modules> - </support_plate> + <millepede_constants> + <!-- top translations --> + <millepede_constant name="11101" value="0.0"/> + <millepede_constant name="11102" value="0.0"/> + <millepede_constant name="11103" value="0.0"/> + <millepede_constant name="11104" value="0.0"/> + <millepede_constant name="11105" value="0.0"/> + <millepede_constant name="11106" value="0.0"/> + <millepede_constant name="11107" value="0.0"/> + <millepede_constant name="11108" value="0.0"/> + <millepede_constant name="11109" value="0.0"/> + <millepede_constant name="11110" value="0.0"/> + + <millepede_constant name="11201" value="0.0"/> + <millepede_constant name="11202" value="0.0"/> + <millepede_constant name="11203" value="0.0"/> + <millepede_constant name="11204" value="0.0"/> + <millepede_constant name="11205" value="0.0"/> + <millepede_constant name="11206" value="0.0"/> + <millepede_constant name="11207" value="0.0"/> + <millepede_constant name="11208" value="0.0"/> + <millepede_constant name="11209" value="0.0"/> + <millepede_constant name="11210" value="0.0"/> + + <millepede_constant name="11301" value="0.0"/> + <millepede_constant name="11302" value="0.0"/> + <millepede_constant name="11303" value="0.0"/> + <millepede_constant name="11304" value="0.0"/> + <millepede_constant name="11305" value="0.0"/> + <millepede_constant name="11306" value="0.0"/> + <millepede_constant name="11307" value="0.0"/> + <millepede_constant name="11308" value="0.0"/> + <millepede_constant name="11309" value="0.0"/> + <millepede_constant name="11310" value="0.0"/> + + <!-- top rotations --> + + <millepede_constant name="12101" value="0.0"/> + <millepede_constant name="12102" value="0.0"/> + <millepede_constant name="12103" value="0.0"/> + <millepede_constant name="12104" value="0.0"/> + <millepede_constant name="12105" value="0.0"/> + <millepede_constant name="12106" value="0.0"/> + <millepede_constant name="12107" value="0.0"/> + <millepede_constant name="12108" value="0.0"/> + <millepede_constant name="12109" value="0.0"/> + <millepede_constant name="12110" value="0.0"/> + + <millepede_constant name="12201" value="0.0"/> + <millepede_constant name="12202" value="0.0"/> + <millepede_constant name="12203" value="0.0"/> + <millepede_constant name="12204" value="0.0"/> + <millepede_constant name="12205" value="0.0"/> + <millepede_constant name="12206" value="0.0"/> + <millepede_constant name="12207" value="0.0"/> + <millepede_constant name="12208" value="0.0"/> + <millepede_constant name="12209" value="0.0"/> + <millepede_constant name="12210" value="0.0"/> + + <millepede_constant name="12301" value="0.0"/> + <millepede_constant name="12302" value="0.0"/> + <millepede_constant name="12303" value="0.0"/> + <millepede_constant name="12304" value="0.0"/> + <millepede_constant name="12305" value="0.0"/> + <millepede_constant name="12306" value="0.0"/> + <millepede_constant name="12307" value="0.0"/> + <millepede_constant name="12308" value="0.0"/> + <millepede_constant name="12309" value="0.0"/> + <millepede_constant name="12310" value="0.0"/> + + <!-- bottom translations --> + + <millepede_constant name="21101" value="0.0"/> + <millepede_constant name="21102" value="0.0"/> + <millepede_constant name="21103" value="0.0"/> + <millepede_constant name="21104" value="0.0"/> + <millepede_constant name="21105" value="0.0"/> + <millepede_constant name="21106" value="0.0"/> + <millepede_constant name="21107" value="0.0"/> + <millepede_constant name="21108" value="0.0"/> + <millepede_constant name="21109" value="0.0"/> + <millepede_constant name="21110" value="0.0"/> + + <millepede_constant name="21201" value="0.0"/> + <millepede_constant name="21202" value="0.0"/> + <millepede_constant name="21203" value="0.0"/> + <millepede_constant name="21204" value="0.0"/> + <millepede_constant name="21205" value="0.0"/> + <millepede_constant name="21206" value="0.0"/> + <millepede_constant name="21207" value="0.0"/> + <millepede_constant name="21208" value="0.0"/> + <millepede_constant name="21209" value="0.0"/> + <millepede_constant name="21210" value="0.0"/> + + <millepede_constant name="21301" value="0.0"/> + <millepede_constant name="21302" value="0.0"/> + <millepede_constant name="21303" value="0.0"/> + <millepede_constant name="21304" value="0.0"/> + <millepede_constant name="21305" value="0.0"/> + <millepede_constant name="21306" value="0.0"/> + <millepede_constant name="21307" value="0.0"/> + <millepede_constant name="21308" value="0.0"/> + <millepede_constant name="21309" value="0.0"/> + <millepede_constant name="21310" value="0.0"/> + + <!-- bottom rotations --> + + <millepede_constant name="22101" value="0.0"/> + <millepede_constant name="22102" value="0.0"/> + <millepede_constant name="22103" value="0.0"/> + <millepede_constant name="22104" value="0.0"/> + <millepede_constant name="22105" value="0.0"/> + <millepede_constant name="22106" value="0.0"/> + <millepede_constant name="22107" value="0.0"/> + <millepede_constant name="22108" value="0.0"/> + <millepede_constant name="22109" value="0.0"/> + <millepede_constant name="22110" value="0.0"/> + + <millepede_constant name="22201" value="0.0"/> + <millepede_constant name="22202" value="0.0"/> + <millepede_constant name="22203" value="0.0"/> + <millepede_constant name="22204" value="0.0"/> + <millepede_constant name="22205" value="0.0"/> + <millepede_constant name="22206" value="0.0"/> + <millepede_constant name="22207" value="0.0"/> + <millepede_constant name="22208" value="0.0"/> + <millepede_constant name="22209" value="0.0"/> + <millepede_constant name="22210" value="0.0"/> + + <millepede_constant name="22301" value="0.0"/> + <millepede_constant name="22302" value="0.0"/> + <millepede_constant name="22303" value="0.0"/> + <millepede_constant name="22304" value="0.0"/> + <millepede_constant name="22305" value="0.0"/> + <millepede_constant name="22306" value="0.0"/> + <millepede_constant name="22307" value="0.0"/> + <millepede_constant name="22308" value="0.0"/> + <millepede_constant name="22309" value="0.0"/> + <millepede_constant name="22310" value="0.0"/> + + + <!-- top support tilt angles --> + <millepede_constant name="13100" value="0.0"/> + <millepede_constant name="13200" value="0.0"/> + <millepede_constant name="13300" value="0.0"/> + + <!-- bottom support tilt angles --> + <millepede_constant name="23100" value="0.0"/> + <millepede_constant name="23200" value="0.0"/> + <millepede_constant name="23300" value="0.0"/> + + </millepede_constants> + </detector> <detector id="30" name="TrackerFieldDef" type="HPSTracker2" Modified: java/branches/hps_java_trunk_HPSJAVA-255/detector-data/pom.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/detector-data/pom.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/detector-data/pom.xml Mon Nov 3 01:04:28 2014 @@ -8,7 +8,7 @@ <groupId>org.hps</groupId> <artifactId>hps-parent</artifactId> <relativePath>../parent/pom.xml</relativePath> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <scm> <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/detector-data/</url> Modified: java/branches/hps_java_trunk_HPSJAVA-255/distribution/pom.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/distribution/pom.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/distribution/pom.xml Mon Nov 3 01:04:28 2014 @@ -11,7 +11,7 @@ <groupId>org.hps</groupId> <artifactId>hps-parent</artifactId> <relativePath>../parent/pom.xml</relativePath> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <scm> <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/distribution/</url> Modified: java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/pom.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/pom.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/pom.xml Mon Nov 3 01:04:28 2014 @@ -7,7 +7,7 @@ <groupId>org.hps</groupId> <artifactId>hps-parent</artifactId> <relativePath>../parent/pom.xml</relativePath> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <scm> <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/ecal-event-display/</url> Modified: java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ActiveViewer.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ActiveViewer.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ActiveViewer.java Mon Nov 3 01:04:28 2014 @@ -19,50 +19,43 @@ * @author Kyle McCarty */ public abstract class ActiveViewer extends Viewer { - private static final long serialVersionUID = -6107646224627009923L; - // Stores whether the background color is set or not. - private boolean background = false; - // Gets events from some file. - protected final EventManager em; - - /** - * Creates an active-type <code>Viewer</code> window which draws - * events from the indicated data source. - * @param em - The data source event manager. - */ - public ActiveViewer(EventManager em) { this(em, new String[0]); } - - /** + private static final long serialVersionUID = -6107646224627009923L; + // Stores whether the background color is set or not. + private boolean background = false; + // Gets events from some file. + protected final EventManager em; + + /** * Creates an active-type <code>Viewer</code> window which draws * events from the indicated data source with additional status * fields defined by the <code>fieldNames</code> argument. - * @param em - The data source event manager. - * @param fieldNames - An array of additional status fields - * that should be displayed. - */ - public ActiveViewer(EventManager em, String... fieldNames) { - // Pass any additional field values to the super class. - super(fieldNames); - - // Set the data source. - this.em = em; - + * @param em - The data source event manager. + * @param fieldNames - An array of additional status fields + * that should be displayed. + */ + public ActiveViewer(EventManager em) { + // Pass any additional field values to the super class. + super(); + + // Set the data source. + this.em = em; + // Make a key listener to change events. addKeyListener(new EcalKeyListener()); - } - + } + /** * Feeds the calorimeter panel the data from the next event. * @throws IOException Occurs when there is an issue with reading the data file. **/ - public abstract void displayNextEvent() throws IOException; - + public abstract void displayNextEvent() throws IOException; + /** * Feeds the calorimeter panel the data from the previous event. * @throws IOException Occurs when there is an issue with reading the data file. **/ - public abstract void displayPreviousEvent() throws IOException; - + public abstract void displayPreviousEvent() throws IOException; + /** * The <code>EcalListener</code> class binds keys to actions. * Bound actions include: @@ -71,7 +64,7 @@ * b :: Toggle color-mapping for 0 energy crystals * h :: Toggle selected crystal highlighting * l :: Toggle logarithmic versus linear scaling - * s :: Saves the current display to a file + * s :: Saves the current display to a file **/ private class EcalKeyListener implements KeyListener { public void keyPressed(KeyEvent e) { } @@ -97,9 +90,9 @@ // 'b' toggles the default white background. else if(e.getKeyCode() == 66) { - if(background) { ecalPanel.setDefaultCrystalColor(null); } - else { ecalPanel.setDefaultCrystalColor(Color.GRAY); } - background = !background; + if(background) { ecalPanel.setDefaultCrystalColor(null); } + else { ecalPanel.setDefaultCrystalColor(Color.GRAY); } + background = !background; } // 'h' toggles highlighting the crystal under the cursor. @@ -107,45 +100,45 @@ // 'l' toggles linear or logarithmic scaling. else if(e.getKeyCode() == 76) { - if(ecalPanel.isScalingLinear()) { ecalPanel.setScalingLogarithmic(); } - else { ecalPanel.setScalingLinear(); } + if(ecalPanel.isScalingLinear()) { ecalPanel.setScalingLogarithmic(); } + else { ecalPanel.setScalingLinear(); } } // 'x' toggles x-axis mirroring. else if(e.getKeyCode() == 88) { - ecalPanel.setMirrorX(!ecalPanel.isMirroredX()); - updateStatusPanel(); + ecalPanel.setMirrorX(!ecalPanel.isMirroredX()); + updateStatusPanel(); } // 'y' toggles y-axis mirroring. else if(e.getKeyCode() == 89) { - ecalPanel.setMirrorY(!ecalPanel.isMirroredY()); - updateStatusPanel(); + ecalPanel.setMirrorY(!ecalPanel.isMirroredY()); + updateStatusPanel(); } // 's' saves the panel to a file. else if(e.getKeyCode() == 83) { - // Make a new buffered image on which to draw the content pane. - BufferedImage screenshot = new BufferedImage(getContentPane().getWidth(), - getContentPane().getHeight(), BufferedImage.TYPE_INT_ARGB); - - // Paint the content pane to image. - getContentPane().paint(screenshot.getGraphics()); - - // Get the lowest available file name. - int fileNum = 0; - File imageFile = new File("screenshot_" + fileNum + ".png"); - while(imageFile.exists()) { - fileNum++; - imageFile = new File("screenshot_" + fileNum + ".png"); - } - - // Save the image to a PNG file. - try { ImageIO.write(screenshot, "PNG", imageFile); } - catch(IOException ioe) { - System.err.println("Error saving file \"screenshot.png\"."); - } - System.out.println("Screenshot saved to: " + imageFile.getAbsolutePath()); + // Make a new buffered image on which to draw the content pane. + BufferedImage screenshot = new BufferedImage(getContentPane().getWidth(), + getContentPane().getHeight(), BufferedImage.TYPE_INT_ARGB); + + // Paint the content pane to image. + getContentPane().paint(screenshot.getGraphics()); + + // Get the lowest available file name. + int fileNum = 0; + File imageFile = new File("screenshot_" + fileNum + ".png"); + while(imageFile.exists()) { + fileNum++; + imageFile = new File("screenshot_" + fileNum + ".png"); + } + + // Save the image to a PNG file. + try { ImageIO.write(screenshot, "PNG", imageFile); } + catch(IOException ioe) { + System.err.println("Error saving file \"screenshot.png\"."); + } + System.out.println("Screenshot saved to: " + imageFile.getAbsolutePath()); } // Otherwise, print out the key code for the pressed key. Modified: java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ClusterViewer.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ClusterViewer.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/ClusterViewer.java Mon Nov 3 01:04:28 2014 @@ -31,10 +31,11 @@ * * @author Kyle McCarty */ +@Deprecated public class ClusterViewer extends ActiveViewer { - private static final long serialVersionUID = 17058336873349781L; - // Stores whether the background color is set or not. - private boolean background = false; + private static final long serialVersionUID = 17058336873349781L; + // Stores whether the background color is set or not. + private boolean background = false; // Store the index in the buffer of the displayed event. private int bufferIndex; // Map cluster location to a cluster object. @@ -50,197 +51,205 @@ // Additional status display field names for this data type. private static final String[] fieldNames = { "Shared Hits", "Component Hits", "Cluster Energy", "Buffer Index" }; - /** - * <b>ClusterViewer</b><br/><br/> + /** + * <b>ClusterViewer</b><br/><br/> * <code>public <b>ClusterViewer</b>()</code><br/><br/> * Constructs a new <code>Viewer</code> for displaying data read * from a file. - * @param dataSource - The <code>EventManager</code> responsible - * for reading data from a file. - * @throws NullPointerException Occurs if the event manager is - * <code>null</code>. - */ - public ClusterViewer(EventManager dataSource, int eventWindow) throws NullPointerException { - // Pass any additional fields required by the event manager - // to the underlying Viewer object to be added to the status - // display panel. - super(dataSource, fieldNames); - - // Define the event window and initialize the event data. - this.eventWindow = eventWindow; - eventEnergyBuffer = new LinkedList<Double[][]>(); - eventHitBuffer = new LinkedList<List<EcalHit>>(); - - // Prepare the event buffer to display the first event. - try { - // Make an empty array. At the start, there are no previous - // events to load. - Double[][] emptyArray = new Double[46][11]; - for(int x = 0; x < 46; x++) { - for(int y = 0; y < 11; y++) { emptyArray[x][y] = new Double(0.0); } - } - - // Populate the eventWindow before section of the buffer - // with the empty events. - for(int i = 0; i <= eventWindow; i++) { - eventEnergyBuffer.addFirst(emptyArray); - eventHitBuffer.addFirst(new ArrayList<EcalHit>()); - } - - // Fill the rest of the array with future events. - for(int i = 0; i < eventWindow; i++) { - em.nextEvent(); - eventEnergyBuffer.addFirst(toEnergyArray(em.getHits())); - eventHitBuffer.addFirst(em.getHits()); - } - } - catch(java.io.IOException e) { System.exit(1); } - + * @param dataSource - The <code>EventManager</code> responsible + * for reading data from a file. + * @throws NullPointerException Occurs if the event manager is + * <code>null</code>. + */ + public ClusterViewer(EventManager dataSource, int eventWindow) throws NullPointerException { + // Initialize the superclass. + super(dataSource); + + // Add the additional fields. + for(String field : fieldNames) { + addStatusField(field); + } + + // Define the event window and initialize the event data. + this.eventWindow = eventWindow; + eventEnergyBuffer = new LinkedList<Double[][]>(); + eventHitBuffer = new LinkedList<List<EcalHit>>(); + + // Prepare the event buffer to display the first event. + try { + // Make an empty array. At the start, there are no previous + // events to load. + Double[][] emptyArray = new Double[46][11]; + for(int x = 0; x < 46; x++) { + for(int y = 0; y < 11; y++) { emptyArray[x][y] = new Double(0.0); } + } + + // Populate the eventWindow before section of the buffer + // with the empty events. + for(int i = 0; i <= eventWindow; i++) { + eventEnergyBuffer.addFirst(emptyArray); + eventHitBuffer.addFirst(new ArrayList<EcalHit>()); + } + + // Fill the rest of the array with future events. + for(int i = 0; i < eventWindow; i++) { + em.nextEvent(); + eventEnergyBuffer.addFirst(toEnergyArray(em.getHits())); + eventHitBuffer.addFirst(em.getHits()); + } + } + catch(java.io.IOException e) { System.exit(1); } + // Make a key listener to change events. addKeyListener(new EcalKeyListener()); - } - - /** - * <b>displayNextEvent</b><br/><br/> - * <code>public void <b>displayNextEvent</b>()</code><br/><br/> + } + + /** * Feeds the calorimeter panel the data from the next event. * @throws IOException Occurs when there is an issue with reading the data file. **/ + @Override public void displayNextEvent() throws IOException { getEvent(true); } /** - * <b>displayPreviousEvent</b><br/><br/> - * <code>public void <b>displayPreviousEvent</b>()</code><br/><br/> * Feeds the calorimeter panel the data from the previous event. * @throws IOException Occurs when there is an issue with reading the data file. **/ + @Override public void displayPreviousEvent() throws IOException { getEvent(false); } - - public List<Cluster> getClusters() { - // Get the set of hits in the middle of the buffer. This is - // the "current" event. - List<EcalHit> activeEvent = eventHitBuffer.get(eventWindow); - - // Store clusters. - ArrayList<Cluster> clusterList = new ArrayList<Cluster>(); - - // For each hit, check if it meets the criteria for a cluster. - for(EcalHit hit : activeEvent) { - // Track whether this hit is a cluster. - boolean isCluster = true; - - // Track the current hit's cluster energy. - double clusterEnergy = 0.0; - - // Convert the current hit to the proper coordinates. - Point hitLoc = toPanelPoint(hit.getLocation()); - - // Track which crystals are part of the cluster. - HashSet<Point> componentSet = new HashSet<Point>(); - - // Get the set of the current hit's neighbors. - Set<Point> neighbors = ecalPanel.getNeighbors(hitLoc); - - // Loop through the buffer and perform comparisons. - for(Double[][] event : eventEnergyBuffer) { - // Increment the cluster energy by the hit's energy at - // the current time in the buffer. - clusterEnergy += event[hitLoc.x][hitLoc.y]; - - // A hit must be larger than itself at all other times - // stored in the buffer. - if(event[hitLoc.x][hitLoc.y] > hit.getEnergy()) { - isCluster = false; - break; - } - - // A hit must be larger than its immediate neighbors - // at all times in the buffer as well. - for(Point neighbor : neighbors) { - // Increment the cluster energy by the neighbor's - // energy at the current time in the buffer. - clusterEnergy += event[neighbor.x][neighbor.y]; - - // Check that the neighbor's energy is not higher - // than the present hit's. - if(event[neighbor.x][neighbor.y] > hit.getEnergy()) { - isCluster = false; - break; - } - - // If this neighbor has a non-zero energy, it is - // a component of the potential cluster. - if(event[neighbor.x][neighbor.y] != 0) { componentSet.add(neighbor); } - } - } - - // If the current hit did not fail any of the preceding - // checks, then it is a cluster and should be added to - // the cluster list. - if(isCluster) { - Cluster cluster = new Cluster(hit.getLocation(), clusterEnergy); - for(Point neighbor : componentSet) { cluster.addComponentHit(toEcalPoint(neighbor)); } - clusterList.add(cluster); - } - } - - // Return the list of clusters. - return clusterList; - } - + + /** + * Generates a list of clusters from the list of hits in the event. + * This was used as a debugging method for the current clustering + * algorithm. + * @return Returns a generated list of clusters. + */ + public List<Cluster> getClusters() { + // Get the set of hits in the middle of the buffer. This is + // the "current" event. + List<EcalHit> activeEvent = eventHitBuffer.get(eventWindow); + + // Store clusters. + ArrayList<Cluster> clusterList = new ArrayList<Cluster>(); + + // For each hit, check if it meets the criteria for a cluster. + for(EcalHit hit : activeEvent) { + // Track whether this hit is a cluster. + boolean isCluster = true; + + // Track the current hit's cluster energy. + double clusterEnergy = 0.0; + + // Convert the current hit to the proper coordinates. + Point hitLoc = toPanelPoint(hit.getLocation()); + + // Track which crystals are part of the cluster. + HashSet<Point> componentSet = new HashSet<Point>(); + + // Get the set of the current hit's neighbors. + Set<Point> neighbors = ecalPanel.getNeighbors(hitLoc); + + // Loop through the buffer and perform comparisons. + for(Double[][] event : eventEnergyBuffer) { + // Increment the cluster energy by the hit's energy at + // the current time in the buffer. + clusterEnergy += event[hitLoc.x][hitLoc.y]; + + // A hit must be larger than itself at all other times + // stored in the buffer. + if(event[hitLoc.x][hitLoc.y] > hit.getEnergy()) { + isCluster = false; + break; + } + + // A hit must be larger than its immediate neighbors + // at all times in the buffer as well. + for(Point neighbor : neighbors) { + // Increment the cluster energy by the neighbor's + // energy at the current time in the buffer. + clusterEnergy += event[neighbor.x][neighbor.y]; + + // Check that the neighbor's energy is not higher + // than the present hit's. + if(event[neighbor.x][neighbor.y] > hit.getEnergy()) { + isCluster = false; + break; + } + + // If this neighbor has a non-zero energy, it is + // a component of the potential cluster. + if(event[neighbor.x][neighbor.y] != 0) { componentSet.add(neighbor); } + } + } + + // If the current hit did not fail any of the preceding + // checks, then it is a cluster and should be added to + // the cluster list. + if(isCluster) { + Cluster cluster = new Cluster(hit.getLocation(), clusterEnergy); + for(Point neighbor : componentSet) { cluster.addComponentHit(toEcalPoint(neighbor)); } + clusterList.add(cluster); + } + } + + // Return the list of clusters. + return clusterList; + } + + @Override protected void updateStatusPanel() { - super.updateStatusPanel(); - - // Get the currently selected crystal. - Point crystal = ecalPanel.getSelectedCrystal(); - - // If the active crystal is not null, see if it is a cluster. - if(crystal != null) { - // Get the cluster associated with this point. - Cluster activeCluster = clusterMap.get(crystal); - - // If the cluster is null, we set everything to undefined. - if(activeCluster == null) { - for(String field : fieldNames) { setStatusField(field, StatusPanel.NULL_VALUE); } - } - - // Otherwise, define the fields based on the cluster. - else { - // Get the shared and component hit counts. - setStatusField(fieldNames[0], Integer.toString(activeCluster.getSharedHitCount())); - setStatusField(fieldNames[1], Integer.toString(activeCluster.getComponentHitCount())); - - // Format the cluster energy, or account for it if it - // doesn't exist. - String energy; - if(activeCluster.getClusterEnergy() != Double.NaN) { - DecimalFormat formatter = new DecimalFormat("0.####E0"); - energy = formatter.format(activeCluster.getClusterEnergy()); - } - else { energy = "---"; } - setStatusField(fieldNames[2], energy); - } - } - // Otherwise, clear the field values. - else { for(String field : fieldNames) { setStatusField(field, StatusPanel.NULL_VALUE); } } - - // Write the current buffer index. - - setStatusField(fieldNames[3], Integer.toString(eventWindow - bufferIndex)); - } - - /** - * <b>displayEvent</b><br/><br/> - * <code>private void <b>displayEvent</b></code><br/><br/> - * Displays the given lists of hits and clusters on the calorimeter - * panel. - * @param hitList - A list of hits for the current event. - * @param clusterList - A list of clusters for the current event. - */ - private void displayEvent(List<EcalHit> hitList, List<Cluster> clusterList) { - // Suppress the calorimeter panel. - ecalPanel.setSuppressRedraw(true); - + super.updateStatusPanel(); + + // Get the currently selected crystal. + Point crystal = ecalPanel.getSelectedCrystal(); + + // If the active crystal is not null, see if it is a cluster. + if(crystal != null) { + // Get the cluster associated with this point. + Cluster activeCluster = clusterMap.get(crystal); + + // If the cluster is null, we set everything to undefined. + if(activeCluster == null) { + for(String field : fieldNames) { setStatusField(field, StatusPanel.NULL_VALUE); } + } + + // Otherwise, define the fields based on the cluster. + else { + // Get the shared and component hit counts. + setStatusField(fieldNames[0], Integer.toString(activeCluster.getSharedHitCount())); + setStatusField(fieldNames[1], Integer.toString(activeCluster.getComponentHitCount())); + + // Format the cluster energy, or account for it if it + // doesn't exist. + String energy; + if(activeCluster.getClusterEnergy() != Double.NaN) { + DecimalFormat formatter = new DecimalFormat("0.####E0"); + energy = formatter.format(activeCluster.getClusterEnergy()); + } + else { energy = "---"; } + setStatusField(fieldNames[2], energy); + } + } + // Otherwise, clear the field values. + else { for(String field : fieldNames) { setStatusField(field, StatusPanel.NULL_VALUE); } } + + // Write the current buffer index. + + setStatusField(fieldNames[3], Integer.toString(eventWindow - bufferIndex)); + } + + /** + * <b>displayEvent</b><br/><br/> + * <code>private void <b>displayEvent</b></code><br/><br/> + * Displays the given lists of hits and clusters on the calorimeter + * panel. + * @param hitList - A list of hits for the current event. + * @param clusterList - A list of clusters for the current event. + */ + private void displayEvent(List<EcalHit> hitList, List<Cluster> clusterList) { + // Suppress the calorimeter panel. + ecalPanel.setSuppressRedraw(true); + // Display the hits. for (EcalHit h : hitList) { int ix = toPanelX(h.getX()); @@ -250,28 +259,28 @@ // Display the clusters. for(Cluster cluster : clusterList) { - Point rawCluster = cluster.getClusterCenter(); - Point clusterCenter = toPanelPoint(rawCluster); + Point rawCluster = cluster.getClusterCenter(); + Point clusterCenter = toPanelPoint(rawCluster); ecalPanel.setCrystalCluster(clusterCenter.x, clusterCenter.y, true); - // Add component hits to the calorimeter panel. - for(Point ch : cluster.getComponentHits()) { - ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(ch), HIGHLIGHT_CLUSTER_COMPONENT)); - } - - // Add shared hits to the calorimeter panel. - for(Point sh : cluster.getSharedHits()) { - ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(sh), HIGHLIGHT_CLUSTER_SHARED)); - } - } - - // Stop suppressing the panel and order it to redraw. - ecalPanel.setSuppressRedraw(false); - ecalPanel.repaint(); + // Add component hits to the calorimeter panel. + for(Point ch : cluster.getComponentHits()) { + ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(ch), HIGHLIGHT_CLUSTER_COMPONENT)); + } + + // Add shared hits to the calorimeter panel. + for(Point sh : cluster.getSharedHits()) { + ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(sh), HIGHLIGHT_CLUSTER_SHARED)); + } + } + + // Stop suppressing the panel and order it to redraw. + ecalPanel.setSuppressRedraw(false); + ecalPanel.repaint(); // Update the status panel to account for the new event. updateStatusPanel(); - } + } /** * <b>getEvent</b><br/><br/> @@ -294,16 +303,16 @@ // Remove the last buffer event and add the new one. if(forward) { - eventEnergyBuffer.removeLast(); - eventHitBuffer.removeLast(); - eventEnergyBuffer.addFirst(toEnergyArray(em.getHits())); - eventHitBuffer.addFirst(em.getHits()); + eventEnergyBuffer.removeLast(); + eventHitBuffer.removeLast(); + eventEnergyBuffer.addFirst(toEnergyArray(em.getHits())); + eventHitBuffer.addFirst(em.getHits()); } else { - eventEnergyBuffer.removeFirst(); - eventHitBuffer.removeFirst(); - eventEnergyBuffer.addLast(toEnergyArray(em.getHits())); - eventHitBuffer.addLast(em.getHits()); + eventEnergyBuffer.removeFirst(); + eventHitBuffer.removeFirst(); + eventEnergyBuffer.addLast(toEnergyArray(em.getHits())); + eventHitBuffer.addLast(em.getHits()); } // Determine if any of the hits in the active event are @@ -321,29 +330,36 @@ // Display it. displayEvent(eventHitBuffer.get(eventWindow), eventClusters); } - - private Double[][] toEnergyArray(List<EcalHit> hits) { - // Define the energy array. - Double[][] energy = new Double[46][11]; - for(int x = 0; x < energy.length; x++) { - for(int y = 0; y < energy[x].length; y++) { - energy[x][y] = new Double(0); - } - } - - // For each hit, place its energy in the array. - for(EcalHit hit : hits) { - // Get the converted crystal index. - Point panelLoc = toPanelPoint(hit.getLocation()); - - // Add the energy to the array. - energy[panelLoc.x][panelLoc.y] += hit.getEnergy(); - } - - // Return the resulting array. - return energy; - } - + + /** + * Gets the energy that should be stored in each crystal of the + * calorimeter. + * @param hits - The list of hits for the event. + * @return Returns the energy of each crystal as an array of <code> + * Double</code> objects. + */ + private Double[][] toEnergyArray(List<EcalHit> hits) { + // Define the energy array. + Double[][] energy = new Double[46][11]; + for(int x = 0; x < energy.length; x++) { + for(int y = 0; y < energy[x].length; y++) { + energy[x][y] = new Double(0); + } + } + + // For each hit, place its energy in the array. + for(EcalHit hit : hits) { + // Get the converted crystal index. + Point panelLoc = toPanelPoint(hit.getLocation()); + + // Add the energy to the array. + energy[panelLoc.x][panelLoc.y] += hit.getEnergy(); + } + + // Return the resulting array. + return energy; + } + /** * The <code>EcalListener</code> class binds keys to actions. * Bound actions include: @@ -352,11 +368,13 @@ * b :: Toggle color-mapping for 0 energy crystals * h :: Toggle selected crystal highlighting * l :: Toggle logarithmic versus linear scaling - * s :: Saves the current display to a file + * s :: Saves the current display to a file **/ private class EcalKeyListener implements KeyListener { + @Override public void keyPressed(KeyEvent e) { } + @Override public void keyReleased(KeyEvent e) { // If right-arrow was pressed, go to the next event. if (e.getKeyCode() == 39) { @@ -379,30 +397,30 @@ // If the down-arrow was pressed, move down a time step in // the buffer and display it. else if(e.getKeyCode() == 40) { - if(bufferIndex == eventHitBuffer.size() - 1) { return; } - else { - bufferIndex++; - ecalPanel.clearCrystals(); - displayEvent(eventHitBuffer.get(bufferIndex), eventClusters); - } + if(bufferIndex == eventHitBuffer.size() - 1) { return; } + else { + bufferIndex++; + ecalPanel.clearCrystals(); + displayEvent(eventHitBuffer.get(bufferIndex), eventClusters); + } } // If the up-arrow was pressed, move up a time step in // the buffer and display it. else if(e.getKeyCode() == 38) { - if(bufferIndex == 0) { return; } - else { - bufferIndex--; - ecalPanel.clearCrystals(); - displayEvent(eventHitBuffer.get(bufferIndex), eventClusters); - } + if(bufferIndex == 0) { return; } + else { + bufferIndex--; + ecalPanel.clearCrystals(); + displayEvent(eventHitBuffer.get(bufferIndex), eventClusters); + } } // 'b' toggles the default white background. else if(e.getKeyCode() == 66) { - if(background) { ecalPanel.setDefaultCrystalColor(null); } - else { ecalPanel.setDefaultCrystalColor(Color.GRAY); } - background = !background; + if(background) { ecalPanel.setDefaultCrystalColor(null); } + else { ecalPanel.setDefaultCrystalColor(Color.GRAY); } + background = !background; } // 'h' toggles highlighting the crystal under the cursor. @@ -410,39 +428,40 @@ // 'l' toggles linear or logarithmic scaling. else if(e.getKeyCode() == 76) { - if(ecalPanel.isScalingLinear()) { ecalPanel.setScalingLogarithmic(); } - else { ecalPanel.setScalingLinear(); } + if(ecalPanel.isScalingLinear()) { ecalPanel.setScalingLogarithmic(); } + else { ecalPanel.setScalingLinear(); } } // 's' saves the panel to a file. else if(e.getKeyCode() == 83) { - // Make a new buffered image on which to draw the content pane. - BufferedImage screenshot = new BufferedImage(getContentPane().getWidth(), - getContentPane().getHeight(), BufferedImage.TYPE_INT_ARGB); - - // Paint the content pane to image. - getContentPane().paint(screenshot.getGraphics()); - - // Get the lowest available file name. - int fileNum = 0; - File imageFile = new File("screenshot_" + fileNum + ".png"); - while(imageFile.exists()) { - fileNum++; - imageFile = new File("screenshot_" + fileNum + ".png"); - } - - // Save the image to a PNG file. - try { ImageIO.write(screenshot, "PNG", imageFile); } - catch(IOException ioe) { - System.err.println("Error saving file \"screenshot.png\"."); - } - System.out.println("Screenshot saved to: " + imageFile.getAbsolutePath()); + // Make a new buffered image on which to draw the content pane. + BufferedImage screenshot = new BufferedImage(getContentPane().getWidth(), + getContentPane().getHeight(), BufferedImage.TYPE_INT_ARGB); + + // Paint the content pane to image. + getContentPane().paint(screenshot.getGraphics()); + + // Get the lowest available file name. + int fileNum = 0; + File imageFile = new File("screenshot_" + fileNum + ".png"); + while(imageFile.exists()) { + fileNum++; + imageFile = new File("screenshot_" + fileNum + ".png"); + } + + // Save the image to a PNG file. + try { ImageIO.write(screenshot, "PNG", imageFile); } + catch(IOException ioe) { + System.err.println("Error saving file \"screenshot.png\"."); + } + System.out.println("Screenshot saved to: " + imageFile.getAbsolutePath()); } // Otherwise, print out the key code for the pressed key. else { System.out.printf("Key Code: %d%n", e.getKeyCode()); } } + @Override public void keyTyped(KeyEvent e) { } } } Modified: java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/FileViewer.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/FileViewer.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/FileViewer.java Mon Nov 3 01:04:28 2014 @@ -21,7 +21,7 @@ * @author Kyle McCarty */ public class FileViewer extends ActiveViewer { - private static final long serialVersionUID = 17058336873349781L; + private static final long serialVersionUID = 17058336873349781L; // Map cluster location to a cluster object. private HashMap<Point, Cluster> clusterMap = new HashMap<Point, Cluster>(); // Additional status display field names for this data type. @@ -32,80 +32,87 @@ private static final int COMPONENT_HITS = 2; private static final int CLUSTER_ENERGY = 3; - /** - * <b>FileViewer</b><br/><br/> + /** + * <b>FileViewer</b><br/><br/> * <code>public <b>FileViewer</b>()</code><br/><br/> * Constructs a new <code>Viewer</code> for displaying data read * from a file. - * @param dataSource - The <code>EventManager</code> responsible - * for reading data from a file. - * @throws NullPointerException Occurs if the event manager is - * <code>null</code>. - */ - public FileViewer(EventManager dataSource) throws NullPointerException { - // Pass any additional fields required by the event manager - // to the underlying Viewer object to be added to the status - // display panel. - super(dataSource, fieldNames); - } + * @param dataSource - The <code>EventManager</code> responsible + * for reading data from a file. + * @throws NullPointerException Occurs if the event manager is + * <code>null</code>. + */ + public FileViewer(EventManager dataSource) throws NullPointerException { + // Initialize the superclass viewer. + super(dataSource); + + // Add additional fields. + insertStatusField(0, fieldNames[0]); + for(int index = 1; index < fieldNames.length; index++) { + addStatusField(fieldNames[index]); + } + } + @Override public void displayNextEvent() throws IOException { getEvent(true); } + @Override public void displayPreviousEvent() throws IOException { getEvent(false); } + @Override protected void updateStatusPanel() { - // Update the superclass status fields. - super.updateStatusPanel(); - - // Get the currently selected crystal. - Point crystal = ecalPanel.getSelectedCrystal(); - - // If the active crystal is not null, see if it is a cluster. - if(crystal != null) { - // Get the cluster associated with this point. - Cluster activeCluster = clusterMap.get(crystal); - - // If the cluster is null, we set everything to undefined. - if(activeCluster == null) { - for(String field : fieldNames) { setStatusField(field, StatusPanel.NULL_VALUE); } - } - - // Otherwise, define the fields based on the cluster. - else { - // Get the shared and component hit counts. - setStatusField(fieldNames[SHARED_HITS], Integer.toString(activeCluster.getSharedHitCount())); - setStatusField(fieldNames[COMPONENT_HITS], Integer.toString(activeCluster.getComponentHitCount())); - - // Format the cluster energy, or account for it if it - // doesn't exist. - String energy; - if(activeCluster.getClusterEnergy() != Double.NaN) { - DecimalFormat formatter = new DecimalFormat("0.####E0"); - energy = formatter.format(activeCluster.getClusterEnergy()); - } - else { energy = "---"; } - setStatusField(fieldNames[CLUSTER_ENERGY], energy); - } - } - // Otherwise, clear the field values. - else { for(String field : fieldNames) { setStatusField(field, StatusPanel.NULL_VALUE); } } - - // Set the event number. - setStatusField(fieldNames[EVENT_NUMBER], Integer.toString(em.getEventNumber())); + // Update the superclass status fields. + super.updateStatusPanel(); + + // Get the currently selected crystal. + Point crystal = ecalPanel.getSelectedCrystal(); + + // If the active crystal is not null, see if it is a cluster. + if(crystal != null) { + // Get the cluster associated with this point. + Cluster activeCluster = clusterMap.get(crystal); + + // If the cluster is null, we set everything to undefined. + if(activeCluster == null) { + for(String field : fieldNames) { setStatusField(field, ResizableFieldPanel.NULL_VALUE); } + } + + // Otherwise, define the fields based on the cluster. + else { + // Get the shared and component hit counts. + setStatusField(fieldNames[SHARED_HITS], Integer.toString(activeCluster.getSharedHitCount())); + setStatusField(fieldNames[COMPONENT_HITS], Integer.toString(activeCluster.getComponentHitCount())); + + // Format the cluster energy, or account for it if it + // doesn't exist. + String energy; + if(activeCluster.getClusterEnergy() != Double.NaN) { + DecimalFormat formatter = new DecimalFormat("0.####E0"); + energy = formatter.format(activeCluster.getClusterEnergy()); + } + else { energy = "---"; } + setStatusField(fieldNames[CLUSTER_ENERGY], energy); + } + } + // Otherwise, clear the field values. + else { for(String field : fieldNames) { setStatusField(field, ResizableFieldPanel.NULL_VALUE); } } + + // Set the event number. + setStatusField(fieldNames[EVENT_NUMBER], Integer.toString(em.getEventNumber())); } - /** - * <b>displayEvent</b><br/><br/> - * <code>private void <b>displayEvent</b>(List<EcalHit> hitList, List<Cluster> clusterList)</code><br/><br/> - * Displays the given lists of hits and clusters on the calorimeter - * panel. - * @param hitList - A list of hits for the current event. - * @param clusterList - A list of clusters for the current event. - */ - private void displayEvent(List<EcalHit> hitList, List<Cluster> clusterList) { - // Suppress the calorimeter panel's redrawing. - ecalPanel.setSuppressRedraw(true); - + /** + * <b>displayEvent</b><br/><br/> + * <code>private void <b>displayEvent</b>(List<EcalHit> hitList, List<Cluster> clusterList)</code><br/><br/> + * Displays the given lists of hits and clusters on the calorimeter + * panel. + * @param hitList - A list of hits for the current event. + * @param clusterList - A list of clusters for the current event. + */ + private void displayEvent(List<EcalHit> hitList, List<Cluster> clusterList) { + // Suppress the calorimeter panel's redrawing. + ecalPanel.setSuppressRedraw(true); + // Display the hits. for (EcalHit h : hitList) { int ix = toPanelX(h.getX()); @@ -115,19 +122,19 @@ // Display the clusters. for(Cluster cluster : clusterList) { - Point rawCluster = cluster.getClusterCenter(); - Point clusterCenter = toPanelPoint(rawCluster); + Point rawCluster = cluster.getClusterCenter(); + Point clusterCenter = toPanelPoint(rawCluster); ecalPanel.setCrystalCluster(clusterCenter.x, clusterCenter.y, true); - // Add component hits to the calorimeter panel. - for(Point ch : cluster.getComponentHits()) { - ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(ch), HIGHLIGHT_CLUSTER_COMPONENT)); - } - - // Add shared hits to the calorimeter panel. - for(Point sh : cluster.getSharedHits()) { - ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(sh), HIGHLIGHT_CLUSTER_SHARED)); - } + // Add component hits to the calorimeter panel. + for(Point ch : cluster.getComponentHits()) { + ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(ch), HIGHLIGHT_CLUSTER_COMPONENT)); + } + + // Add shared hits to the calorimeter panel. + for(Point sh : cluster.getSharedHits()) { + ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(sh), HIGHLIGHT_CLUSTER_SHARED)); + } } // Stop suppressing the redraw and order the panel to update. @@ -136,7 +143,7 @@ // Update the status panel to account for the new event. updateStatusPanel(); - } + } /** * <b>getEvent</b><br/><br/> Modified: java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/OccupancyViewer.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/OccupancyViewer.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/OccupancyViewer.java Mon Nov 3 01:04:28 2014 @@ -17,63 +17,59 @@ * @author Kyle McCarty */ public class OccupancyViewer extends ActiveViewer { - private static final long serialVersionUID = 3712604287904215617L; - // The number of events that have been read so far. - private long events = 0; - // The total number of hits for each crystal position. - private long[][] hits; - - /** - * <b>OccupancyViewer</b><br/><br/> - * <code>public <b>OccupancyViewer</b>(EventManager em)</code><br/><br/> + private static final long serialVersionUID = 3712604287904215617L; + // The number of events that have been read so far. + private long events = 0; + // The total number of hits for each crystal position. + private long[][] hits; + + /** * Creates a new occupancy display that draws event data from the * indicated data source. - * @param em - The data source from which to draw events. - */ - public OccupancyViewer(EventManager em) { - // Initialize the super class. - super(em); - - // Set the title and scale. - setTitle("HPS Calorimeter Occupancies"); - ecalPanel.setScaleMaximum(1.0); - - // Initialize the hit counts array. - Dimension ecalSize = ecalPanel.getCrystalBounds(); - hits = new long[ecalSize.width][ecalSize.height]; - } + * @param em - The data source from which to draw events. + */ + public OccupancyViewer(EventManager em) { + // Initialize the super class. + super(em); + + // Set the title and scale. + setTitle("HPS Calorimeter Occupancies"); + ecalPanel.setScaleMaximum(1.0); + + // Initialize the hit counts array. + Dimension ecalSize = ecalPanel.getCrystalBounds(); + hits = new long[ecalSize.width][ecalSize.height]; + } + @Override public void displayNextEvent() throws IOException { getEvent(true); } + @Override public void displayPreviousEvent() throws IOException { getEvent(false); } /** - * <b>resetOccupancies</b><br/><br/> - * <code>public void <b>resetOccupancies</b>()</code><br/><br/> * Clears the current occupancy data. */ public void resetOccupancies() { - // Clear the crystal hit counts. - for(int x = 0; x < hits.length; x++) { - for(int y = 0; y < hits[0].length; y++) { - hits[x][y] = 0; - } - } - - // Clear the number of events. - events = 0; + // Clear the crystal hit counts. + for(int x = 0; x < hits.length; x++) { + for(int y = 0; y < hits[0].length; y++) { + hits[x][y] = 0; + } + } + + // Clear the number of events. + events = 0; } - /** - * <b>displayEvent</b><br/><br/> - * <code>private void <b>displayEvent</b>(List<EcalHit> hitList)</code><br/><br/> - * Displays the given lists of hits on the calorimeter panel. - * @param hitList - A list of hits for the current event. - */ - private void displayEvent(List<EcalHit> hitList) { - // Suppress the calorimeter panel's redrawing. - ecalPanel.setSuppressRedraw(true); - + /** + * Displays the given lists of hits on the calorimeter panel. + * @param hitList - A list of hits for the current event. + */ + private void displayEvent(List<EcalHit> hitList) { + // Suppress the calorimeter panel's redrawing. + ecalPanel.setSuppressRedraw(true); + // Display the hits. for (EcalHit h : hitList) { ecalPanel.addCrystalEnergy(h.getX(), h.getY(), h.getEnergy()); @@ -85,11 +81,9 @@ // Update the status panel to account for the new event. updateStatusPanel(); - } + } /** - * <b>getEvent</b><br/><br/> - * <code>private void <b>getEvent</b>(boolean forward)</code><br/><br/> * Reads either the next or the previous event from the event manager. * @param forward - Whether the event data should be read forward * or backward. @@ -104,44 +98,44 @@ // Get the next event. if(forward) { - // Get the next event. - em.nextEvent(); - - // Increment the event count. - events++; - - // For each hit, increment the hit count for the relevant - // crystal by one. - for(EcalHit hit : em.getHits()) { - hits[toPanelX(hit.getX())][toPanelY(hit.getY())]++; - } + // Get the next event. + em.nextEvent(); + + // Increment the event count. + events++; + + // For each hit, increment the hit count for the relevant + // crystal by one. + for(EcalHit hit : em.getHits()) { + hits[toPanelX(hit.getX())][toPanelY(hit.getY())]++; + } } else { - // Get the previous event. - em.previousEvent(); - - // Decrement the event count. - events--; - - // For each hit, decrement the hit count for the relevant - // crystal by one. - for(EcalHit hit : em.getHits()) { - hits[toPanelX(hit.getX())][toPanelY(hit.getY())]--; - } + // Get the previous event. + em.previousEvent(); + + // Decrement the event count. + events--; + + // For each hit, decrement the hit count for the relevant + // crystal by one. + for(EcalHit hit : em.getHits()) { + hits[toPanelX(hit.getX())][toPanelY(hit.getY())]--; + } } // Build a "hit list" from the occupancies. ArrayList<EcalHit> occupancyList = new ArrayList<EcalHit>(); for(int x = 0; x < hits.length; x++) { - for(int y = 0; y < hits[0].length; y++) { - if(hits[x][y] != 0) { - // Define the crystal ID and "energy." - Point cid = new Point(x, y); - double occupancy = ((double) hits[x][y]) / events; - EcalHit occupancyHit = new EcalHit(cid, occupancy); - occupancyList.add(occupancyHit); - } - } + for(int y = 0; y < hits[0].length; y++) { + if(hits[x][y] != 0) { + // Define the crystal ID and "energy." + Point cid = new Point(x, y); + double occupancy = ((double) hits[x][y]) / events; + EcalHit occupancyHit = new EcalHit(cid, occupancy); + occupancyList.add(occupancyHit); + } + } } // Display it the occupancies. Modified: java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PEventViewer.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PEventViewer.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PEventViewer.java Mon Nov 3 01:04:28 2014 @@ -22,60 +22,58 @@ * @author Kyle McCarty */ public class PEventViewer extends PassiveViewer { - private static final long serialVersionUID = -7479125553259270894L; - // Stores whether the background color is set or not. - private boolean background = false; - // Stores cluster objects. - protected ArrayList<Cluster> clusterList = new ArrayList<Cluster>(); - // Stores hit objects. - protected ArrayList<EcalHit> hitList = new ArrayList<EcalHit>(); - - /** - * <b>PEventViewer</b><br/><br/> - * <code>public <b>PEventViewer</b>(String... fieldValues)</code><br/><br/> - * Creates a passive viewer for displaying hits and clusters in - * an event. - * @param fieldValues - Any additional status fields to display. - */ - public PEventViewer(String... fieldValues) { - // Pass the field values to the superclass. - super(fieldValues); - - // Set the key bindings. - addKeyListener(new EcalKeyListener()); - } - - public void addHit(EcalHit hit) { hitList.add(hit); } - - public void addCluster(Cluster cluster) { clusterList.add(cluster); } - - /** - * <b>clearHits</b><br/><br/> - * <code>public void <b>clearHits</b>()</code><br/><br/> - * Removes all of the hit data from the viewer. - */ - public void clearHits() { hitList.clear(); } - - /** - * <b>clearClusters</b><br/><br/> - * <code>public void <b>clearClusters</b>()</code><br/><br/> - * Removes all of the cluster data from the viewer. - */ - public void clearClusters() { hitList.clear(); } - - public void resetDisplay() { - // Reset the hit and cluster lists. - hitList.clear(); - clusterList.clear(); - } - - public void updateDisplay() { - // Suppress the calorimeter panel's redrawing. - ecalPanel.setSuppressRedraw(true); - - // Clear the panel data. - ecalPanel.clearCrystals(); - + private static final long serialVersionUID = -7479125553259270894L; + // Stores whether the background color is set or not. + private boolean background = false; + // Stores cluster objects. + protected ArrayList<Cluster> clusterList = new ArrayList<Cluster>(); + // Stores hit objects. + protected ArrayList<EcalHit> hitList = new ArrayList<EcalHit>(); + + /** + * Creates a passive viewer for displaying hits and clusters in + * an event. + * @param fieldValues - Any additional status fields to display. + */ + public PEventViewer() { + // Initialize the superclass. + super(); + + // Set the key bindings. + addKeyListener(new EcalKeyListener()); + } + + @Override + public void addHit(EcalHit hit) { hitList.add(hit); } + + @Override + public void addCluster(Cluster cluster) { clusterList.add(cluster); } + + /** + * Removes all of the hit data from the viewer. + */ + public void clearHits() { hitList.clear(); } + + /** + * Removes all of the cluster data from the viewer. + */ + public void clearClusters() { hitList.clear(); } + + @Override + public void resetDisplay() { + // Reset the hit and cluster lists. + hitList.clear(); + clusterList.clear(); + } + + @Override + public void updateDisplay() { + // Suppress the calorimeter panel's redrawing. + ecalPanel.setSuppressRedraw(true); + + // Clear the panel data. + ecalPanel.clearCrystals(); + // Display the hits. for (EcalHit h : hitList) { int ix = toPanelX(h.getX()); @@ -85,19 +83,19 @@ // Display the clusters. for(Cluster cluster : clusterList) { - Point rawCluster = cluster.getClusterCenter(); - Point clusterCenter = toPanelPoint(rawCluster); + Point rawCluster = cluster.getClusterCenter(); + Point clusterCenter = toPanelPoint(rawCluster); ecalPanel.setCrystalCluster(clusterCenter.x, clusterCenter.y, true); - // Add component hits to the calorimeter panel. - for(Point ch : cluster.getComponentHits()) { - ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(ch), HIGHLIGHT_CLUSTER_COMPONENT)); - } - - // Add shared hits to the calorimeter panel. - for(Point sh : cluster.getSharedHits()) { - ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(sh), HIGHLIGHT_CLUSTER_SHARED)); - } + // Add component hits to the calorimeter panel. + for(Point ch : cluster.getComponentHits()) { + ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(ch), HIGHLIGHT_CLUSTER_COMPONENT)); + } + + // Add shared hits to the calorimeter panel. + for(Point sh : cluster.getSharedHits()) { + ecalPanel.addAssociation(new Association(clusterCenter, toPanelPoint(sh), HIGHLIGHT_CLUSTER_SHARED)); + } } // Stop suppressing the redraw and order the panel to update. @@ -106,25 +104,27 @@ // Update the status panel to account for the new event. updateStatusPanel(); - } - + } + /** * The <code>EcalListener</code> class binds keys to actions. * Bound actions include: * b :: Toggle color-mapping for 0 energy crystals * h :: Toggle selected crystal highlighting * l :: Toggle logarithmic versus linear scaling - * s :: Saves the current display to a file + * s :: Saves the current display to a file **/ private class EcalKeyListener implements KeyListener { + @Override public void keyPressed(KeyEvent e) { } + @Override public void keyReleased(KeyEvent e) { // 'b' toggles the default white background. if(e.getKeyCode() == 66) { - if(background) { ecalPanel.setDefaultCrystalColor(null); } - else { ecalPanel.setDefaultCrystalColor(Color.GRAY); } - background = !background; + if(background) { ecalPanel.setDefaultCrystalColor(null); } + else { ecalPanel.setDefaultCrystalColor(Color.GRAY); } + background = !background; } // 'h' toggles highlighting the crystal under the cursor. @@ -132,39 +132,40 @@ // 'l' toggles linear or logarithmic scaling. else if(e.getKeyCode() == 76) { - if(ecalPanel.isScalingLinear()) { ecalPanel.setScalingLogarithmic(); } - else { ecalPanel.setScalingLinear(); } + if(ecalPanel.isScalingLinear()) { ecalPanel.setScalingLogarithmic(); } + else { ecalPanel.setScalingLinear(); } } // 's' saves the panel to a file. else if(e.getKeyCode() == 83) { - // Make a new buffered image on which to draw the content pane. - BufferedImage screenshot = new BufferedImage(getContentPane().getWidth(), - getContentPane().getHeight(), BufferedImage.TYPE_INT_ARGB); - - // Paint the content pane to image. - getContentPane().paint(screenshot.getGraphics()); - - // Get the lowest available file name. - int fileNum = 0; - File imageFile = new File("screenshot_" + fileNum + ".png"); - while(imageFile.exists()) { - fileNum++; - imageFile = new File("screenshot_" + fileNum + ".png"); - } - - // Save the image to a PNG file. - try { ImageIO.write(screenshot, "PNG", imageFile); } - catch(IOException ioe) { - System.err.println("Error saving file \"screenshot.png\"."); - } - System.out.println("Screenshot saved to: " + imageFile.getAbsolutePath()); + // Make a new buffered image on which to draw the content pane. + BufferedImage screenshot = new BufferedImage(getContentPane().getWidth(), + getContentPane().getHeight(), BufferedImage.TYPE_INT_ARGB); + + // Paint the content pane to image. + getContentPane().paint(screenshot.getGraphics()); + + // Get the lowest available file name. + int fileNum = 0; + File imageFile = new File("screenshot_" + fileNum + ".png"); + while(imageFile.exists()) { + fileNum++; + imageFile = new File("screenshot_" + fileNum + ".png"); + } + + // Save the image to a PNG file. + try { ImageIO.write(screenshot, "PNG", imageFile); } + catch(IOException ioe) { + System.err.println("Error saving file \"screenshot.png\"."); + } + System.out.println("Screenshot saved to: " + imageFile.getAbsolutePath()); } // Otherwise, print out the key code for the pressed key. else { System.out.printf("Key Code: %d%n", e.getKeyCode()); } } + @Override public void keyTyped(KeyEvent e) { } } } Modified: java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/POccupancyViewer.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/POccupancyViewer.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/POccupancyViewer.java Mon Nov 3 01:04:28 2014 @@ -16,100 +16,93 @@ * @author Kyle McCarty */ public class POccupancyViewer extends PassiveViewer { - private static final long serialVersionUID = 3712604287904215617L; - // Store the number of hits for each crystal. - private long[][] hits; - // Store the total number of events read. - private long events = 0; - // Stores hit objects. - protected ArrayList<EcalHit> hitList = new ArrayList<EcalHit>(); - - /** - * <b>POccupancyViewer</b><br/><br/> - * <code>public <b>POccupancyViewer</b>(int updateRate, boolean resetAtUpdate)</code><br/><br/> + private static final long serialVersionUID = 3712604287904215617L; + // Store the number of hits for each crystal. + private long[][] hits; + // Store the total number of events read. + private long events = 0; + // Stores hit objects. + protected ArrayList<EcalHit> hitList = new ArrayList<EcalHit>(); + + /** * Initializes a <code>Viewer</code> window that displays will * occupancies from a data stream. - */ - public POccupancyViewer() { - // Set the title and scale. - setTitle("HPS Calorimeter Occupancies"); - ecalPanel.setScaleMaximum(1.0); - - // Initialize the hit counts array. - Dimension ecalSize = ecalPanel.getCrystalBounds(); - hits = new long[ecalSize.width][ecalSize.height]; - } + */ + public POccupancyViewer() { + // Set the title and scale. + setTitle("HPS Calorimeter Occupancies"); + ecalPanel.setScaleMaximum(1.0); + + // Initialize the hit counts array. + Dimension ecalSize = ecalPanel.getCrystalBounds(); + hits = new long[ecalSize.width][ecalSize.height]; + } - public void addHit(EcalHit hit) { - // Get the panel coordinates of the hit. - int ix = toPanelX(hit.getX()); - int iy = toPanelY(hit.getY()); - - // Increment the hit count at the indicated location. - hits[ix][iy]++; - } - - /** - * <b>addCluster</b><br/><br/> - * <code>public void <b>addCluster</b>(Cluster cluster)</code><br/><br/> - * Adds a new cluster to the display.<br/><br/> - * <b>Note:</b> This operation is not supported for occupancies. - */ - public void addCluster(Cluster cluster) { } - - /** - * <b>removeHit</b><br/><br/> - * <code>public void <b>removeHit</b>(EcalHit hit)</code><br/><br/> - * Removes a hit from the display. - * @param hit - The hit to be removed. - */ - public void removeHit(EcalHit hit) { - // Get the panel coordinates of the hit. - int ix = toPanelX(hit.getX()); - int iy = toPanelY(hit.getY()); - - // Decrement the hit count at the indicated location. - hits[ix][iy]--; - } - - public void resetDisplay() { hitList.clear(); } - - /** - * <b>incrementEventCount</b><br/><br/> - * <code>public void <b>incrementEventCount</b>(int amount)</code><br/><br/> - * Increments the number of events represented by the current data - * set by the indicated amount. Note that this may be negative to - * reduce the number of events. - * @param amount - The number of events to add. - */ - public void incrementEventCount(int amount) { events += amount; } - - /** - * <b>updateDisplay</b><br/><br/> - * <code>public void <b>updateDisplay</b>()</code><br/><br/> - * Displays the hits and clusters added by the <code>addHit</code> - * and <code>addCluster</code> methods. - */ - public void updateDisplay() { + @Override + public void addHit(EcalHit hit) { + // Get the panel coordinates of the hit. + int ix = toPanelX(hit.getX()); + int iy = toPanelY(hit.getY()); + + // Increment the hit count at the indicated location. + hits[ix][iy]++; + } + + /** + * Adds a new cluster to the display.<br/><br/> + * <b>Note:</b> This operation is not supported for occupancies. + */ + public void addCluster(Cluster cluster) { } + + /** + * Removes a hit from the display. + * @param hit - The hit to be removed. + */ + public void removeHit(EcalHit hit) { + // Get the panel coordinates of the hit. + int ix = toPanelX(hit.getX()); + int iy = toPanelY(hit.getY()); + + // Decrement the hit count at the indicated location. + hits[ix][iy]--; + } + + @Override + public void resetDisplay() { hitList.clear(); } + + /** + * Increments the number of events represented by the current data + * set by the indicated amount. Note that this may be negative to + * reduce the number of events. + * @param amount - The number of events to add. + */ + public void incrementEventCount(int amount) { events += amount; } + + /** + * Displays the hits and clusters added by the <code>addHit</code> + * and <code>addCluster</code> methods. + */ + @Override + public void updateDisplay() { // Build a "hit list" from the occupancies. for(int x = 0; x < hits.length; x++) { - for(int y = 0; y < hits[0].length; y++) { - // Don't bother performing calculations or building - // any objects if there are zero hits. - if(hits[x][y] != 0) { - // Define the crystal ID and "energy." - Point cid = new Point(x, y); - double occupancy = ((double) hits[x][y]) / events; - - // Add a "hit" formed from these values. - hitList.add(new EcalHit(cid, occupancy)); - } - } + for(int y = 0; y < hits[0].length; y++) { + // Don't bother performing calculations or building + // any objects if there are zero hits. + if(hits[x][y] != 0) { + // Define the crystal ID and "energy." + Point cid = new Point(x, y); + double occupancy = ((double) hits[x][y]) / events; + + // Add a "hit" formed from these values. + hitList.add(new EcalHit(cid, occupancy)); + } + } } - // Suppress the calorimeter panel's redrawing. - ecalPanel.setSuppressRedraw(true); - + // Suppress the calorimeter panel's redrawing. + ecalPanel.setSuppressRedraw(true); + // Display the hits. for (EcalHit h : hitList) { int ix = toPanelX(h.getX()); @@ -123,5 +116,5 @@ // Update the status panel to account for the new event. updateStatusPanel(); - } + } } Modified: java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PassiveViewer.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PassiveViewer.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/PassiveViewer.java Mon Nov 3 01:04:28 2014 @@ -20,94 +20,94 @@ * @author Kyle McCarty */ public abstract class PassiveViewer extends Viewer { - private static final long serialVersionUID = -7479125553259270894L; - // Stores whether the background color is set or not. - private boolean background = false; - - /** - * <b>PassiveViewer</b><br/><br/> - * <code>public <b>PassiveViewer</b>(String... fieldValues)</code><br/><br/> - * @param fieldValues - */ - public PassiveViewer(String... fieldValues) { - // Pass the field values to the superclass. - super(fieldValues); - - // Set the key bindings. - addKeyListener(new EcalKeyListener()); - } - - /** - * <b>addHit</b><br/><br/> - * <code>public void <b>addHit</b>(EcalHit hit)</code><br/><br/> - * Adds a new hit to the display. - * @param hit - The hit to be added. - */ - public abstract void addHit(EcalHit hit); - - /** - * <b>addCluster</b><br/><br/> - * <code>public void <b>addCluster</b>(Cluster cluster)</code><br/><br/> - * Adds a new cluster to the display. - * @param cluster - The cluster to be added. - */ - public abstract void addCluster(Cluster cluster); - - /** - * <b>resetDisplay</b><br/><br/> - * <code>public void <b>resetDisplay</b>()</code><br/><br/> - * Clears any hits or clusters that have been added to the viewer. - * Note that this does not automatically update the displayed panel. - * <code>updateDisplay</code> must be called separately. - */ - public abstract void resetDisplay(); - - /** - * <b>setScale</b><br/><br/> - * <code>public void <b>setScale</b>(int min, int max)</code><br/><br/> - * Sets the upper and lower bounds of for the calorimeter display's - * color mapping scale. - * @param min - The lower bound. - * @param max - The upper bound. - */ - public void setScale(int min, int max) { - ecalPanel.setScaleMinimum(min); - ecalPanel.setScaleMaximum(max); - } - - /** - * <b>setScaleMaximum</b><br/><br/> - * <code>public void <b>setScaleMaximum</b>(int max)</code><br/><br/> - * Sets the upper bound for the calorimeter display's color mapping - * scale. - * @param max - The upper bound. - */ - public void setScaleMaximum(int max) { ecalPanel.setScaleMaximum(max); } - - /** - * <b>setScaleMinimum</b><br/><br/> - * <code>public void <b>setScaleMinimum</b>(int min)</code><br/><br/> - * Sets the lower bound for the calorimeter display's color mapping - * scale. - * @param min - The lower bound. - */ - public void setScaleMinimum(int min) { ecalPanel.setScaleMinimum(min); } - - /** - * <b>updateDisplay</b><br/><br/> - * <code>public void <b>updateDisplay</b>()</code><br/><br/> - * Displays the hits and clusters added by the <code>addHit</code> - * and <code>addCluster</code> methods. - */ - public abstract void updateDisplay(); - + private static final long serialVersionUID = -7479125553259270894L; + // Stores whether the background color is set or not. + private boolean background = false; + + /** + * <b>PassiveViewer</b><br/><br/> + * <code>public <b>PassiveViewer</b>(String... fieldValues)</code><br/><br/> + * @param fieldValues + */ + public PassiveViewer() { + // Initialize the superclass. + super(); + + // Set the key bindings. + addKeyListener(new EcalKeyListener()); + } + + /** + * <b>addHit</b><br/><br/> + * <code>public void <b>addHit</b>(EcalHit hit)</code><br/><br/> + * Adds a new hit to the display. + * @param hit - The hit to be added. + */ + public abstract void addHit(EcalHit hit); + + /** + * <b>addCluster</b><br/><br/> + * <code>public void <b>addCluster</b>(Cluster cluster)</code><br/><br/> + * Adds a new cluster to the display. + * @param cluster - The cluster to be added. + */ + public abstract void addCluster(Cluster cluster); + + /** + * <b>resetDisplay</b><br/><br/> + * <code>public void <b>resetDisplay</b>()</code><br/><br/> + * Clears any hits or clusters that have been added to the viewer. + * Note that this does not automatically update the displayed panel. + * <code>updateDisplay</code> must be called separately. + */ + public abstract void resetDisplay(); + + /** + * <b>setScale</b><br/><br/> + * <code>public void <b>setScale</b>(int min, int max)</code><br/><br/> + * Sets the upper and lower bounds of for the calorimeter display's + * color mapping scale. + * @param min - The lower bound. + * @param max - The upper bound. + */ + public void setScale(int min, int max) { + ecalPanel.setScaleMinimum(min); + ecalPanel.setScaleMaximum(max); + } + + /** + * <b>setScaleMaximum</b><br/><br/> + * <code>public void <b>setScaleMaximum</b>(int max)</code><br/><br/> + * Sets the upper bound for the calorimeter display's color mapping + * scale. + * @param max - The upper bound. + */ + public void setScaleMaximum(int max) { ecalPanel.setScaleMaximum(max); } + + /** + * <b>setScaleMinimum</b><br/><br/> + * <code>public void <b>setScaleMinimum</b>(int min)</code><br/><br/> + * Sets the lower bound for the calorimeter display's color mapping + * scale. + * @param min - The lower bound. + */ + public void setScaleMinimum(int min) { ecalPanel.setScaleMinimum(min); } + + /** + * <b>updateDisplay</b><br/><br/> + * <code>public void <b>updateDisplay</b>()</code><br/><br/> + * Displays the hits and clusters added by the <code>addHit</code> + * and <code>addCluster</code> methods. + */ + public abstract void updateDisplay(); + /** * The <code>EcalListener</code> class binds keys to actions. * Bound actions include: * b :: Toggle color-mapping for 0 energy crystals * h :: Toggle selected crystal highlighting * l :: Toggle logarithmic versus linear scaling - * s :: Saves the current display to a file + * s :: Saves the current display to a file **/ private class EcalKeyListener implements KeyListener { public void keyPressed(KeyEvent e) { } @@ -115,9 +115,9 @@ public void keyReleased(KeyEvent e) { // 'b' toggles the default white background. if(e.getKeyCode() == 66) { - if(background) { ecalPanel.setDefaultCrystalColor(null); } - else { ecalPanel.setDefaultCrystalColor(Color.GRAY); } - background = !background; + if(background) { ecalPanel.setDefaultCrystalColor(null); } + else { ecalPanel.setDefaultCrystalColor(Color.GRAY); } + background = !background; } // 'h' toggles highlighting the crystal under the cursor. @@ -125,33 +125,33 @@ // 'l' toggles linear or logarithmic scaling. else if(e.getKeyCode() == 76) { - if(ecalPanel.isScalingLinear()) { ecalPanel.setScalingLogarithmic(); } - else { ecalPanel.setScalingLinear(); } + if(ecalPanel.isScalingLinear()) { ecalPanel.setScalingLogarithmic(); } + else { ecalPanel.setScalingLinear(); } } // 's' saves the panel to a file. else if(e.getKeyCode() == 83) { - // Make a new buffered image on which to draw the content pane. - BufferedImage screenshot = new BufferedImage(getContentPane().getWidth(), - getContentPane().getHeight(), BufferedImage.TYPE_INT_ARGB); - - // Paint the content pane to image. - getContentPane().paint(screenshot.getGraphics()); - - // Get the lowest available file name. - int fileNum = 0; - File imageFile = new File("screenshot_" + fileNum + ".png"); - while(imageFile.exists()) { - fileNum++; - imageFile = new File("screenshot_" + fileNum + ".png"); - } - - // Save the image to a PNG file. - try { ImageIO.write(screenshot, "PNG", imageFile); } - catch(IOException ioe) { - System.err.println("Error saving file \"screenshot.png\"."); - } - System.out.println("Screenshot saved to: " + imageFile.getAbsolutePath()); + // Make a new buffered image on which to draw the content pane. + BufferedImage screenshot = new BufferedImage(getContentPane().getWidth(), + getContentPane().getHeight(), BufferedImage.TYPE_INT_ARGB); + + // Paint the content pane to image. + getContentPane().paint(screenshot.getGraphics()); + + // Get the lowest available file name. + int fileNum = 0; + File imageFile = new File("screenshot_" + fileNum + ".png"); + while(imageFile.exists()) { + fileNum++; + imageFile = new File("screenshot_" + fileNum + ".png"); + } + + // Save the image to a PNG file. + try { ImageIO.write(screenshot, "PNG", imageFile); } + catch(IOException ioe) { + System.err.println("Error saving file \"screenshot.png\"."); + } + System.out.println("Screenshot saved to: " + imageFile.getAbsolutePath()); } // Otherwise, print out the key code for the pressed key. Modified: java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/StatusPanel.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/StatusPanel.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/ecal-event-display/src/main/java/org/hps/monitoring/ecal/eventdisplay/ui/StatusPanel.java Mon Nov 3 01:04:28 2014 @@ -9,188 +9,180 @@ /** * Class <code>StatusPanel</code> displays text in a set of fields. + * This class is being phased out in favor of <code>ResizableFieldPanel + * </code> and should no longer be used. It will be removed next update. * * @author Kyle McCarty */ +@Deprecated public class StatusPanel extends JPanel { - private static final long serialVersionUID = -8353479383875379010L; - // The panel that displays behind the status field. - private BackPanel background = new BackPanel(); - // The status fields. The first array index represents which status - // field and the second is always of size two, with index 0 mapping - // to the label that displays the field name and index 1 mapping to - // the label displaying the field value. - private JLabel[][] field; - // Spacing variables for panel layout. - private int leftBuffer = 10; - private int upperBuffer = 10; - - /** - * <b>NULL_VALUE</b><br/><br/> - * <code><b>static final String <b>NULL_VALUE</b></code><br/><br/> - * A <code>String</code> representing the default value to be - * displayed on the status panel whenever there is no value for - * that field. - */ - static final String NULL_VALUE = "---"; - - /** - * <b>StatusPanel</b><br/><br/> - * <code>public <b>StatusPanel</b>(String... fieldName)</code><br/><br/> - * Creates a new status panel with display fields with the indicated - * names. They will be assigned a field index in the order that they - * are given starting with zero. - * @param fieldName - The names of the fields to display. - */ - public StatusPanel(String... fieldName) { - // Initialize the component. - super(); - - // Set the layout manager to manual. - setLayout(null); - - // Build the text fields. - int curZ = 0; - field = new JLabel[fieldName.length][2]; - for(int i = 0; i < field.length; i++) { - for(int j = 0; j < field[i].length; j++) { - field[i][j] = new JLabel(); - field[i][j].setOpaque(true); - field[i][j].setBackground(Color.WHITE); - add(field[i][j]); - setComponentZOrder(field[i][j], curZ); - curZ++; - } - field[i][0].setText(fieldName[i] + ": "); - field[i][0].setHorizontalAlignment(JLabel.RIGHT); - } - - // Start the fields as null by default. - clearValues(); - - // Build the background panel. - add(background); - setComponentZOrder(background, curZ); - } - - /** - * <b>clearValues</b><br/><br/> - * <code>public void <b>clearValues</b>()</code><br/><br/> - * Sets all of the fields on the status display to the null value. - */ - public void clearValues() { - for(int i = 0; i < field.length; i++) { - field[i][1].setText(NULL_VALUE); - } - } - - /** - * <b>setFieldValue</b><br/><br/> - * Sets the value of the indicated field. - * @param index - The field's index. - * @param value - The new value to display. - * @throws IndexOutOfBoundsException Occurs when the field index - * is neither more than the existing number of fields or is negative. - */ - public void setFieldValue(int index, String value) throws IndexOutOfBoundsException { - if(index >= 0 && index < field.length) { - if(value == null) { field[index][1].setText(NULL_VALUE); } - else { field[index][1].setText(value); } - } - else { throw new IndexOutOfBoundsException("Invalid field index."); } - } - - public void setSize(int width, int height) { - super.setSize(width, height); - resize(); - } - - public void setSize(Dimension d) { - super.setSize(d); - resize(); - } - - /** - *<b>getNextX</b><br/><br/> - * <code>private int <b>getNextX</b>(Component c)</code><br/><br/> - * Finds the x-coordinate immediately after the component. - * @param c - The component of which to find the end. - * @return Returns the x-coordinate at the end of the component. - */ - private final static int getNextX(Component c) { return getNextX(c, 0); } - - /** - /** - *<b>getNextX</b><br/><br/> - * <code>private int <b>getNextX</b>(Component c, int buffer)</code><br/><br/> - * Finds the x-coordinate after the component with a given buffer. - * @param c - The component of which to find the end. - * @param buffer - The extra space after the component to be included. - * @return Returns the x-coordinate at the end of the component, - * with a buffer length. - */ - private final static int getNextX(Component c, int buffer) { - return c.getX() + c.getWidth() + buffer; - } - - /** - * <b>resize</b><br/><br/> - * <code>private void <b>resize</b>()</code><br/><br/> - * Updates the layout of the component to the panel's current size. - */ - private void resize() { - // Define the width an height as convenience variables. - int width = getWidth(); - int height = getHeight(); - - // Size the background panel. - background.setBounds(0, 0, width, height); - - // Size and place the text labels. - if(field.length != 0) { - int labelHeight = (height - (int)(upperBuffer + 5)) / 3; - int labelRem = (height - upperBuffer - 8) % field.length; - int curX = leftBuffer; - int curY = (int)(upperBuffer + 2); - for(int i = 0; i < field.length; i++) { - // Determine the appropriate field height. - int thisHeight = labelHeight; - if(labelRem > 0) { - thisHeight++; - labelRem--; - } - - // Place the field. - field[i][0].setBounds(curX, curY, 130, thisHeight); - field[i][1].setBounds(getNextX(field[i][0]), curY, 75, thisHeight); - - // If we have written three labels, then start a new column. - if(i % 3 == 2) { - curX = getNextX(field[i][1], 10); - curY = (int)(upperBuffer + 2); - } - - // Otherwise just increment the current height. - else { curY += thisHeight; } - } - } - } - - /** - * Class <code>BackPanel</code> simply renders the background panel - * for the status panel. - */ - private class BackPanel extends JPanel { - private static final long serialVersionUID = 4997805650267243080L; + private static final long serialVersionUID = -8353479383875379010L; + // The panel that displays behind the status field. + private BackPanel background = new BackPanel(); + // The status fields. The first array index represents which status + // field and the second is always of size two, with index 0 mapping + // to the label that displays the field name and index 1 mapping to + // the label displaying the field value. + private JLabel[][] field; + // Spacing variables for panel layout. + private int leftBuffer = 10; + private int upperBuffer = 10; + + /** + * A <code>String</code> representing the default value to be + * displayed on the status panel whenever there is no value for + * that field. + */ + static final String NULL_VALUE = "---"; + + /** + * Creates a new status panel with display fields with the indicated + * names. They will be assigned a field index in the order that they + * are given starting with zero. + * @param fieldName - The names of the fields to display. + */ + public StatusPanel(String... fieldName) { + // Initialize the component. + super(); + + // Set the layout manager to manual. + setLayout(null); + + // Build the text fields. + int curZ = 0; + field = new JLabel[fieldName.length][2]; + for(int i = 0; i < field.length; i++) { + for(int j = 0; j < field[i].length; j++) { + field[i][j] = new JLabel(); + field[i][j].setOpaque(true); + field[i][j].setBackground(Color.WHITE); + add(field[i][j]); + setComponentZOrder(field[i][j], curZ); + curZ++; + } + field[i][0].setText(fieldName[i] + ": "); + field[i][0].setHorizontalAlignment(JLabel.RIGHT); + } + + // Start the fields as null by default. + clearValues(); + + // Build the background panel. + add(background); + setComponentZOrder(background, curZ); + } + + /** + * Sets all of the fields on the status display to the null value. + */ + public void clearValues() { + for(int i = 0; i < field.length; i++) { + field[i][1].setText(NULL_VALUE); + } + } + + /** + * Sets the value of the indicated field. + * @param index - The field's index. + * @param value - The new value to display. + * @throws IndexOutOfBoundsException Occurs when the field index + * is neither more than the existing number of fields or is negative. + */ + public void setFieldValue(int index, String value) throws IndexOutOfBoundsException { + if(index >= 0 && index < field.length) { + if(value == null) { field[index][1].setText(NULL_VALUE); } + else { field[index][1].setText(value); } + } + else { throw new IndexOutOfBoundsException("Invalid field index."); } + } + + @Override + public void setSize(int width, int height) { + super.setSize(width, height); + resize(); + } + + @Override + public void setSize(Dimension d) { + super.setSize(d); + resize(); + } + + /** + * Finds the x-coordinate immediately after the component. + * @param c - The component of which to find the end. + * @return Returns the x-coordinate at the end of the component. + */ + private final static int getNextX(Component c) { return getNextX(c, 0); } + + /** + /** + * Finds the x-coordinate after the component with a given buffer. + * @param c - The component of which to find the end. + * @param buffer - The extra space after the component to be included. + * @return Returns the x-coordinate at the end of the component, + * with a buffer length. + */ + private final static int getNextX(Component c, int buffer) { + return c.getX() + c.getWidth() + buffer; + } + + /** + * Updates the layout of the component to the panel's current size. + */ + private void resize() { + // Define the width an height as convenience variables. + int width = getWidth(); + int height = getHeight(); + + // Size the background panel. + background.setBounds(0, 0, width, height); + + // Size and place the text labels. + if(field.length != 0) { + int labelHeight = (height - (int)(upperBuffer + 5)) / 3; + int labelRem = (height - upperBuffer - 8) % field.length; + int curX = leftBuffer; + int curY = (int)(upperBuffer + 2); + for(int i = 0; i < field.length; i++) { + // Determine the appropriate field height. + int thisHeight = labelHeight; + if(labelRem > 0) { + thisHeight++; + labelRem--; + } + + // Place the field. + field[i][0].setBounds(curX, curY, 130, thisHeight); + field[i][1].setBounds(getNextX(field[i][0]), curY, 75, thisHeight); + + // If we have written three labels, then start a new column. + if(i % 3 == 2) { + curX = getNextX(field[i][1], 10); + curY = (int)(upperBuffer + 2); + } + + // Otherwise just increment the current height. + else { curY += thisHeight; } + } + } + } + + /** + * Class <code>BackPanel</code> simply renders the background panel + * for the status panel. + */ + private class BackPanel extends JPanel { + private static final long serialVersionUID = 4997805650267243080L; - public void paint(Graphics g) { - // Render the panel background. - g.setColor(Color.WHITE); - g.fillRect(0, upperBuffer, getWidth(), getHeight() - upperBuffer); - g.setColor(Color.GRAY); - g.drawRect(0, upperBuffer, getWidth() - 1, getHeight() - upperBuffer - 1); - g.setColor(Color.LIGHT_GRAY); - g.drawRect(1, upperBuffer + 1, getWidth() - 3, getHeight() - upperBuffer - 3); - } - } + public void paint(Graphics g) { + // Render the panel background. + g.setColor(Color.WHITE); + g.fillRect(0, upperBuffer, getWidth(), getHeight() - upperBuffer); + g.setColor(Color.GRAY); + g.drawRect(0, upperBuffer, getWidth() - 1, getHeight() - upperBuffer - 1); + g.setColor(Color.LIGHT_GRAY); + g.drawRect(1, upperBuffer + 1, getWidth() - 3, getHeight() - upperBuffer - 3); + } + } } Modified: java/branches/hps_java_trunk_HPSJAVA-255/ecal-readout-sim/pom.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/ecal-readout-sim/pom.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/ecal-readout-sim/pom.xml Mon Nov 3 01:04:28 2014 @@ -8,7 +8,7 @@ <groupId>org.hps</groupId> <artifactId>hps-parent</artifactId> <relativePath>../parent/pom.xml</relativePath> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <scm> <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/ecal-readout-sim/</url> Modified: java/branches/hps_java_trunk_HPSJAVA-255/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCPrimaryTriggerDriver.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCPrimaryTriggerDriver.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/ecal-readout-sim/src/main/java/org/hps/readout/ecal/FADCPrimaryTriggerDriver.java Mon Nov 3 01:04:28 2014 @@ -21,7 +21,8 @@ * The code for generating trigger pairs and handling the coincidence * window comes from <code>FADCTriggerDriver</code>. * - * @author Kyle McCarty + * @author Kyle McCarty <[log in to unmask]> + * @author Sho Uemura <[log in to unmask]> * @see FADCTriggerDriver */ public class FADCPrimaryTriggerDriver extends TriggerDriver { @@ -46,7 +47,7 @@ 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 int backgroundLevel = -1; // Automatically sets the cuts to achieve a predetermined background rate. // ================================================================== // ==== Driver Internal Variables =================================== @@ -94,7 +95,16 @@ IHistogram2D clusterDistributionSingle = aida.histogram2D("Trigger Plots :: Cluster Seed Distribution (Passed Single Cuts)", 46, -23, 23, 11, -5.5, 5.5); IHistogram2D clusterDistributionAll = aida.histogram2D("Trigger Plots :: Cluster Seed Distribution (Passed All Cuts)", 46, -23, 23, 11, -5.5, 5.5); - IHistogram1D hotCrystalEnergy = aida.histogram1D("Trigger Plots :: Hot Crystal Energy Distribution", 176, 0.0, 2.2); + // ================================================================== + // ==== Hardware Diagnostic Variables =============================== + // ================================================================== + IHistogram2D diagClusters = aida.histogram2D("Diagnostic Plots :: Cluster Seed Distribution", 46, -23, 23, 11, -5.5, 5.5); + IHistogram1D diagHitCount = aida.histogram1D("Diagnostic Plots :: Cluster Hit Count Distribution", 9, 1, 10); + IHistogram1D diagTotalEnergy = aida.histogram1D("Diagnostic Plots :: Cluster Total Energy Distribution", 176, 0.0, 2.2); + // TODO: Implement cluster latency plot. + + private boolean verbose = false; + /** * Prints out the results of the trigger at the end of the run. @@ -118,6 +128,19 @@ System.out.printf("%n"); System.out.printf("\tTrigger Count :: %d%n", numTriggers); + // Print the trigger cuts. + System.out.printf("%nCut Values:%n"); + System.out.printf("\tSeed Energy Low :: %.2f%n", seedEnergyLow); + System.out.printf("\tSeed Energy High :: %.2f%n", seedEnergyHigh); + System.out.printf("\tCluster Energy Low :: %.2f%n", clusterEnergyLow); + System.out.printf("\tCluster Energy High :: %.2f%n", clusterEnergyHigh); + System.out.printf("\tCluster Hit Count :: %d%n", minHitCount); + System.out.printf("\tPair Energy Sum Low :: %.2f%n", energySumLow); + System.out.printf("\tPair Energy Sum High :: %.2f%n", energySumHigh); + System.out.printf("\tPair Energy Difference :: %.2f%n", energyDifferenceHigh); + System.out.printf("\tPair Energy Slope :: %.2f%n", energySlopeLow); + System.out.printf("\tPair Coplanarity :: %.2f%n", coplanarityHigh); + // Run the superclass method. super.endOfData(); } @@ -151,10 +174,9 @@ int ix = cluster.getSeedHit().getIdentifierFieldValue("ix"); int iy = cluster.getSeedHit().getIdentifierFieldValue("iy"); - // If the cluster is in the "hot" region, write out its - // energy to a special plot. - if((iy == 1 || iy == -1) && (ix == -1 || ix == 1 || ix == 2)) { - hotCrystalEnergy.fill(clusterEnergy, 1); + // VERBOSE :: Note that a cluster is being processed. + if(verbose) { + System.out.printf("%nProcessing cluster at (% 2d, % 2d)%n", ix, iy); } // Correct for "hole" on the x-axis for plotting. @@ -174,8 +196,18 @@ clusterDistribution100.fill(ix, iy, 1); } + // Populate the diagnostic plots. + diagClusters.fill(ix, iy, 1); + diagTotalEnergy.fill(clusterEnergy, 1); + diagHitCount.fill(hitCount, 1); + // ==== Seed Hit Energy Cut ==================================== // ============================================================= + // VERBOSE :: Print the seed energy comparison check. + if(verbose) { + System.out.printf("\tSeed Energy Cut :: %.3f < %.3f < %.3f --> %b%n", seedEnergyLow, seedEnergy, seedEnergyHigh, clusterSeedEnergyCut(cluster)); + } + // If the cluster fails the cut, skip to the next cluster. if(!clusterSeedEnergyCut(cluster)) { continue clusterLoop; } @@ -184,6 +216,11 @@ // ==== Cluster Hit Count Cut ================================== // ============================================================= + // VERBOSE :: Print the hit count comparison check. + if(verbose) { + System.out.printf("\tHit Count Cut :: %d >= %d --> %b%n", hitCount, minHitCount, clusterHitCountCut(cluster)); + } + // If the cluster fails the cut, skip to the next cluster. if(!clusterHitCountCut(cluster)) { continue clusterLoop; } @@ -192,6 +229,11 @@ // ==== Cluster Total Energy Cut =============================== // ============================================================= + // VERBOSE :: Print the cluster energy comparison check. + if(verbose) { + System.out.printf("\tCluster Energy Cut :: %.3f < %.3f < %.3f --> %b%n", clusterEnergyLow, clusterEnergy, clusterEnergyHigh, clusterTotalEnergyCut(cluster)); + } + // If the cluster fails the cut, skip to the next cluster. if(!clusterTotalEnergyCut(cluster)) { continue clusterLoop; } @@ -661,7 +703,7 @@ private void setBackgroundCuts(int backgroundLevel) { // Make sure that the background level is valid. - if(backgroundLevel < 1 || backgroundLevel > 10) { + if(backgroundLevel < 0 || backgroundLevel > 10) { throw new RuntimeException(String.format("Trigger cuts are undefined for background level %d.", backgroundLevel)); } @@ -761,6 +803,17 @@ energySlopeLow = 0.5; coplanarityHigh = 65; minHitCount = 2; + } else if(backgroundLevel == 0) { + seedEnergyLow = 0.100; + seedEnergyHigh = 6.6; + clusterEnergyLow = 0.100; + clusterEnergyHigh = 1.500; + energySumLow = 0.000; + energySumHigh = 1.900; + energyDifferenceHigh = 2.200; + energySlopeLow = 1.10; + coplanarityHigh = 35; + minHitCount = 1; } } Modified: java/branches/hps_java_trunk_HPSJAVA-255/ecal-readout-sim/src/main/java/org/hps/readout/ecal/MollerTriggerDriver.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/ecal-readout-sim/src/main/java/org/hps/readout/ecal/MollerTriggerDriver.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/ecal-readout-sim/src/main/java/org/hps/readout/ecal/MollerTriggerDriver.java Mon Nov 3 01:04:28 2014 @@ -30,7 +30,7 @@ * supports a verbose mode where it will output more details with every * event to help with diagnostics. * - * @author Kyle McCarty + * @author Kyle McCarty <[log in to unmask]> */ public class MollerTriggerDriver extends TriggerDriver { @@ -55,7 +55,10 @@ } @Override - public void process(EventHeader event) { super.process(event); } + public void process(EventHeader event) { + // Run the superclass process event. + super.process(event); + } @Override public void startOfData() { @@ -74,20 +77,39 @@ // Initialize the seed distribution diagnostic plots. clusterDistribution = aida.histogram2D("Trigger Plots :: Cluster Seed Distribution", 46, -23, 23, 11, -5.5, 5.5); aClusterDistribution = aida.histogram2D("Trigger Plots :: Cluster Seed Distribution (Passed All Cuts)", 46, -23, 23, 11, -5.5, 5.5); + clusterDistribution100 = aida.histogram2D("Trigger Plots :: Cluster Seed Distribution (Over 100 MeV)", 46, -23, 23, 11, -5.5, 5.5); // Initialize the seed percentage of cluster energy. seedPercent = aida.histogram1D("Analysis Plots :: Seed Percentage of Total Energy", 400, 0.0, 1.0); + // Initialize the momentum angle plot. + momentumAngle = aida.histogram2D("Trigger Plots :: Particle Momentum Distribution (t = 0)", 500, -0.01, 0.06, 500, -0.04, 0.04); + 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. - // 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)); - } + 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 @@ -139,6 +161,7 @@ clusterTotalEnergy.fill(cluster.getEnergy()); clusterSeedEnergy.fill(cluster.getSeedHit().getCorrectedEnergy()); clusterDistribution.fill(ix > 0 ? ix - 1 : ix, iy, 1); + if(cluster.getSeedHit().getCorrectedEnergy() > 0.100) { clusterDistribution100.fill(ix > 0 ? ix - 1 : ix, iy, 1); } // VERBOSE :: Output the single cluster trigger thresholds. if(verbose) { @@ -178,20 +201,31 @@ // Require that the cluster pass each of the cuts in // order to qualify for a trigger. if(totalEnergyCut && seedEnergyCut && hitCountCut && positionCut) { - // Add the clusters to the cut histograms. - aClusterHitCount.fill(cluster.getCalorimeterHits().size()); - aClusterTotalEnergy.fill(cluster.getEnergy()); - aClusterSeedEnergy.fill(cluster.getSeedHit().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.getSeedHit().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; + } } } @@ -331,6 +365,16 @@ } /** + * Sets the number of events that must pass the trigger before a + * proper trigger flag is thrown. + * @param prescale - The number of passing events before a trigger + * will be thrown. + */ + public void setPrescale(int prescale) { + this.prescale = prescale; + } + + /** * Toggles whether the driver will output its actions to the console * during run time or not. * @param verbose - <code>true</code> indicates that the console @@ -339,6 +383,18 @@ 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 + * region version 2. + * @param useVersionOne - <code>true</code> indicates that version + * 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; + } // ================================================================== // ==== AIDA Plots ================================================== @@ -351,86 +407,85 @@ IHistogram1D clusterHitCount; IHistogram1D clusterSeedEnergy; IHistogram1D clusterTotalEnergy; - IHistogram1D pClusterHitCount; - IHistogram2D pClusterDistribution; - IHistogram1D pClusterSeedEnergy; - IHistogram1D pClusterTotalEnergy; IHistogram1D seedPercent; + IHistogram2D momentumAngle; + IHistogram2D aMomentumAngle; + IHistogram2D clusterDistribution100; // ================================================================== // ==== Variables =================================================== // ================================================================== /** - * <b>aida</b><br/><br/> - * <code>private AIDA <b>aida</b></code><br/><br/> * Factory for generating histograms. */ private AIDA aida = AIDA.defaultInstance(); /** - * <b>allowedSeedSet</b><br/><br/> - * <code>private Set<Point> <b>allowedSeedSet</b></code><br/><br/> * Contains all allowed seed crystal indices. Seeds outside of this * set will be rejected and not produce a trigger. */ private Set<Point> allowedSeedSet = new HashSet<Point>(); /** - * <b>clusterCollectionName</b><br/><br/> - * <code>private String <b>clusterCollectionName</b></code><br/><br/> * The name of the LCIO collection containing <code>HPSEcalCluster * </code> objects. */ private String clusterCollectionName = "EcalClusters"; /** - * <b>clusterHitCountThreshold</b><br/><br/> - * <code>private int <b>clusterHitCountThreshold</b></code><br/><br/> * Defines the minimum number of hits required for a cluster to * be used in triggering. */ - private int clusterHitCountThreshold = 0; - - /** - * <b>clusterSeedEnergyThresholdLow</b><br/><br/> - * <code>private double <b>clusterSeedEnergyThresholdLow</b></code><br/><br/> + private int clusterHitCountThreshold = 5; + + /** * Defines the threshold for the cluster seed energy under which * a cluster will be rejected. */ - private double clusterSeedEnergyThresholdLow = 0.00; - - /** - * <b>clusterSeedEnergyThresholdHigh</b><br/><br/> - * <code>private double <b>clusterSeedEnergyThresholdHigh</b></code><br/><br/> + private double clusterSeedEnergyThresholdLow = 0.300; + + /** * Defines the threshold for the cluster seed energy above which * a cluster will be rejected. */ - private double clusterSeedEnergyThresholdHigh = Double.MAX_VALUE; - - /** - * <b>clusterTotalEnergyThresholdLow</b><br/><br/> - * <code>private double <b>clusterTotalEnergyThreshold</b></code><br/><br/> + private double clusterSeedEnergyThresholdHigh = 0.700; + + /** * Defines the threshold for the total cluster energy under which * a cluster will be rejected. */ - private double clusterTotalEnergyThresholdLow = 0.0; - - /** - * <b>clusterTotalEnergyThresholdHigh</b><br/><br/> - * <code>private double <b>clusterTotalEnergyThresholdHigh</b></code><br/><br/> + private double clusterTotalEnergyThresholdLow = 0.600; + + /** * Defines the threshold for the total cluster energy above which * a cluster will be rejected. */ - private double clusterTotalEnergyThresholdHigh = Double.MAX_VALUE; - - /** - * <b>verbose</b><br/><br/> - * <code>private boolean <b>verbose</b></code><br/><br/> + private double clusterTotalEnergyThresholdHigh = 0.775; + + /** + * The number of events that have passed the trigger cuts. This is + * used to determine when a trigger should be thrown for prescaling. + */ + private int passedEvents = 0; + + /** + * Indicates how many events must pass the trigger cuts before a + * trigger is thrown. + */ + private int prescale = 100; + + /** * Sets whether the driver outputs its clustering decisions to the * console or not. */ private boolean verbose = false; + + /** + * Indicates whether trigger region version 1 or version 2 should + * be used. + */ + private boolean useVersionOne = false; private int triggers = 0; // Track the number of triggers. private int allClusters = 0; // Track the number of clusters processed. Modified: java/branches/hps_java_trunk_HPSJAVA-255/ecal-recon/pom.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/ecal-recon/pom.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/ecal-recon/pom.xml Mon Nov 3 01:04:28 2014 @@ -8,7 +8,7 @@ <groupId>org.hps</groupId> <artifactId>hps-parent</artifactId> <relativePath>../parent/pom.xml</relativePath> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <scm> <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/ecal-recon/</url> Modified: java/branches/hps_java_trunk_HPSJAVA-255/evio/pom.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/evio/pom.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/evio/pom.xml Mon Nov 3 01:04:28 2014 @@ -8,7 +8,7 @@ <groupId>org.hps</groupId> <artifactId>hps-parent</artifactId> <relativePath>../parent/pom.xml</relativePath> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <scm> <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/evio/</url> Modified: java/branches/hps_java_trunk_HPSJAVA-255/integration-tests/pom.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/integration-tests/pom.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/integration-tests/pom.xml Mon Nov 3 01:04:28 2014 @@ -7,7 +7,7 @@ <groupId>org.hps</groupId> <artifactId>hps-parent</artifactId> <relativePath>../parent/pom.xml</relativePath> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <scm> <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/integration-tests/</url> @@ -33,6 +33,8 @@ <exclude>org/hps/TestRunEvioToLcioTest.java</exclude> <exclude>org/hps/TestRunReadoutToEvio.java</exclude> <exclude>org/hps/TestRunReconTest.java</exclude> + <exclude>org/hps/DataQualityMonitorTest.java</exclude> + <exclude>org/hps/EcalReadoutSimTest.java</exclude> </excludes> <redirectTestOutputToFile>true</redirectTestOutputToFile> <trimStackTrace>true</trimStackTrace> @@ -81,6 +83,7 @@ <exclude>org/hps/TestRunEvioToLcioTest.java</exclude> <exclude>org/hps/TestRunReadoutToEvio.java</exclude> <exclude>org/hps/TestRunReconTest.java</exclude> + <exclude>org/hps/DataQualityMonitorTest.java</exclude> </excludes> </configuration> </plugin> Modified: java/branches/hps_java_trunk_HPSJAVA-255/integration-tests/src/test/java/org/hps/HPSTestRunTracker2014GeometryTrackReconTest.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/integration-tests/src/test/java/org/hps/HPSTestRunTracker2014GeometryTrackReconTest.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/integration-tests/src/test/java/org/hps/HPSTestRunTracker2014GeometryTrackReconTest.java Mon Nov 3 01:04:28 2014 @@ -6,12 +6,9 @@ import junit.framework.TestCase; -import org.hps.users.jeremym.MockDataChallengeDiagnosticDriver; -import org.lcsim.event.Cluster; import org.lcsim.event.EventHeader; import org.lcsim.event.ReconstructedParticle; import org.lcsim.event.Track; -import org.lcsim.job.AidaSaveDriver; import org.lcsim.job.JobControlManager; import org.lcsim.util.Driver; import org.lcsim.util.aida.AIDA; @@ -157,7 +154,7 @@ System.out.println(" <nparticles / nevents> = " + ((double)nparticles / (double)nevents)); // check that there is one track per event - assertTrue((Math.abs((double)ntracks / (double)nevents) - 1) < 0.000001); + assertTrue("Failed to find expected number of tracks.",Math.abs(((double)ntracks / (double)nevents) - 1) < 0.000001); System.out.println("CheckDriver compare to following ..."); Modified: java/branches/hps_java_trunk_HPSJAVA-255/integration-tests/src/test/java/org/hps/SimpleSvtReadoutTest.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/integration-tests/src/test/java/org/hps/SimpleSvtReadoutTest.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/integration-tests/src/test/java/org/hps/SimpleSvtReadoutTest.java Mon Nov 3 01:04:28 2014 @@ -50,6 +50,7 @@ job.setup("/org/hps/steering/readout/HPS2014TruthReadoutToLcio.lcsim"); job.setNumberOfEvents(10000); job.getLCSimLoop().add(checker); + job.setNumberOfEvents(1000); job.run(); this.printDebug("=========== Summary ==========="); Modified: java/branches/hps_java_trunk_HPSJAVA-255/monitoring-app/pom.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/monitoring-app/pom.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/monitoring-app/pom.xml Mon Nov 3 01:04:28 2014 @@ -7,7 +7,7 @@ <groupId>org.hps</groupId> <artifactId>hps-parent</artifactId> <relativePath>../parent/pom.xml</relativePath> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <scm> <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/monitoring-app/</url> @@ -124,7 +124,7 @@ <dependency> <groupId>jfreechart-aida-experimental</groupId> <artifactId>jfreechart-aida-experimental</artifactId> - <version>1.3-SNAPSHOT</version> + <version>1.4</version> <exclusions> <exclusion> <groupId>jdom</groupId> Modified: java/branches/hps_java_trunk_HPSJAVA-255/monitoring-app/src/main/java/org/hps/monitoring/gui/MonitoringApplication.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/monitoring-app/src/main/java/org/hps/monitoring/gui/MonitoringApplication.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/monitoring-app/src/main/java/org/hps/monitoring/gui/MonitoringApplication.java Mon Nov 3 01:04:28 2014 @@ -23,6 +23,7 @@ import static org.hps.monitoring.gui.Commands.VALIDATE_DATA_FILE; import static org.hps.monitoring.gui.model.ConfigurationModel.MONITORING_APPLICATION_LAYOUT_PROPERTY; import static org.hps.monitoring.gui.model.ConfigurationModel.SAVE_LAYOUT_PROPERTY; +import hep.aida.jfree.AnalysisFactory; import hep.aida.jfree.plotter.PlotterRegion; import hep.aida.jfree.plotter.PlotterRegionListener; @@ -480,6 +481,7 @@ plotInfoWindow.setCurrentRegion(region); } }); + AnalysisFactory.configure(); } /** Modified: java/branches/hps_java_trunk_HPSJAVA-255/monitoring-app/src/main/java/org/hps/monitoring/subsys/SystemStatusImpl.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/monitoring-app/src/main/java/org/hps/monitoring/subsys/SystemStatusImpl.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/monitoring-app/src/main/java/org/hps/monitoring/subsys/SystemStatusImpl.java Mon Nov 3 01:04:28 2014 @@ -52,7 +52,7 @@ } @Override - public void setStatus(StatusCode code, String message) { + synchronized public void setStatus(StatusCode code, String message) { if (isActive()) { this.code = code; this.message = message; @@ -74,7 +74,7 @@ /** * Notify listeners of changes to the system status. */ - void notifyListeners() { + synchronized void notifyListeners() { for (SystemStatusListener listener : listeners) { listener.statusChanged(this); } Modified: java/branches/hps_java_trunk_HPSJAVA-255/monitoring-drivers/pom.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/monitoring-drivers/pom.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/monitoring-drivers/pom.xml Mon Nov 3 01:04:28 2014 @@ -7,7 +7,7 @@ <groupId>org.hps</groupId> <artifactId>hps-parent</artifactId> <relativePath>../parent/pom.xml</relativePath> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <scm> <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/monitoring-drivers/</url> Modified: java/branches/hps_java_trunk_HPSJAVA-255/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/example/DummyErrorDriver.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/example/DummyErrorDriver.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/example/DummyErrorDriver.java Mon Nov 3 01:04:28 2014 @@ -15,19 +15,19 @@ boolean throwStartOfData = false; boolean throwDetectorChanged = false; - public void throwProcess(boolean throwProcess) { + public void setThrowProcess(boolean throwProcess) { this.throwProcess = throwProcess; } - public void throwEndOfData(boolean throwEndOfData) { + public void setThrowEndOfData(boolean throwEndOfData) { this.throwEndOfData = throwEndOfData; } - public void throwStartOfData(boolean throwStartOfData) { + public void setThrowStartOfData(boolean throwStartOfData) { this.throwStartOfData = throwStartOfData; } - public void throwDetectorChanged(boolean throwDetectorChanged) { + public void setThrowDetectorChanged(boolean throwDetectorChanged) { this.throwDetectorChanged = throwDetectorChanged; } Modified: java/branches/hps_java_trunk_HPSJAVA-255/parent/pom.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/parent/pom.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/parent/pom.xml Mon Nov 3 01:04:28 2014 @@ -6,14 +6,15 @@ <groupId>org.hps</groupId> <artifactId>hps-parent</artifactId> <packaging>pom</packaging> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> <name>parent</name> <description>HPS Java parent POM</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <org.lcsim.cacheDir>${user.home}</org.lcsim.cacheDir> - <lcsimVersion>3.0.7-SNAPSHOT</lcsimVersion> + <lcsimVersion>3.0.8-SNAPSHOT</lcsimVersion> <skipSite>false</skipSite> + <skipPlugin>false</skipPlugin> </properties> <scm> <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/parent/</url> @@ -72,10 +73,28 @@ <artifactId>junit</artifactId> <version>4.11</version> </dependency> + <!-- + <dependency> + <groupId>dom4j</groupId> + <artifactId>dom4j</artifactId> + <version>1.6.1</version> + <scope>provided</scope> + </dependency> + --> <dependency> <groupId>org.lcsim</groupId> <artifactId>lcsim-distribution</artifactId> <version>${lcsimVersion}</version> + <exclusions> + <exclusion> + <groupId>jdom</groupId> + <artifactId>jdom</artifactId> + </exclusion> + <exclusion> + <groupId>commons-math</groupId> + <artifactId>commons-math</artifactId> + </exclusion> + </exclusions> </dependency> </dependencies> <!-- DO NOT EDIT THESE DEPENDENCY VERSIONS MANUALLY. --> @@ -84,82 +103,82 @@ <dependency> <groupId>org.hps</groupId> <artifactId>hps-util</artifactId> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.hps</groupId> <artifactId>hps-detector-data</artifactId> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.hps</groupId> <artifactId>hps-conditions</artifactId> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.hps</groupId> <artifactId>hps-ecal-recon</artifactId> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.hps</groupId> <artifactId>hps-ecal-readout-sim</artifactId> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.hps</groupId> <artifactId>hps-tracking</artifactId> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.hps</groupId> <artifactId>hps-evio</artifactId> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.hps</groupId> <artifactId>hps-recon</artifactId> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.hps</groupId> <artifactId>hps-analysis</artifactId> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.hps</groupId> <artifactId>hps-monitoring-drivers</artifactId> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.hps</groupId> <artifactId>hps-monitoring-app</artifactId> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.hps</groupId> <artifactId>hps-users</artifactId> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.hps</groupId> <artifactId>hps-steering-files</artifactId> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.hps</groupId> <artifactId>hps-distribution</artifactId> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.hps</groupId> <artifactId>hps-ecal-event-display</artifactId> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.hps</groupId> <artifactId>hps-record-util</artifactId> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </dependency> </dependencies> </dependencyManagement> @@ -200,11 +219,11 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-report-plugin</artifactId> - <version>2.16</version> + <version>2.17</version> </plugin> <plugin> <artifactId>maven-resources-plugin</artifactId> - <version>2.6</version> + <version>2.7</version> </plugin> </plugins> </reporting> @@ -222,7 +241,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-site-plugin</artifactId> - <version>3.3</version> + <version>3.4</version> <configuration> <chmod>false</chmod> <skip>${skipSite}</skip> @@ -266,14 +285,14 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-scm-plugin</artifactId> - <version>1.8.1</version> + <version>1.9.2</version> <configuration> <connectionType>connection</connectionType> </configuration> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> - <version>3.1</version> + <version>3.2</version> <configuration> <source>1.7</source> <target>1.7</target> @@ -284,8 +303,11 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> - <version>2.16</version> + <version>2.17</version> <configuration> +<!-- + <disableXmlReport>true</disableXmlReport> +--> <argLine>-Xmx1024m</argLine> <forkMode>pertest</forkMode> <!-- This allows the cacheDir to be overridden by settings.xml, @@ -301,7 +323,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> - <version>2.4.2</version> + <version>2.5.1</version> <configuration> <tagBase>svn://svn.freehep.org/hps/java/tags/</tagBase> </configuration> @@ -309,7 +331,6 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> - <version>1.7</version> <executions> <execution> <phase>generate-test-resources</phase> @@ -328,7 +349,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> - <version>2.2</version> + <version>2.3</version> </plugin> </plugins> </build> @@ -462,4 +483,15 @@ <system>Jenkins</system> <url>http://srs.slac.stanford.edu/hudson/view/HPS/</url> </ciManagement> + <profiles> + <profile> + <id>no-plugin</id> + <activation> + <activeByDefault>false</activeByDefault> + </activation> + <properties> + <skipPlugin>true</skipPlugin> + </properties> + </profile> + </profiles> </project> Modified: java/branches/hps_java_trunk_HPSJAVA-255/plugin/pom.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/plugin/pom.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/plugin/pom.xml Mon Nov 3 01:04:28 2014 @@ -7,7 +7,7 @@ <groupId>org.hps</groupId> <artifactId>hps-parent</artifactId> <relativePath>../parent/pom.xml</relativePath> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <scm> <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/plugin/</url> @@ -30,6 +30,7 @@ <artifactId>freehep-jas-plugin</artifactId> <version>3.1.7</version> <configuration> + <skip>${skipPlugin}</skip> <urls> <property> <name>org.hps:*</name> Modified: java/branches/hps_java_trunk_HPSJAVA-255/pom.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/pom.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/pom.xml Mon Nov 3 01:04:28 2014 @@ -10,7 +10,7 @@ <groupId>org.hps</groupId> <artifactId>hps-parent</artifactId> <relativePath>parent/pom.xml</relativePath> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <scm> <url>svn://svn.freehep.org/hps/java/trunk/</url> @@ -38,7 +38,12 @@ <generateProjectInfo>true</generateProjectInfo> </configuration> </plugin> - </plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-eclipse-plugin</artifactId> + <version>2.9</version> + </plugin> + </plugins> </pluginManagement> </build> <reporting> @@ -72,6 +77,7 @@ <aggregate>true</aggregate> </configuration> </plugin> + <!-- <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-changes-plugin</artifactId> @@ -91,6 +97,7 @@ </reportSet> </reportSets> </plugin> + --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> @@ -119,7 +126,9 @@ <modules> <module>analysis</module> <module>conditions</module> +<!-- <module>datacat</module> +--> <module>detector-data</module> <module>distribution</module> <module>ecal-event-display</module> Modified: java/branches/hps_java_trunk_HPSJAVA-255/recon/pom.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/recon/pom.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/recon/pom.xml Mon Nov 3 01:04:28 2014 @@ -8,7 +8,7 @@ <groupId>org.hps</groupId> <artifactId>hps-parent</artifactId> <relativePath>../parent/pom.xml</relativePath> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <scm> <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/recon/</url> Modified: java/branches/hps_java_trunk_HPSJAVA-255/recon/src/main/java/org/hps/recon/particle/HpsReconParticleDriver.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/recon/src/main/java/org/hps/recon/particle/HpsReconParticleDriver.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/recon/src/main/java/org/hps/recon/particle/HpsReconParticleDriver.java Mon Nov 3 01:04:28 2014 @@ -20,147 +20,188 @@ import org.hps.recon.vertexing.BilliorVertex; import org.hps.recon.vertexing.BilliorVertexer; - /** - * The Main HPS implementation of ReconParticleDriver...makes V0 candidates and does vertex fits + * The main HPS implementation of ReconParticleDriver. Method generates + * V0 candidates and does vertex fits. + * * @author Omar Moreno <[log in to unmask]> * @version $Id$ */ public class HpsReconParticleDriver extends ReconParticleDriver { - - private enum Constraint { - UNCONSTRAINED, - BS_CONSTRAINED, - TARGET_CONSTRAINED - } - - public HpsReconParticleDriver(){} - - @Override - protected void startOfData(){ - -// unconstrainedV0CandidatesColName = "UnconstrainedV0Candidates"; -// beamConV0CandidatesColName = "BeamspotConstrainedV0Candidates"; -// targetConV0CandidatesColName = "TargetConstrainedV0Candidates"; -// unconstrainedV0VerticesColName = "UnconstrainedV0Vertices"; -// beamConV0VerticesColName = "BeamspotConstrainedV0Vertices"; -// targetConV0VerticesColName = "TargetConstrainedV0Vertices"; - } - - /** - * - */ - @Override - void findVertices(List<ReconstructedParticle> electrons, List<ReconstructedParticle> positrons) { - - ReconstructedParticle candidate = null; - BilliorVertex vtxFit = null; - // Loop through both electrons and positrons and try to find a common vertex - for(ReconstructedParticle positron : positrons){ - for(ReconstructedParticle electron : electrons){ - - // Get the tracks associated with the electron and the positron - Track electronTrack = electron.getTracks().get(0); - Track positronTrack = positron.getTracks().get(0); - - // Covert the tracks to BilliorTracks used by the vertexer - BilliorTrack electronBTrack = toBilliorTrack(electronTrack); - BilliorTrack positronBTrack = toBilliorTrack(positronTrack); - - for(Constraint constraint : Constraint.values()){ - - vtxFit = fitVertex(constraint, electronBTrack, positronBTrack); - - candidate = makeReconstructedParticle(electron, positron, vtxFit); - - - switch(constraint){ - case UNCONSTRAINED: - unconstrainedV0Vertices.add(vtxFit); - unconstrainedV0Candidates.add(candidate); - break; - case BS_CONSTRAINED: - beamConV0Vertices.add(vtxFit); - beamConV0Candidates.add(candidate); - break; - case TARGET_CONSTRAINED: - targetConV0Vertices.add(vtxFit); - targetConV0Candidates.add(candidate); - break; - } - } - } - } - } - - /** - * - */ - BilliorVertex fitVertex(Constraint constraint, BilliorTrack electron, BilliorTrack positron){ - - BilliorVertexer vtxFitter = new BilliorVertexer(bField); - // TODO: The beam size should come from the conditions database - vtxFitter.setBeamSize(beamsize); - - switch(constraint){ - case UNCONSTRAINED: - vtxFitter.doBeamSpotConstraint(false); - break; - case BS_CONSTRAINED: - vtxFitter.doBeamSpotConstraint(true); - break; - case TARGET_CONSTRAINED: - vtxFitter.doTargetConstraint(true); - break; - } - - List<BilliorTrack> billiorTracks = new ArrayList<BilliorTrack>(); - billiorTracks.add(electron); - billiorTracks.add(positron); - - return vtxFitter.fitVertex(billiorTracks); - } - - /** - * - */ - ReconstructedParticle makeReconstructedParticle(ReconstructedParticle electron, ReconstructedParticle positron, BilliorVertex vtxFit){ - - ReconstructedParticle candidate = new BaseReconstructedParticle(); - ((BaseReconstructedParticle) candidate).setStartVertex(vtxFit); - candidate.addParticle(electron); - candidate.addParticle(positron); - - // TODO: The calculation of the total fitted momentum should be done within - // BilloirVertex - ((BaseReconstructedParticle) candidate).setMass(vtxFit.getParameters().get("invMass")); - Hep3Vector fittedMomentum = new BasicHep3Vector(vtxFit.getParameters().get("p1X"), - vtxFit.getParameters().get("p1Y"), - vtxFit.getParameters().get("p1Z")); - fittedMomentum = VecOp.add(fittedMomentum, new BasicHep3Vector(vtxFit.getParameters().get("p2X"), - vtxFit.getParameters().get("p2Y"), - vtxFit.getParameters().get("p2Z"))); - this.printDebug("Fitted momentum in tracking frame: " + fittedMomentum.toString()); - fittedMomentum = CoordinateTransformations.transformVectorToDetector(fittedMomentum); - this.printDebug("Fitted momentum in detector frame: " + fittedMomentum.toString()); - HepLorentzVector fourVector = new BasicHepLorentzVector(0, 0, 0, 0); - ((BasicHepLorentzVector) fourVector).setV3(fourVector.t(), fittedMomentum); - ((BaseReconstructedParticle) candidate).set4Vector(fourVector); - - // Add the ReconstructedParticle to the Vertex - vtxFit.setAssociatedParticle(candidate); - - return candidate; - - } - - - /** - * - */ + /** + * Represents a type of constraint for vertex fitting. + * + * @author Omar Moreno <[log in to unmask]> + */ + private enum Constraint { + /** Represents a fit with no constraints. */ + UNCONSTRAINED, + /** Represents a fit with beam spot constraints. */ + BS_CONSTRAINED, + /** Represents a fit with target constraints. */ + TARGET_CONSTRAINED + } + + /** + * Creates reconstructed V0 candidate particles and vertices for + * electron positron pairs using no constraints, beam constraints, + * and target constraints. These are saved to the appropriate lists + * in the super class. + * @param electrons - The list of electrons. + * @param positrons - The list of positrons. + */ + @Override + protected void findVertices(List<ReconstructedParticle> electrons, List<ReconstructedParticle> positrons) { + // Iterate over the positrons and electrons to perform vertexing + // on the pairs. + for(ReconstructedParticle positron : positrons) { + for(ReconstructedParticle electron : electrons) { + // Get the tracks associated with the electron and + // the positron. + Track electronTrack = electron.getTracks().get(0); + Track positronTrack = positron.getTracks().get(0); + + // Covert the tracks to BilliorTracks. + BilliorTrack electronBTrack = toBilliorTrack(electronTrack); + BilliorTrack positronBTrack = toBilliorTrack(positronTrack); + + // Create candidate particles for each constraint. + for(Constraint constraint : Constraint.values()) { + // Generate a candidate vertex and particle. + BilliorVertex vtxFit = fitVertex(constraint, electronBTrack, positronBTrack); + ReconstructedParticle candidate = makeReconstructedParticle(electron, positron, vtxFit); + + // Add the candidate vertex and particle to the + // appropriate LCIO collection. + switch(constraint){ + case UNCONSTRAINED: + unconstrainedV0Vertices.add(vtxFit); + unconstrainedV0Candidates.add(candidate); + break; + case BS_CONSTRAINED: + beamConV0Vertices.add(vtxFit); + beamConV0Candidates.add(candidate); + break; + case TARGET_CONSTRAINED: + targetConV0Vertices.add(vtxFit); + targetConV0Candidates.add(candidate); + break; + } + } + } + } + } + + /** + * Sets the default LCIO collection names if they are not already + * defined previously. + */ + @Override + protected void startOfData(){ + // If the LCIO collection names have not been defined, assign + // them to the default names. + if(unconstrainedV0CandidatesColName == null) { unconstrainedV0CandidatesColName = "UnconstrainedV0Candidates"; } + if(beamConV0CandidatesColName == null) { beamConV0CandidatesColName = "BeamspotConstrainedV0Candidates"; } + if(targetConV0CandidatesColName == null) { targetConV0CandidatesColName = "TargetConstrainedV0Candidates"; } + if(unconstrainedV0VerticesColName == null) { unconstrainedV0VerticesColName = "UnconstrainedV0Vertices"; } + if(beamConV0VerticesColName == null) { beamConV0VerticesColName = "BeamspotConstrainedV0Vertices"; } + if(targetConV0VerticesColName == null) { targetConV0VerticesColName = "TargetConstrainedV0Vertices"; } + } + + /** + * Fits a vertex from an electron/positron track pair using the + * indicated constraint. + * @param constraint - The constraint type to use. + * @param electron - The electron track. + * @param positron - The positron track. + * @return Returns the reconstructed vertex as a <code>BilliorVertex + * </code> object. + */ + private BilliorVertex fitVertex(Constraint constraint, BilliorTrack electron, BilliorTrack positron){ + // Create a vertex fitter from the magnetic field. + 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. + switch(constraint){ + case UNCONSTRAINED: + vtxFitter.doBeamSpotConstraint(false); + break; + case BS_CONSTRAINED: + vtxFitter.doBeamSpotConstraint(true); + break; + case TARGET_CONSTRAINED: + vtxFitter.doTargetConstraint(true); + break; + } + + // 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); + } + + /** + * Creates a reconstructed V0 candidate particle from an electron, + * positron, and billior vertex. + * @param electron - The electron. + * @param positron - The positron. + * @param vtxFit - The billior vertex. + * @return Returns a reconstructed particle with properties generated + * from the child particles and vertex given as an argument. + */ + private ReconstructedParticle makeReconstructedParticle(ReconstructedParticle electron, ReconstructedParticle positron, BilliorVertex vtxFit){ + // Create a new reconstructed particle to represent the V0 + // candidate and populate it with the electron and positron. + ReconstructedParticle candidate = new BaseReconstructedParticle(); + ((BaseReconstructedParticle) candidate).setStartVertex(vtxFit); + candidate.addParticle(electron); + candidate.addParticle(positron); + + // TODO: The calculation of the total fitted momentum should be + // done within BilloirVertex. + // Calculate the candidate particle momentum and associate it + // with the reconstructed candidate particle. + ((BaseReconstructedParticle) candidate).setMass(vtxFit.getParameters().get("invMass")); + Hep3Vector fittedMomentum = new BasicHep3Vector(vtxFit.getParameters().get("p1X"), + vtxFit.getParameters().get("p1Y"), + vtxFit.getParameters().get("p1Z")); + fittedMomentum = VecOp.add(fittedMomentum, new BasicHep3Vector(vtxFit.getParameters().get("p2X"), + vtxFit.getParameters().get("p2Y"), + vtxFit.getParameters().get("p2Z"))); + fittedMomentum = CoordinateTransformations.transformVectorToDetector(fittedMomentum); + HepLorentzVector fourVector = new BasicHepLorentzVector(0, 0, 0, 0); + ((BasicHepLorentzVector) fourVector).setV3(fourVector.t(), fittedMomentum); + ((BaseReconstructedParticle) candidate).set4Vector(fourVector); + + // VERBOSE :: Output the fitted momentum data. + printDebug("Fitted momentum in tracking frame: " + fittedMomentum.toString()); + printDebug("Fitted momentum in detector frame: " + fittedMomentum.toString()); + + // Add the ReconstructedParticle to the vertex. + vtxFit.setAssociatedParticle(candidate); + + // Return the V0 candidate. + return candidate; + } + + /** + * Converts a <code>Track</code> object to a <code>BilliorTrack + * </code> object. + * @param track - The original track. + * @return Returns the original track as a <code>BilliorTrack + * </code> object. + */ private BilliorTrack toBilliorTrack(Track track) { - - HelicalTrackFit trackFit = ((SeedTrack) track).getSeedCandidate().getHelix(); - return new BilliorTrack(trackFit); + // Convert the track to a helical track fit. + HelicalTrackFit trackFit = ((SeedTrack) track).getSeedCandidate().getHelix(); + + // Generate and return the billior track. + return new BilliorTrack(trackFit); } } Modified: java/branches/hps_java_trunk_HPSJAVA-255/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java Mon Nov 3 01:04:28 2014 @@ -21,150 +21,318 @@ import org.hps.recon.tracking.TrackUtils; /** - * Driver that matches SVT Tracks and Ecal Clusters and creates - * ReconstructedParticles. + * Driver framework for generating reconstructed particles and matching + * clusters and tracks. * * @author Mathew Graham <[log in to unmask]> * @author Omar Moreno <[log in to unmask]> * @version $Id$ */ public abstract class ReconParticleDriver extends Driver { - - // Flags - boolean debug = false; - - // Reconstructed particle collections - List<ReconstructedParticle> finalStateParticles; - List<ReconstructedParticle> unconstrainedV0Candidates; - List<ReconstructedParticle> beamConV0Candidates; - List<ReconstructedParticle> targetConV0Candidates; - List<ReconstructedParticle> electrons; - List<ReconstructedParticle> positrons; - List<Vertex> unconstrainedV0Vertices; - List<Vertex> beamConV0Vertices; - List<Vertex> targetConV0Vertices; - - // Collections - String ecalClustersCollectionName = "EcalClusters"; - String tracksCollectionName = "MatchedTracks"; - String finalStateParticlesColName = "FinalStateParticles"; - String unconstrainedV0CandidatesColName = "UnconstrainedV0Candidates"; - String beamConV0CandidatesColName = "BeamspotConstrainedV0Candidates"; - String targetConV0CandidatesColName = "TargetConstrainedV0Candidates"; - String unconstrainedV0VerticesColName = "UnconstrainedV0Vertices"; - String beamConV0VerticesColName = "BeamspotConstrainedV0Vertices"; - String targetConV0VerticesColName = "TargetConstrainedV0Vertices"; -// String unconstrainedV0CandidatesColName = null; -// String beamConV0CandidatesColName = null; -// String targetConV0CandidatesColName = null; -// String vertexCandidatesColName = null; -// String vertexBeamConsCandidatesName = null; -// String unconstrainedV0VerticesColName = null; -// String beamConV0VerticesColName = null; -// String targetConV0VerticesColName = null; - - // The beamsize array is in the tracking frame - /* TODO mg-May 14, 2014: the the beam size from the conditions db...also beam position! */ - double[] beamsize = {0.001, 0.2, 0.02}; - double maxTrackClusterDistance = 10000; // [mm] - double bField; - - // flipSign is a kludge... - // HelicalTrackFitter doesn't deal with B-fields in -ive Z correctly - // so we set the B-field in +iveZ and flip signs of fitted tracks - // - // Note: This should be -1 for test run configurations and +1 for - // prop-2014 configurations - int flipSign = 1; - - public ReconParticleDriver() { - } - - public void setDebug(boolean debug) { - this.debug = debug; - } - - public void setMaxTrackClusterDistance(double maxTrackClusterDistance) { - this.maxTrackClusterDistance = maxTrackClusterDistance; - } - - public void setBeamSigmaX(double sigma_x) { - beamsize[1] = sigma_x; - } - - public void setBeamSigmaY(double sigma_y) { - beamsize[2] = sigma_y; - } - + /** + * Sets the name of the LCIO collection for beam spot constrained + * V0 candidate particles. + * @param beamConV0CandidatesColName - The LCIO collection name. + */ + public void setBeamConV0CandidatesColName(String beamConV0CandidatesColName) { + this.beamConV0CandidatesColName = beamConV0CandidatesColName; + } + + /** + * Sets the name of the LCIO collection for beam spot constrained + * V0 candidate vertices. + * @param beamConV0VerticesColName - The LCIO collection name. + */ + public void setBeamConV0VerticesColName(String beamConV0VerticesColName) { + this.beamConV0VerticesColName = beamConV0VerticesColName; + } + + /** + * Sets the beam size sigma in the x-direction. + * @param sigmaX - The standard deviation of the beam width in the + * x-direction. + */ + public void setBeamSigmaX(double sigmaX) { beamSize[1] = sigmaX; } + + /** + * Sets the beam size sigma in the y-direction. + * @param sigmaY - The standard deviation of the beam width in the + * y-direction. + */ + public void setBeamSigmaY(double sigmaY) { beamSize[2] = sigmaY; } + + /** + * Indicates whether verbose debug text should be written out during + * runtime or note. Defaults to <code>false</code>. + * @param debug - <code>true</code> indicates that debug text should + * be written and <code>false</code> that it should be suppressed. + */ + public void setDebug(boolean debug) { this.debug = debug; } + + /** + * Sets the maximum allowed separation distance between a matched + * cluster and track pair. + * @param dxCut - The maximum separation distance in the x-direction. + */ + public void setDxCut(double dxCut) { + this.dxCut = dxCut; + } + + /** + * Sets the maximum allowed separation distance between a matched + * cluster and track pair. + * @param dyCut - The maximum separation distance in the y-direction. + */ + public void setDyCut(double dyCut) { + this.dyCut = dyCut; + } + + /** + * Sets the LCIO collection name for calorimeter cluster data. + * @param ecalClustersCollectionName - The LCIO collection name. + */ public void setEcalClusterCollectionName(String ecalClustersCollectionName) { this.ecalClustersCollectionName = ecalClustersCollectionName; } - + + /** + * Sets the name of the LCIO collection for reconstructed particles. + * @param finalStateParticlesColName - The LCIO collection name. + */ + public void setFinalStateParticlesColName(String finalStateParticlesColName) { + this.finalStateParticlesColName = finalStateParticlesColName; + } + + /** + * Sets the name of the LCIO collection for target constrained V0 + * candidate particles. + * @param targetConV0CandidatesColName - The LCIO collection name. + */ + public void setTargetConV0CandidatesColName(String targetConV0CandidatesColName) { + this.targetConV0CandidatesColName = targetConV0CandidatesColName; + } + + /** + * Sets the name of the LCIO collection for target constrained V0 + * candidate vertices. + * @param targetConV0VerticesColName - The LCIO collection name. + */ + public void setTargetConV0VerticesColName(String targetConV0VerticesColName) { + this.targetConV0VerticesColName = targetConV0VerticesColName; + } + + /** + * Sets the LCIO collection name for particle track data. + * @param tracksCollectionName - The LCIO collection name. + */ public void setTracksCollectionName(String tracksCollectionName) { this.tracksCollectionName = tracksCollectionName; } - public void setFinalStateParticlesColName(String finalStateParticlesColName) { - this.finalStateParticlesColName = finalStateParticlesColName; - } - - + /** + * Sets the name of the LCIO collection for unconstrained V0 + * candidate particles. + * @param unconstrainedV0CandidatesColName - The LCIO collection name. + */ public void setUnconstrainedV0CandidatesColName(String unconstrainedV0CandidatesColName) { this.unconstrainedV0CandidatesColName = unconstrainedV0CandidatesColName; } - - public void setBeamConV0CandidatesColName(String beamConV0CandidatesColName) { - this.beamConV0CandidatesColName = beamConV0CandidatesColName; - } - - - public void setTargetConV0CandidatesColName(String targetV0CandidatesColName) { - this.targetConV0CandidatesColName = targetConV0CandidatesColName; - } - - + /** + * Sets the name of the LCIO collection for unconstrained V0 + * candidate vertices. + * @param unconstrainedV0VerticesColName - The LCIO collection name. + */ public void setUnconstrainedV0VerticesColName(String unconstrainedV0VerticesColName) { this.unconstrainedV0VerticesColName = unconstrainedV0VerticesColName; } - - public void setBeamConV0VerticesColName(String beamConV0VerticesColName) { - this.beamConV0VerticesColName = beamConV0VerticesColName; - } - - - public void setTargetConV0VerticesColName(String targetV0VerticesColName) { - this.targetConV0VerticesColName = targetConV0VerticesColName; - } - + /** + * Updates the magnetic field parameters to match the appropriate + * values for the current detector settings. + */ @Override protected void detectorChanged(Detector detector) { - + // Set the magnetic field parameters to the appropriate values. Hep3Vector ip = new BasicHep3Vector(0., 0., 1.); bField = detector.getFieldMap().getField(ip).y(); - if (bField < 0) - flipSign = -1; - - } - - public void process(EventHeader event) { - - // All events should have a collection of Ecal clusters. If the event - // doesn't have one, skip the event. - if (!event.hasCollection(Cluster.class, ecalClustersCollectionName)) + if (bField < 0) { flipSign = -1; } + } + + /** + * Generates reconstructed V0 candidate particles and vertices from + * sets of positrons and electrons. Implementing methods should + * place the reconstructed vertices and candidate particles into the + * appropriate class variable lists in <code>ReconParticleDriver + * </code>. + * @param electrons - The list of electrons. + * @param positrons - The list of positrons. + */ + protected abstract void findVertices(List<ReconstructedParticle> electrons, List<ReconstructedParticle> positrons); + + /** + * Create the set of final state particles from the event tracks + * and clusters. Clusters will be matched with tracks when this + * is possible. + * @param clusters - The list of event clusters. + * @param tracks - The list of event tracks. + * @return Returns a <code>List</code> collection containing all + * of the <code>ReconstructedParticle</code> objects generated from + * the argument data. + */ + protected List<ReconstructedParticle> makeReconstructedParticles(List<Cluster> clusters, List<Track> tracks) { + // Create a list in which to store reconstructed particles. + List<ReconstructedParticle> particles = new ArrayList<ReconstructedParticle>(); + + // Create a list of unmatched clusters. A cluster should be + // removed from the list if a matching track is found. + //List<Cluster> unmatchedClusters = new ArrayList<Cluster>(clusters); + java.util.Set<Cluster> unmatchedClusters = new java.util.HashSet<Cluster>(clusters); + + // Iterate over all of the tracks and generate reconstructed + // particles for each one. If possible, match a cluster to the + // track as well. + for (Track track : tracks) { + // Create a reconstructed particle to represent the track. + ReconstructedParticle particle = new BaseReconstructedParticle(); + HepLorentzVector fourVector = new BasicHepLorentzVector(0, 0, 0, 0); + + // Store the track in the particle. + particle.addTrack(track); + + // Store the momentum derived from the track in the particle. + Hep3Vector momentum = new BasicHep3Vector(track.getTrackStates().get(0).getMomentum()); + momentum = CoordinateTransformations.transformVectorToDetector(momentum); + ((BasicHepLorentzVector) fourVector).setV3(fourVector.t(), momentum); + + // Derive the charge of the particle from the track. + ((BaseReconstructedParticle) particle).setCharge(track.getCharge() * flipSign); + + // Extrapolate the particle ID from the track. Positively + // charged particles are assumed to be positrons and those + // with negative charges are assumed to be electrons. + if (particle.getCharge() > 0) { + ((BaseReconstructedParticle) particle).setParticleIdUsed(new SimpleParticleID(-11, 0, 0, 0)); + } + else if (particle.getCharge() < 0) { + ((BaseReconstructedParticle) particle).setParticleIdUsed(new SimpleParticleID(11, 0, 0, 0)); + } + + // Track the best matching cluster for the track. A null + // value indicates that no cluster matches the track to + // within the maximum displacement limits. + Cluster matchedCluster = null; + + // Loop through all the unmatched clusters and select the + // cluster, if any, that best fits with the track. + clusterLoop: + for (Cluster cluster : unmatchedClusters) { + // Check if the cluster and track are a valid match. + if (isMatch(cluster, track)) { + // Store the matched cluster. + matchedCluster = cluster; + + // Since a match has been found, the loop can be + // terminated. + break clusterLoop; + } + } + + // If a cluster was found that matches the track... + if (matchedCluster != null) { + // Update the reconstructed particle with the data from + // the cluster. + particle.addCluster(matchedCluster); + ((BasicHepLorentzVector) fourVector).setT(matchedCluster.getEnergy()); + + // Remove the cluster from the set of unmatched clusters. + unmatchedClusters.remove(matchedCluster); + } + + // Store the momentum vector in the reconstructed particle. + ((BaseReconstructedParticle) particle).set4Vector(fourVector); + + // Add the particle to the list of reconstructed particles. + particles.add(particle); + } + + // If any cluster remain unmatched after the tracks are finished, + // they should be processed into additional reconstructed particles. + if (!unmatchedClusters.isEmpty()) + // Iterate over the remaining unmatched clusters. + for (Cluster unmatchedCluster : unmatchedClusters) { + // Create a reconstructed particle to represent the + // unmatched cluster. + ReconstructedParticle particle = new BaseReconstructedParticle(); + HepLorentzVector fourVector = new BasicHepLorentzVector(0, 0, 0, 0); + + // Add the cluster to the particle. + particle.addCluster(unmatchedCluster); + + // Set the reconstructed particle properties based on + // the cluster properties. + ((BasicHepLorentzVector) fourVector).setT(unmatchedCluster.getEnergy()); + ((BaseReconstructedParticle) particle).setCharge(0); + ((BaseReconstructedParticle) particle).set4Vector(fourVector); + + // The particle is assumed to be a photon, since it + // did not leave any track. + ((BaseReconstructedParticle) particle).setParticleIdUsed(new SimpleParticleID(22, 0, 0, 0)); + + // Add the particle to the reconstructed particle list. + particles.add(particle); + } + + // Return the list of reconstructed particles. + return particles; + } + + /** + * Prints a message as per <code>System.out.println</code> to the + * output stream if the verbose debug output option is enabled. + * @param debugMessage - The message to print. + */ + protected void printDebug(String debugMessage) { + // If verbose debug mode is enabled, print out the message. + if(debug) { System.out.printf("%s :: %s%n", simpleName, debugMessage); } + } + + /** + * Processes the track and cluster collections in the event into + * reconstructed particles and V0 candidate particles and vertices. + * These reconstructed particles are then stored in the event. + * @param event - The event to process. + */ + @Override + protected void process(EventHeader event) { + // All events are required to contain calorimeter clusters. If + // the event lacks these, then it should be skipped. + if (!event.hasCollection(Cluster.class, ecalClustersCollectionName)) { return; - - // Get the collection of Ecal clusters from the event. A triggered - // event should have Ecal clusters. If it doesn't, skip the event. + } + + // VERBOSE :: Note that a new event is being read. + printDebug("\nProcessing Event..."); + + // Otherwise, get the list of calorimeter clusters. List<Cluster> clusters = event.get(Cluster.class, ecalClustersCollectionName); - //if(clusters.isEmpty()) return; - this.printDebug("Number of Ecal clusters: " + clusters.size()); - - // Get the collection of tracks from the event - List<Track> tracks = event.get(Track.class, tracksCollectionName); - this.printDebug("Number of Tracks in "+tracksCollectionName+" : " + tracks.size()); - + + // VERBOSE :: Output the number of clusters in the event. + printDebug("Clusters :: " + clusters.size()); + + // Get the set of tracks from the event. If no such collection + // exists, initialize an empty list instead. + List<Track> tracks; + if(event.hasCollection(Track.class, tracksCollectionName)) { + tracks = event.get(Track.class, tracksCollectionName); + } + else { tracks = new ArrayList<Track>(0); } + + // VERBOSE :: Output the number of tracks in the event. + printDebug("Tracks :: " + tracks.size()); + + // Instantiate new lists to store reconstructed particles and + // V0 candidate particles and vertices. finalStateParticles = new ArrayList<ReconstructedParticle>(); electrons = new ArrayList<ReconstructedParticle>(); positrons = new ArrayList<ReconstructedParticle>(); @@ -174,193 +342,227 @@ unconstrainedV0Vertices = new ArrayList<Vertex>(); beamConV0Vertices = new ArrayList<Vertex>(); targetConV0Vertices = new ArrayList<Vertex>(); - - // - finalStateParticles = this.makeReconstructedParticles(clusters, tracks); - this.printDebug("Total number of Final State Particles: " + finalStateParticles.size()); - - // Put all the reconstructed particles in the event + + // Generate the reconstructed particles. + finalStateParticles = makeReconstructedParticles(clusters, tracks); + + // VERBOSE :: Output the number of reconstructed particles. + printDebug("Final State Particles :: " + finalStateParticles.size()); + + // Store the reconstructed particles collection. event.put(finalStateParticlesColName, finalStateParticles, ReconstructedParticle.class, 0); - - // Loop through the list of final state particles and separate the - // charged particles to either electrons or positrons. These lists - // will be used for vertexing purposes. - for (ReconstructedParticle finalStateParticle : finalStateParticles) - if (finalStateParticle.getCharge() > 0) - positrons.add(finalStateParticle); - else if (finalStateParticle.getCharge() < 0) - electrons.add(finalStateParticle); - this.printDebug("Number of Electrons: " + electrons.size()); - this.printDebug("Number of Positrons: " + positrons.size()); - - // Vertex electron and positron candidates + + // Separate the reconstructed particles into electrons and + // positrons so that V0 candidates can be generated from them. + for (ReconstructedParticle finalStateParticle : finalStateParticles) { + // If the charge is positive, assume an electron. + if(finalStateParticle.getCharge() > 0) { positrons.add(finalStateParticle); } + + // Otherwise, assume the particle is a positron. + else if(finalStateParticle.getCharge() < 0) { electrons.add(finalStateParticle); } + } + + // VERBOSE :: Output the number of reconstructed positrons + // and electrons. + printDebug("Number of Electrons: " + electrons.size()); + printDebug("Number of Positrons: " + positrons.size()); + + // Form V0 candidate particles and vertices from the electron + // and positron reconstructed particles. findVertices(electrons, positrons); - - // If the list exist, put the vertexed candidates and vertices into the event + + // Store the V0 candidate particles and vertices for each type + // of constraint in the appropriate collection in the event, + // as long as a collection name is defined. if (unconstrainedV0CandidatesColName != null) { - this.printDebug("Total number of unconstrained V0 candidates: " + unconstrainedV0Candidates.size()); + printDebug("Unconstrained V0 Candidates: " + unconstrainedV0Candidates.size()); event.put(unconstrainedV0CandidatesColName, unconstrainedV0Candidates, ReconstructedParticle.class, 0); } if (beamConV0CandidatesColName != null) { - this.printDebug("Total number of beam constrained V0 candidates: " + unconstrainedV0Candidates.size()); + printDebug("Beam-Constrained V0 Candidates: " + unconstrainedV0Candidates.size()); event.put(beamConV0CandidatesColName, beamConV0Candidates, ReconstructedParticle.class, 0); } if (targetConV0CandidatesColName != null) { - this.printDebug("Total number of target constrained V0 candidates: " + unconstrainedV0Candidates.size()); + printDebug("Target-Constrained V0 Candidates: " + unconstrainedV0Candidates.size()); event.put(targetConV0CandidatesColName, targetConV0Candidates, ReconstructedParticle.class, 0); } if (unconstrainedV0VerticesColName != null) { - this.printDebug("Total number of unconstrained V0 vertices: " + unconstrainedV0Vertices.size()); + printDebug("Unconstrained V0 Vertices: " + unconstrainedV0Vertices.size()); event.put(unconstrainedV0VerticesColName, unconstrainedV0Vertices, Vertex.class, 0); } if (beamConV0VerticesColName != null) { - this.printDebug("Total number of beam constrained V0 vertices: " + beamConV0Vertices.size()); + printDebug("Beam-Constrained V0 Vertices: " + beamConV0Vertices.size()); event.put(beamConV0VerticesColName, beamConV0Vertices, Vertex.class, 0); } if (targetConV0VerticesColName != null) { - this.printDebug("Total number of target constrained V0 vertices: " + beamConV0Vertices.size()); + printDebug("Target-Constrained V0 Vertices: " + beamConV0Vertices.size()); event.put(targetConV0VerticesColName, targetConV0Vertices, Vertex.class, 0); } } - - /** - * - */ - abstract void findVertices(List<ReconstructedParticle> electrons, List<ReconstructedParticle> positrons); - - /** - * make the final state particles from clusters & tracks - * loop over the tracks first and try to match with clusters - */ - protected List<ReconstructedParticle> makeReconstructedParticles(List<Cluster> clusters, List<Track> tracks) { - - // Instantiate the list of reconstructed particles - List<ReconstructedParticle> particles = new ArrayList<ReconstructedParticle>(); - - // Instantiate the list of unmatched clusters. Remove if we find track match - List<Cluster> unmatchedClusters = new ArrayList<Cluster>(clusters); - - for (Track track : tracks) { - - ReconstructedParticle particle = new BaseReconstructedParticle(); - HepLorentzVector fourVector = new BasicHepLorentzVector(0, 0, 0, 0); - - // - // Add all track information to the ReconstructedParticle - // - particle.addTrack(track); - - // Set the momentum of the ReconstructedParticle - Hep3Vector momentum = new BasicHep3Vector(track.getTrackStates().get(0).getMomentum()); - momentum = CoordinateTransformations.transformVectorToDetector(momentum); - ((BasicHepLorentzVector) fourVector).setV3(fourVector.t(), momentum); - // Set the charge of the ReconstructedParticle - ((BaseReconstructedParticle) particle).setCharge(track.getCharge() * flipSign); - // Set the particle ID - if (particle.getCharge() > 0) - ((BaseReconstructedParticle) particle).setParticleIdUsed(new SimpleParticleID(-11, 0, 0, 0)); - else if (particle.getCharge() < 0) - ((BaseReconstructedParticle) particle).setParticleIdUsed(new SimpleParticleID(11, 0, 0, 0)); - - Cluster matchedCluster = null; - // Loop through all of the clusters and find the one that best matches - // the track. - for (Cluster cluster : unmatchedClusters) { - - // Get the position of the Ecal cluster - Hep3Vector clusterPosition = new BasicHep3Vector(cluster.getPosition()); - - // Extrapolate the track to the Ecal cluster position - Hep3Vector trackPosAtEcal = TrackUtils.extrapolateTrack(track, clusterPosition.z()); - this.printDebug("Ecal cluster position: " + clusterPosition.toString()); - - double rMax = Double.MAX_VALUE; - - // Check if any of the extrapolated values are invalid. - // TODO: There are some track whose extrapolated coordinates - // are NaN. The problem seems to be that the y-coordinate - // of the extrapolated helix is found to be non-real. This - // needs to be fixed. - if (Double.isNaN(trackPosAtEcal.x()) || Double.isNaN(trackPosAtEcal.y())) - continue; - this.printDebug("Track position at shower max: " + trackPosAtEcal.toString()); - -// double r = VecOp.sub(trackPosAtEcal, clusterPosition).magnitude(); - // Don't trust extrapolation...just do y-difference for now - double r = Math.abs(clusterPosition.y() - trackPosAtEcal.y()); - this.printDebug("Distance between Ecal cluster and track position: " + r + " mm"); - - // Check if the Ecal cluster and track are within the same - // detector volume i.e. both top or bottom - if (clusterPosition.y() * trackPosAtEcal.y() < 0) { - this.printDebug("Track and Ecal cluster are in opposite volumes. Track Y @ ECAL = " + trackPosAtEcal.z()); - continue; - } - - // TODO: Checking whether r < rMax should be occuring within isMatch. isMatch - // is basically repeating a lot of the same code as above. - if (r < rMax && isMatch(cluster, track)) { - rMax = r; - matchedCluster = cluster; - } - } - - if (matchedCluster != null) { - particle.addCluster(matchedCluster); - ((BasicHepLorentzVector) fourVector).setT(matchedCluster.getEnergy()); - unmatchedClusters.remove(matchedCluster); - } - ((BaseReconstructedParticle) particle).set4Vector(fourVector); - particles.add(particle); - } - - if (!unmatchedClusters.isEmpty()) - for (Cluster unmatchedCluster : unmatchedClusters) { - // Create a reconstructed particle and add it to the - // collection of particles - ReconstructedParticle particle = new BaseReconstructedParticle(); - HepLorentzVector fourVector = new BasicHepLorentzVector(0, 0, 0, 0); - - particle.addCluster(unmatchedCluster); - ((BasicHepLorentzVector) fourVector).setT(unmatchedCluster.getEnergy()); - ((BaseReconstructedParticle) particle).setCharge(0); - ((BaseReconstructedParticle) particle).set4Vector(fourVector); - ((BaseReconstructedParticle) particle).setParticleIdUsed(new SimpleParticleID(22, 0, 0, 0)); - particles.add(particle); - } - - return particles; - } - - /** - * - * @param debugMessage - */ - protected void printDebug(String debugMessage) { - if (debug) - System.out.println(this.getClass().getSimpleName() + ": " + debugMessage); - } - - /** - * - */ - boolean isMatch(Cluster cluster, Track track) { - - // Get the position of the Ecal cluster + + /** + * Sets the LCIO collection names to their default values if they + * are not already defined. + */ + @Override + protected void startOfData() { + // If any of the LCIO collection names are not properly defined, define them now. + if(ecalClustersCollectionName == null) { ecalClustersCollectionName = "EcalClusters"; } + if(tracksCollectionName == null) { tracksCollectionName = "MatchedTracks"; } + if(finalStateParticlesColName == null) { finalStateParticlesColName = "FinalStateParticles"; } + if(unconstrainedV0CandidatesColName == null) { unconstrainedV0CandidatesColName = "UnconstrainedV0Candidates"; } + if(beamConV0CandidatesColName == null) { beamConV0CandidatesColName = "BeamspotConstrainedV0Candidates"; } + if(targetConV0CandidatesColName == null) { targetConV0CandidatesColName = "TargetConstrainedV0Candidates"; } + if(unconstrainedV0VerticesColName == null) { unconstrainedV0VerticesColName = "UnconstrainedV0Vertices"; } + if(beamConV0VerticesColName == null) { beamConV0VerticesColName = "BeamspotConstrainedV0Vertices"; } + if(targetConV0VerticesColName == null) { targetConV0VerticesColName = "TargetConstrainedV0Vertices"; } + } + + /** + * Determines if a cluster is a potential match for a given track. + * If it is, returns the distance between the extrapolation of the + * track to the z-position of the cluster and the cluster position. + * Otherwise, returns <code>null</code> to indicate that the pair + * is not a valid match. + * @param cluster - The cluster to check. + * @param track - The track to check. + * @return Returns the distance between the cluster and extrapolated + * track position in millimeters as a <code>Double</code> if the + * pair is a potential match. Returns <code>null</code> otherwise. + */ + private boolean isMatch(Cluster cluster, Track track) { + // Get the position of the cluster and extrapolate the position + // of the track at the z-position of the cluster. Hep3Vector clusterPosition = new BasicHep3Vector(cluster.getPosition()); - - // Extrapolate the track to the Ecal cluster position Hep3Vector trackPosAtEcal = TrackUtils.extrapolateTrack(track, clusterPosition.z()); - - double dxCut = 20.0; - double dyCut = 20.0; - - if (Math.abs(trackPosAtEcal.x() - clusterPosition.x()) > dxCut) + + // TODO: There are some track whose extrapolated coordinates + // are NaN. The problem seems to be that the y-coordinate + // of the extrapolated helix is found to be non-real. This + // needs to be fixed. + // There is an issue with track extrapolation that sometimes + // yields NaN for extrapolated track parameters. Tracks with + // this issue are not usable and thusly the check should be + // skipped. + if (Double.isNaN(trackPosAtEcal.x()) || Double.isNaN(trackPosAtEcal.y())) { + // VERBOSE :: Indicate the reason for the match failing. + printDebug("\tFailure :: Track extrapolation error."); + + // Return false to indicate that the pair do not match. return false; - - if (Math.abs(trackPosAtEcal.y() - clusterPosition.y()) > dyCut) + } + + // VERBOSE :: Output the position of the extrapolated track + // and the cluster. + printDebug("\tCluster Position :: " + clusterPosition.toString()); + printDebug("\tTrack Position :: " + trackPosAtEcal.toString()); + + // If one of either the cluster or extrapolated track fall on + // one volume of the detector and the other is in the other + // volume, then they can not be a match. (i.e. both parts of + // the pair must be on the top or bottom of the detector.) + if (clusterPosition.y() * trackPosAtEcal.y() < 0) { + // VERBOSE :: Indicate the reason for the match failing. + printDebug("\tFailure :: Cluster/Track pair in opposite volumes."); + + // Return false to indicate that the pair do not match. return false; - + } + + // Check to make sure that the x and y displacements between + // the extrapolated track position and cluster position are + // within the allowed bounds. If they are not, this pair is + // not a match. + if (Math.abs(trackPosAtEcal.x() - clusterPosition.x()) > dxCut) { + // VERBOSE :: Indicate the reason for the match failing. + printDebug("\tFailure :: Pair x-displacement exceeds allowed threshold."); + + // Return false to indicate that the pair do not match. + return false; + } + + if (Math.abs(trackPosAtEcal.y() - clusterPosition.y()) > dyCut) { + // VERBOSE :: Indicate the reason for the match failing. + printDebug("\tFailure :: Pair y-displacement exceeds allowed threshold."); + + // Return false to indicate that the pair do not match. + return false; + } + + // VERBOSE :: Indicate the reason for the match failing. + printDebug("\tSuccess :: Cluster/track pair match!."); + + // A pair that has reached this point is a potential match. + // Return true to indicate a match. return true; } + + // ============================================================== + // ==== Class Variables ========================================= + // ============================================================== + // Local variables. + /** The maximum separation distance in the x-direction beyond which + * a cluster and track will be rejected for pairing. */ + private double dxCut = 20.0; + /** The maximum separation distance in the y-direction beyond which + * a cluster and track will be rejected for pairing. */ + private double dyCut = 20.0; + /** Indicates whether debug text should be output or not. */ + private boolean debug = false; + /** The simple name of the class used for debug print statements. */ + private final String simpleName = getClass().getSimpleName(); + + // Reconstructed Particle Lists + /** Stores reconstructed electron particles. */ + private List<ReconstructedParticle> electrons; + /** Stores reconstructed positron particles. */ + private List<ReconstructedParticle> positrons; + /** Stores particles reconstructed from an event. */ + protected List<ReconstructedParticle> finalStateParticles; + /** Stores reconstructed V0 candidate particles generated without constraints. */ + protected List<ReconstructedParticle> unconstrainedV0Candidates; + /** Stores reconstructed V0 candidate particles generated with beam spot constraints. */ + protected List<ReconstructedParticle> beamConV0Candidates; + /** Stores reconstructed V0 candidate particles generated with target constraints. */ + protected List<ReconstructedParticle> targetConV0Candidates; + /** Stores reconstructed V0 candidate vertices generated without constraints. */ + protected List<Vertex> unconstrainedV0Vertices; + /** Stores reconstructed V0 candidate vertices generated with beam spot constraints. */ + protected List<Vertex> beamConV0Vertices; + /** Stores reconstructed V0 candidate vertices generated with target constraints. */ + protected List<Vertex> targetConV0Vertices; + + // LCIO Collection Names + /** LCIO collection name for calorimeter clusters. */ + private String ecalClustersCollectionName = "EcalClusters"; + /** LCIO collection name for tracks. */ + private String tracksCollectionName = "MatchedTracks"; + /** LCIO collection name for reconstructed particles. */ + private String finalStateParticlesColName = "FinalStateParticles"; + /** LCIO collection name for V0 candidate particles generated without constraints. */ + protected String unconstrainedV0CandidatesColName = null; + /** LCIO collection name for V0 candidate particles generated with beam spot constraints. */ + protected String beamConV0CandidatesColName = null; + /** LCIO collection name for V0 candidate particles generated with target constraints. */ + protected String targetConV0CandidatesColName = null; + /** LCIO collection name for V0 candidate vertices generated without constraints. */ + protected String unconstrainedV0VerticesColName = null; + /** LCIO collection name for V0 candidate vertices generated with beam spot constraints. */ + protected String beamConV0VerticesColName = null; + /** LCIO collection name for V0 candidate vertices generated with target constraints. */ + protected String targetConV0VerticesColName = null; + + // Beam size variables. + // The beamsize array is in the tracking frame + /* TODO mg-May 14, 2014: the the beam size from the conditions db...also beam position! */ + protected double[] beamSize = {0.001, 0.2, 0.02}; + protected double bField; + + // flipSign is a kludge... + // HelicalTrackFitter doesn't deal with B-fields in -ive Z correctly + // so we set the B-field in +iveZ and flip signs of fitted tracks + // + // Note: This should be -1 for test run configurations and +1 for + // prop-2014 configurations + private int flipSign = 1; } Modified: java/branches/hps_java_trunk_HPSJAVA-255/recon/src/main/java/org/hps/recon/particle/TestRunReconParticleDriver.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/recon/src/main/java/org/hps/recon/particle/TestRunReconParticleDriver.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/recon/src/main/java/org/hps/recon/particle/TestRunReconParticleDriver.java Mon Nov 3 01:04:28 2014 @@ -10,41 +10,59 @@ import org.hps.recon.vertexing.TwoTrackVertexer; /** + * Method creates reconstructed particles from tracks and clusters for + * test run data. Also generates candidate A' reconstructed particles. + * This method does not generate a separate vertex collection. * * @author Omar Moreno <[log in to unmask]> * @version $Id$ */ public class TestRunReconParticleDriver extends ReconParticleDriver { - - public TestRunReconParticleDriver(){}; - - @Override - protected void startOfData(){ - unconstrainedV0CandidatesColName = "V0Candidates"; - } - - @Override - void findVertices(List<ReconstructedParticle> electrons, List<ReconstructedParticle> positrons) { - - TwoTrackVertexer vtxFitter = new TwoTrackVertexer(); - - // Loop through both electrons and positrons and try to vertex them - for(ReconstructedParticle positron : positrons){ - for(ReconstructedParticle electron : electrons){ - - // Get the tracks associated with the electrons and positrons - Track electronTrack = electron.getTracks().get(0); - Track positronTrack = positron.getTracks().get(0); - vtxFitter.setTracks(electronTrack, positronTrack); - vtxFitter.fitVertex(); - Vertex vertex = vtxFitter.getFittedVertex(); - - ReconstructedParticle candidate = new BaseReconstructedParticle(); - ((BaseReconstructedParticle) candidate).setStartVertex(vertex); - candidate.addParticle(electron); - candidate.addParticle(positron); - unconstrainedV0Candidates.add(candidate); - } - } - } + /** + * Generates reconstructed V0 candidate particles from electron + * and positron pairs. + * @param electrons - The list of electrons. + * @param positrons - The list of positrons. + */ + @Override + protected void findVertices(List<ReconstructedParticle> electrons, List<ReconstructedParticle> positrons) { + // Create a vertex fitter. + TwoTrackVertexer vtxFitter = new TwoTrackVertexer(); + + // Iterate over the electrons and positrons and try to generate + // an A' candidate from them. + for(ReconstructedParticle positron : positrons){ + for(ReconstructedParticle electron : electrons){ + // Get the electron and positron tracks. + Track electronTrack = electron.getTracks().get(0); + Track positronTrack = positron.getTracks().get(0); + + // Feed the tracks to the vertex fitter. + vtxFitter.setTracks(electronTrack, positronTrack); + vtxFitter.fitVertex(); + + // Get the reconstructed vertex. + Vertex vertex = vtxFitter.getFittedVertex(); + + // Create a reconstructed particle for the candidate + // particle generated from the electron/positron pair. + ReconstructedParticle candidate = new BaseReconstructedParticle(); + ((BaseReconstructedParticle) candidate).setStartVertex(vertex); + candidate.addParticle(electron); + candidate.addParticle(positron); + + // Add the candidate particle to list. + unconstrainedV0Candidates.add(candidate); + } + } + } + + /** + * Sets the unconstrained A' candidate particle collection name if + * it has not already been defined. + */ + @Override + protected void startOfData(){ + if(unconstrainedV0CandidatesColName == null) { unconstrainedV0CandidatesColName = "V0Candidates"; } + } } Modified: java/branches/hps_java_trunk_HPSJAVA-255/record-util/pom.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/record-util/pom.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/record-util/pom.xml Mon Nov 3 01:04:28 2014 @@ -7,7 +7,7 @@ <groupId>org.hps</groupId> <artifactId>hps-parent</artifactId> <relativePath>../parent/pom.xml</relativePath> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <scm> <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/record-util/</url> Modified: java/branches/hps_java_trunk_HPSJAVA-255/steering-files/pom.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/steering-files/pom.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/steering-files/pom.xml Mon Nov 3 01:04:28 2014 @@ -8,7 +8,7 @@ <groupId>org.hps</groupId> <artifactId>hps-parent</artifactId> <relativePath>../parent/pom.xml</relativePath> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <scm> <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/steering-files/</url> Modified: java/branches/hps_java_trunk_HPSJAVA-255/steering-files/src/main/resources/org/hps/steering/monitoring/DummyError.lcsim ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/steering-files/src/main/resources/org/hps/steering/monitoring/DummyError.lcsim (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/steering-files/src/main/resources/org/hps/steering/monitoring/DummyError.lcsim Mon Nov 3 01:04:28 2014 @@ -4,6 +4,8 @@ <driver name="DummyErrorDriver"/> </execute> <drivers> - <driver name="DummyErrorDriver" type="org.hps.monitoring.drivers.test.DummyErrorDriver"/> + <driver name="DummyErrorDriver" type="org.hps.monitoring.drivers.example.DummyErrorDriver"> + <throwProcess>true</throwProcess> + </driver> </drivers> </lcsim> Modified: java/branches/hps_java_trunk_HPSJAVA-255/tracking/pom.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/tracking/pom.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/tracking/pom.xml Mon Nov 3 01:04:28 2014 @@ -8,7 +8,7 @@ <groupId>org.hps</groupId> <artifactId>hps-parent</artifactId> <relativePath>../parent/pom.xml</relativePath> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <scm> <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/tracking/</url> @@ -46,10 +46,5 @@ <artifactId>commons-math3</artifactId> <version>3.2</version> </dependency> - <dependency> - <groupId>org.freehep</groupId> - <artifactId>freehep-jminuit</artifactId> - <version>1.0.2-SNAPSHOT</version> - </dependency> </dependencies> </project> Modified: java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/recon/tracking/MultipleScattering.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/recon/tracking/MultipleScattering.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/recon/tracking/MultipleScattering.java Mon Nov 3 01:04:28 2014 @@ -17,8 +17,10 @@ import org.lcsim.recon.tracking.seedtracker.ScatterAngle; /** - * Extention of lcsim class to allow use of local classes. Finds scatter points and magnitude from + * Extention of lcsim class to allow use of local classes. Finds scatter points + * and magnitude from * detector geometry directly. + * * @author Per Hansson <[log in to unmask]> */ public class MultipleScattering extends org.lcsim.recon.tracking.seedtracker.MultipleScattering { @@ -28,9 +30,11 @@ } /** - * Override lcsim version and select material manager depending on object type. This allows to - * use a local extension of the material manager in teh lcsim track fitting code. - * + * Override lcsim version and select material manager depending on object + * type. This allows to + * use a local extension of the material manager in teh lcsim track fitting + * code. + * * @param helix * @return a list of ScatterAngle. */ @@ -50,8 +54,9 @@ } /** - * Extra interface to keep a function returning the same type as the lcsim version - * + * Extra interface to keep a function returning the same type as the lcsim + * version + * * @param helix * @return a list of ScatterAngle. */ @@ -62,19 +67,19 @@ /** * Find scatter points along helix using the local material manager - * + * * @param helix * @return the points of scatter along the helix */ public ScatterPoints FindHPSScatterPoints(HelicalTrackFit helix) { if (_debug) { System.out.printf("\n%s: FindHPSScatters() for helix:\n%s\n", this.getClass().getSimpleName(), helix.toString()); - System.out.printf("%s: momentum is p=%f,R=%f,B=%f \n", this.getClass().getSimpleName(),helix.p(Math.abs(_bfield)),helix.R(),_bfield); - } - - // Check that B Field is set - if (_bfield == 0.) - throw new RuntimeException("B Field must be set before calling FindScatters method"); + System.out.printf("%s: momentum is p=%f,R=%f,B=%f \n", this.getClass().getSimpleName(), helix.p(Math.abs(_bfield)), helix.R(), _bfield); + } +// MG TURN THIS OFF SO IT DOESN'T ABORT STRAIGHT TRACKS +// // Check that B Field is set +// if (_bfield == 0.) +// throw new RuntimeException("B Field must be set before calling FindScatters method"); // Create a new list to contain the mutliple scatters // List<ScatterAngle> scatters = new ArrayList<ScatterAngle>(); @@ -101,7 +106,6 @@ System.out.printf("%s: intersection position %s\n", this.getClass().getSimpleName(), pos.toString()); // find the track direction at the plane - double s = HelixUtils.PathToXPlane(helix, pos.x(), 0., 0).get(0); if (_debug) @@ -118,7 +122,10 @@ if (_debug) System.out.printf("%s: material traversed: %f R.L. (%fmm) \n", this.getClass().getSimpleName(), radlen, vol.getMaterialTraversed(dir)); - double p = helix.p(this._bfield); +// double p = helix.p(this._bfield); + double p = 1.0; // set default momentum to 1.0 + if (_bfield != 0) + p = helix.p(this._bfield); double msangle = this.msangle(p, radlen); ScatterAngle scat = new ScatterAngle(s, msangle); @@ -129,12 +136,10 @@ ScatterPoint scatterPoint = new ScatterPoint(vol.getDetectorElement(), scat); scatters.addPoint(scatterPoint); - } else { + } else if (_debug) System.out.printf("\n%s: helix did not intersect this volume \n", this.getClass().getSimpleName()); - - } } @@ -144,20 +149,18 @@ if (_debug) { System.out.printf("\n%s: found %d scatters for this helix:\n", this.getClass().getSimpleName(), scatters.getPoints().size()); System.out.printf("%s: %10s %10s\n", this.getClass().getSimpleName(), "s (mm)", "theta(rad)"); - for (ScatterPoint p : scatters.getPoints()) { + for (ScatterPoint p : scatters.getPoints()) System.out.printf("%s: %10.2f %10f\n", this.getClass().getSimpleName(), p.getScatterAngle().PathLen(), p.getScatterAngle().Angle()); - } } return scatters; } public Hep3Vector getHelixIntersection(HelicalTrackFit helix, ScatteringDetectorVolume plane) { - if (SiStripPlane.class.isInstance(plane)) { + if (SiStripPlane.class.isInstance(plane)) return getHelixIntersection(helix, (SiStripPlane) plane); - } else { + else throw new UnsupportedOperationException("This det volume type is not supported yet."); - } } /* @@ -193,7 +196,6 @@ // Consider the plane as pure x-plane i.e. no rotations // -> this is not very general, as it assumes that strips are (mostly) along y -> FIX // THIS!? - // Transformation from tracking to detector frame Hep3Vector pos_det = VecOp.mult(VecOp.inverse(CoordinateTransformations.getMatrix()), pos); Hep3Vector direction_det = VecOp.mult(VecOp.inverse(CoordinateTransformations.getMatrix()), direction); @@ -212,7 +214,6 @@ double delta_w = -1.0 * pos_sensor.z() / direction_sensor.z(); // find the point where it crossed the plane - Hep3Vector pos_int = VecOp.add(pos_sensor, VecOp.mult(delta_w, direction_sensor)); Hep3Vector pos_int_det = plane.getSensor().getReadoutElectrodes(ChargeCarrier.HOLE).getLocalToGlobal().transformed(pos_int); // find the intercept in the tracking frame @@ -229,14 +230,12 @@ System.out.printf("%s: Inside result sensor: %s module: %s\n", this.getClass().getSimpleName(), result_inside.toString(), result_inside_module.toString()); boolean isInsideSolid = false; - if (result_inside.equals(Inside.INSIDE) || result_inside.equals(Inside.SURFACE)) { + if (result_inside.equals(Inside.INSIDE) || result_inside.equals(Inside.SURFACE)) isInsideSolid = true; - } boolean isInsideSolidModule = false; - if (result_inside_module.equals(Inside.INSIDE) || result_inside_module.equals(Inside.SURFACE)) { + if (result_inside_module.equals(Inside.INSIDE) || result_inside_module.equals(Inside.SURFACE)) isInsideSolidModule = true; - } boolean isInside = true; if (Math.abs(pos_int.x()) > plane.getMeasuredDimension() / 2.0) { @@ -254,30 +253,27 @@ if (!isInside) return null; - if (this._debug) { + if (this._debug) System.out.printf("%s: found simple intercept at %s \n", this.getClass().getSimpleName(), pos_int_trk.toString()); - } // Check if it's inside sensor and module and if it contradicts the manual calculation // For now: trust manual calculation and output warning if it's outside BOTH sensor AND module - if (!isInsideSolid) { if (_debug) System.out.printf("%s: manual calculation says inside sensor, inside solid says outside -> contradiction \n", this.getClass().getSimpleName()); if (isInsideSolidModule) { if (_debug) System.out.printf("%s: this intercept is outside sensor but inside module\n", this.getClass().getSimpleName()); - } else { + } else if (_debug) System.out.printf("%s: warning: this intercept at %s, in sensor frame %s, (sensor origin at %s ) is outside sensor and module!\n", this.getClass().getSimpleName(), pos_int_trk.toString(), pos_int.toString(), plane.origin().toString()); - } } // TODO Catch special cases where the incidental iteration procedure seem to fail if (helix.p(Math.abs(_bfield)) < 0.5) { if (this._debug) - System.out.printf("%s: momentum is low (p=%f,R=%f,B=%f), skip the iterative calculation\n", this.getClass().getSimpleName(),helix.p(Math.abs(_bfield)),helix.R(),_bfield); + System.out.printf("%s: momentum is low (p=%f,R=%f,B=%f), skip the iterative calculation\n", this.getClass().getSimpleName(), helix.p(Math.abs(_bfield)), helix.R(), _bfield); return pos_int_trk; } @@ -293,36 +289,31 @@ return pos_int_trk; } - if (this._debug) { + if (this._debug) System.out.printf("%s: iterative helix intercept point at %s (diff to approx: %s) \n", this.getClass().getSimpleName(), pos_iter_trk.toString(), VecOp.sub(pos_iter_trk, pos_int_trk).toString()); - } // find position in sensor frame Hep3Vector pos_iter_det = VecOp.mult(VecOp.inverse(CoordinateTransformations.getMatrix()), pos_iter_trk); Hep3Vector pos_iter_sensor = plane.getSensor().getGeometry().getGlobalToLocal().transformed(VecOp.mult(VecOp.inverse(CoordinateTransformations.getMatrix()), pos_iter_trk)); - if (this._debug) { + if (this._debug) System.out.printf("%s: found iterative helix intercept in sensor coordinates at %s\n", this.getClass().getSimpleName(), pos_iter_sensor.toString()); - } - + result_inside = plane.getDetectorElement().getGeometry().getPhysicalVolume().getMotherLogicalVolume().getSolid().inside(pos_iter_sensor); result_inside_module = plane.getSensor().getGeometry().getDetectorElement().getParent().getGeometry().inside(pos_iter_det); - if (this._debug) { + if (this._debug) System.out.printf("%s: Inside result sensor: %s module: %s\n", this.getClass().getSimpleName(), result_inside.toString(), result_inside_module.toString()); - } - + isInsideSolid = false; - - if (result_inside.equals(Inside.INSIDE) || result_inside.equals(Inside.SURFACE)) { + + if (result_inside.equals(Inside.INSIDE) || result_inside.equals(Inside.SURFACE)) isInsideSolid = true; - } isInsideSolidModule = false; - - if (result_inside_module.equals(Inside.INSIDE) || result_inside_module.equals(Inside.SURFACE)) { + + if (result_inside_module.equals(Inside.INSIDE) || result_inside_module.equals(Inside.SURFACE)) isInsideSolidModule = true; - } isInside = true; if (Math.abs(pos_iter_sensor.x()) > plane.getMeasuredDimension() / 2.0) { @@ -340,28 +331,22 @@ // Check if it's inside sensor and module and if it contradicts the manual calculation // For now: trust manual calculation and output warning if it's outside BOTH sensor AND // module -> FIX THIS!? - if (!isInsideSolid) { - if (_debug) { + if (_debug) System.out.printf("%s: manual iterative calculation says inside sensor, inside solid says outside -> contradiction \n", this.getClass().getSimpleName()); - } if (isInsideSolidModule) { - if (_debug) { + if (_debug) System.out.printf("%s: this iterative intercept is outside sensor but inside module\n", this.getClass().getSimpleName()); - } - } else { - if (_debug) { + } else + if (_debug) System.out.printf("%s: warning: this iterative intercept %s, sensor frame %s, (sensor origin %s ) is outside sensor and module!\n", this.getClass().getSimpleName(), pos_iter_trk.toString(), pos_iter_sensor.toString(), plane.origin().toString()); - } - } } if (!isInside) return null; - if (this._debug) { + if (this._debug) System.out.printf("%s: found intercept at %s \n", this.getClass().getSimpleName(), pos_iter_trk.toString()); - } return pos_iter_trk; } @@ -377,7 +362,8 @@ } /** - * Nested class to encapsulate the scatter angles and which detector element it is related to + * Nested class to encapsulate the scatter angles and which detector element + * it is related to */ public class ScatterPoint implements Comparable<ScatterPoint> { @@ -405,7 +391,7 @@ /** * Nested class to encapsulate a list of scatters - * + * */ public class ScatterPoints { @@ -435,11 +421,9 @@ } public ScatterPoint getScatterPoint(IDetectorElement detectorElement) { - for (ScatterPoint p : _points) { - if (p.getDet().equals(detectorElement)) { + for (ScatterPoint p : _points) + if (p.getDet().equals(detectorElement)) return p; - } - } return null; } } Modified: java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/recon/tracking/nobfield/StraightTrackFinder.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/recon/tracking/nobfield/StraightTrackFinder.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/recon/tracking/nobfield/StraightTrackFinder.java Mon Nov 3 01:04:28 2014 @@ -1,272 +1,257 @@ +/* + * SeedTrackFinder.java + * + * Created on January 22, 2008, 9:39 AM + * + */ package org.hps.recon.tracking.nobfield; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; -import org.hps.recon.tracking.HitCollectionUtilites; -import org.hps.recon.tracking.nobfield.TrackCollectionUtilities; -import org.lcsim.event.EventHeader; -import org.lcsim.event.Track; -import org.lcsim.event.TrackerHit; +import java.util.Set; +import org.lcsim.event.MCParticle; import org.lcsim.fit.helicaltrack.HelicalTrackHit; -import org.lcsim.fit.line.SlopeInterceptLineFit; -import org.lcsim.fit.line.SlopeInterceptLineFitter; -import org.lcsim.geometry.Detector; -import org.lcsim.util.Driver; +import org.lcsim.recon.tracking.seedtracker.HitManager; +import org.lcsim.recon.tracking.seedtracker.SeedCandidate; +import org.lcsim.recon.tracking.seedtracker.SeedLayer; +import org.lcsim.recon.tracking.seedtracker.SeedStrategy; +import org.lcsim.recon.tracking.seedtracker.TrackCheck; +import org.lcsim.recon.tracking.seedtracker.diagnostic.ISeedTrackerDiagnostics; /** - * - * @author mgraham + * Find straight tracks in 0-bfield + * + * copied/modified from org.lcsim.recon.tracking.SeedTrackFinder + * @author Mathew Graham + */ -public class StraightTrackFinder extends Driver { - - // Debug flag. - private boolean debug = true; - // Tracks found across all events. - int ntracks = 0; - // Number of events processed. - int nevents = 0; - // Cache detector object. - Detector detector = null; - // Tracking strategies resource path. - private String strategyResource = "HPS-Test-4pt1.xml"; - // Output track collection. - private String trackCollectionName = "StraightTracks"; - // HelicalTrackHit input collection. - private String stInputCollectionName = "HelicalTrackHits"; - // Include MS (done by removing XPlanes from the material manager results) - private boolean includeMS = true; - // number of repetitive fits on confirmed/extended tracks - private int _iterativeConfirmed = 3; - // use HPS implementation of material manager - private boolean _useHPSMaterialManager = true; - - private TrackChecker checkerTrack = new TrackChecker(); - private HitOnTrackChecker checkerHOT = new HitOnTrackChecker(); - - private SlopeInterceptLineFitter _lfitter = new SlopeInterceptLineFitter(); - - public void setDebug(boolean debug) { - this.debug = debug; - } - - /** - * Set the tracking strategy resource. - * - * @param strategyResource The absolute path to the strategy resource in the - * hps-java jar. - */ - public void setStrategyResource(String strategyResource) { - this.strategyResource = strategyResource; - } - - public void setInputHitCollectionName(String inputHitCollectionName) { - this.stInputCollectionName = inputHitCollectionName; - } - - public void setTrackCollectionName(String trackCollectionName) { - this.trackCollectionName = trackCollectionName; - } - - public void setIncludeMS(boolean incMS) { - this.includeMS = incMS; - } - - /** - * Set to enable the use of the HPS material manager implementation - * - * @param useHPSMaterialManager switch - */ - public void setUseHPSMaterialManager(boolean useHPSMaterialManager) { - this._useHPSMaterialManager = useHPSMaterialManager; - } - - @Override - public void detectorChanged(Detector detector) { - // Cache Detector object. - this.detector = detector; -// initialize(); - super.detectorChanged(detector); - } - - @Override - public void process(EventHeader event) { - if (!event.hasCollection(HelicalTrackHit.class, stInputCollectionName)) - return; - - List<HelicalTrackHit> allHits = event.get(HelicalTrackHit.class, stInputCollectionName); - - List<List<HelicalTrackHit>> splitTopBot = HitCollectionUtilites.SplitTopBottomHits(allHits); - // will always have top(=0) and bottom(=1) lists (though they may be empty) - List<HelicalTrackHit> topHits = splitTopBot.get(0); - List<HelicalTrackHit> bottomHits = splitTopBot.get(1); - //a simple strategy...eventually implement SeedTracker strategies? - int nTotLayers = 6; - int nSeed = 3; - int nExtra = nTotLayers - nSeed; - int[] seedStrategy = {1, 3, 5}; - int[] extendStrategy = {7, 9, 11}; - int minHits = 4; - - TrackChecker checkerTrack = new TrackChecker(); - HitOnTrackChecker checkerHOT = new HitOnTrackChecker(); - -// List<StraightTrack> seeds = getSeeds(seedStrategy, topHits); - List<StraightTrack> seeds = getSeeds(seedStrategy, allHits); - System.out.println("Found " + seeds.size() + " seeds"); - - List<StraightTrack> extendedSeeds = new ArrayList<>(); - for (StraightTrack seed : seeds) - extendTrack(extendStrategy, 0, seed, allHits, extendedSeeds); -// extendTrack(extendStrategy, 0, seed, topHits, extendedSeeds); - - System.out.println("Prepruning :Found " + extendedSeeds.size() + " extended seeds"); - - //remove tracks with more than m overlaping hits...pick best chi2 - //... - List<StraightTrack> finalTracks = new ArrayList<>(); - for (StraightTrack track : extendedSeeds) { - boolean isbest = TrackCollectionUtilities.pruneTrackList((ArrayList<Track>) (ArrayList) extendedSeeds, track, 1); - if (isbest) - finalTracks.add(track); - } - - System.out.println("Postpruning :Found " + finalTracks.size() + " extended seeds"); - event.put(trackCollectionName, finalTracks); - } - - public SlopeInterceptLineFit FitToLine(List<HelicalTrackHit> hits, int projection) { - SlopeInterceptLineFit _lfit; - int npix = hits.size(); - double[] s = new double[npix]; - double[] q = new double[npix]; - double[] dq = new double[npix]; - - // Store the coordinates and errors for the line fit - for (int i = 0; i < npix; i++) { - HelicalTrackHit hit = hits.get(i); - s[i] = hit.z();//probably isn't quite right...track length is not z - if (projection == 0) { //do x vs z; - q[i] = hit.x(); - dq[i] = Math.sqrt(hit.getCorrectedCovMatrix().e(0, 0)); - } else { - q[i] = hit.y(); - dq[i] = Math.sqrt(hit.getCorrectedCovMatrix().e(1, 1)); - } - } - - // Call the line fitter and check for success - boolean success = _lfitter.fit(s, q, dq, npix); - - if (!success) - System.out.println("Something is broken in the line fit"); - // Save the line fit, chi^2, and DOF - _lfit = _lfitter.getFit(); - return _lfit; - - } - - private StraightTrack makeTrack(List<HelicalTrackHit> hits, SlopeInterceptLineFit xfit, SlopeInterceptLineFit yfit) { - StraightTrack track = new StraightTrack(); - double[] pars = {-99, -99, -99, -99, -99};//this needs to have 5 fields to implement Track - pars[0] = xfit.intercept(); - pars[1] = xfit.slope(); - pars[2] = yfit.intercept(); - pars[3] = yfit.slope(); - track.setTrackParameters(pars); - track.setChi2(xfit.chisquared(), yfit.chisquared()); - track.setNDF(xfit.ndf()+yfit.ndf()); - for (TrackerHit hit : hits) - track.addHit(hit); - // TODO: set convariance, - return track; - } - - private StraightTrack makeTrack(List<HelicalTrackHit> hits) { - SlopeInterceptLineFit xfit = FitToLine(hits, 0); - SlopeInterceptLineFit yfit = FitToLine(hits, 1); - if (debug) - System.out.println("xfit = " + xfit.toString()); - if (debug) - System.out.println("yfit = " + yfit.toString()); - return makeTrack(hits, xfit, yfit); - } - - /* - * Get all seed combinations that make sense (pass checkSeed) - * currently, just assume there are 3 seed layers (don't have to be first 3 though. - */ - private List<StraightTrack> getSeeds(int[] seedLayers, List<HelicalTrackHit> hits) { - List<StraightTrack> seeds = new ArrayList<>(); - int nseeds = seedLayers.length; - if (nseeds == 3)//TODO ... set this up so that this works for arbitrary nseeds...use recursion - for (HelicalTrackHit h1 : HitCollectionUtilites.GetSortedHits(hits, seedLayers[0])) { - if (debug) - System.out.println(h1.toString()); - for (HelicalTrackHit h2 : HitCollectionUtilites.GetSortedHits(hits, seedLayers[1])) { - if (debug) - System.out.println(h2.toString()); - for (HelicalTrackHit h3 : HitCollectionUtilites.GetSortedHits(hits, seedLayers[2])) { - if (debug) - System.out.println(h3.toString()); - //make a 3-hit test track...see if it passes CheckTrack - List<HelicalTrackHit> testTrack = new ArrayList<HelicalTrackHit>(); - testTrack.add(h1); - testTrack.add(h2); - testTrack.add(h3); - StraightTrack trk = makeTrack(testTrack); - if (!checkerTrack.checkSeed(trk)) - break; - seeds.add(trk); +public class StraightTrackFinder { + + private HitManager _hitmanager; + private StraightTrackFitter _helixfitter; + private StraightTrackConfirmerExtender _confirmer; + private List<SeedCandidate> _trackseeds; + private ISeedTrackerDiagnostics _diag = null; + private Set<MCParticle> _seededmcp; + private Set<MCParticle> _confirmedmcp; + private TrackCheck _trackCheck; // set by SeedTracker + private boolean _debug = false; + + + /** + * Creates a new instance of SeedTrackFinder + */ + public StraightTrackFinder(HitManager hitmanager, StraightTrackFitter helixfitter) { + + // Save the pointers to the hit manager and helix fitter classes + _hitmanager = hitmanager; + _helixfitter = helixfitter; + + // Instantiate the Confirmer/Extender and Seed Candidate merging classes + _confirmer = new StraightTrackConfirmerExtender(_hitmanager, _helixfitter); + + // Create a list of track seeds that have been found + _trackseeds = new ArrayList<SeedCandidate>(); + + // Create a set of MC Particles that have been seeded, confirmed + _seededmcp = new HashSet<MCParticle>(); + _confirmedmcp = new HashSet<MCParticle>(); + + } + + public void setDiagnostic(ISeedTrackerDiagnostics d) { + + // Setup the diagnostics for this class and the classes used by this class + _diag = d; + _confirmer.setDiagnostics(_diag); + } + + public boolean FindTracks(SeedStrategy strategy, double bfield) { + + // Instantiate the fast hit checker + // FastCheck checker = new FastCheck(strategy, bfield, _diag); + // if(_applySectorBinning) checker.setDoSectorBinCheck(_hitmanager.getSectorManager()); +// SeedSectoring ss = new SeedSectoring(_hitmanager, strategy, bfield, _applySectorBinning); + List<SeedLayer> seeds = strategy.getLayers(SeedLayer.SeedType.Seed); + +// List<List<Sector>> sslist = ss.SeedSectors(); +// if(_debug) +// System.out.println(this.getClass().getSimpleName()+": number of SeedSectors="+sslist.size()); + // Loop over the valid sector combinations + // for (List<Sector> slist : sslist) { + // Loop over the first seed layer + for (HelicalTrackHit hit1 : _hitmanager.getTrackerHits(seeds.get(0))) + + // Loop over the second seed layer and check that we have a hit pair consistent with our strategy + for (HelicalTrackHit hit2 : _hitmanager.getTrackerHits(seeds.get(1))) { + + // Call _trackCheck if set + if (_trackCheck != null) { + SeedCandidate tempseed = new SeedCandidate(strategy, bfield); + tempseed.addHit(hit1); + tempseed.addHit(hit2); + if (!_trackCheck.checkSeed(tempseed)) + continue; + } + +// // Check if the pair of hits is consistent with the current strategy +// if (!checker.TwoPointCircleCheck(hit1, hit2, null)) { +// if (_diag != null) _diag.fireCheckHitPairFailed(hit1, hit2); +// continue; +// } + // Loop over the third seed layer and check that we have a hit triplet consistent with our strategy + for (HelicalTrackHit hit3 : _hitmanager.getTrackerHits(seeds.get(2))) { + // Call _trackCheck if set + if (_trackCheck != null) { + SeedCandidate tempseed2 = new SeedCandidate(strategy, bfield); + tempseed2.addHit(hit1); + tempseed2.addHit(hit3); + if (!_trackCheck.checkSeed(tempseed2)) + continue; + + SeedCandidate tempseed3 = new SeedCandidate(strategy, bfield); + tempseed3.addHit(hit2); + tempseed3.addHit(hit3); + if (!_trackCheck.checkSeed(tempseed3)) + continue; } + + // Form a seed candidate from the seed hits + SeedCandidate seed = new SeedCandidate(strategy, bfield); + seed.addHit(hit1); + seed.addHit(hit2); + seed.addHit(hit3); + +// // Check if the triplet of hits is consistent with the current strategy +// if (!checker.ThreePointHelixCheck(hit1, hit2, hit3)) { +// +// if (_diag != null) { +// if (seed.isTrueSeed()) +// _diag.fireCheckHitTripletFailed(hit1, hit2, hit3); +// } +// continue; +// } + // Form a seed candidate from the seed hits + // If it's a true seed, add the MC Particle to those that were seeded + if (_diag != null) + if (seed.isTrueSeed()) + _seededmcp.addAll(seed.getMCParticles()); + + if (_debug) + System.out.println(this.getClass().getSimpleName() + ": fit the candidate"); + + // See if we can fit a helix to this seed candidate + boolean success = _helixfitter.FitCandidate(seed, strategy); + + if (!success) + continue; + + if (_debug) + System.out.println(this.getClass().getSimpleName() + ": fit success"); + + // Save the helix fit + seed.setHelix(_helixfitter.getHelix()); + + // Check the seed - hook for plugging in external constraint + if (_trackCheck != null) + if (!_trackCheck.checkSeed(seed)) + continue; + + // See if we can confirm this seed candidate + success = _confirmer.Confirm(seed, strategy, bfield); + if (!success) + continue; + + if (_debug) + System.out.println(this.getClass().getSimpleName() + ": confirmed seed"); + + // Confirmed a seed - if it's a true seed, add the MC Particle to those that were confirmed + if (_diag != null) + if (seed.isTrueSeed()) + _confirmedmcp.addAll(seed.getMCParticles()); + + if (_debug) + System.out.println(this.getClass().getSimpleName() + ": try to extend"); + + // Try to extend each confirmed seed candidates to make a track candidate + List<SeedCandidate> confirmedlist = _confirmer.getResult(); + for (SeedCandidate confirmedseed : confirmedlist) + + // See if we can extend this seed candidate + _confirmer.Extend(confirmedseed, strategy, bfield, _trackseeds); } } - return seeds; - } - - /* - * recursively extend the seeds through all of the extend layers.. - * ...I think this should work... - */ - private void extendTrack(int[] extendLayers, int n, StraightTrack origTrack, List<HelicalTrackHit> hits, List<StraightTrack> trackList) { - if (n >= extendLayers.length) { - if (debug) - System.out.println("Done finding this track through all " + n + " extra layers"); - trackList.add(origTrack); - return; - } - - boolean cannotExtendThisLayer = true; - if (debug) - System.out.println("Extending to layer " + extendLayers[n]); - for (HelicalTrackHit h : HitCollectionUtilites.GetSortedHits(hits, extendLayers[n])) { - //let's see if this hit makes sense to add to original track - if (!checkerHOT.checkNewHit(origTrack, h)) - continue; - - List<TrackerHit> origHits = origTrack.getTrackerHits(); - //make a new list and cast them as HelicalTrackHits (Track only stores TrackerHits) - List<HelicalTrackHit> newHits = new ArrayList<>(); - for (TrackerHit oh : origHits) { - HelicalTrackHit hoh = (HelicalTrackHit) oh; - System.out.println(hoh.getPosition()[0]); - newHits.add(hoh); - } - //add the new hit to the list & make new track - newHits.add(h); - StraightTrack newTrack = makeTrack(newHits); - //check the new track after we've added this hit - if (!checkerTrack.checkTrack(newTrack)) - continue; - cannotExtendThisLayer = false; - //extend again to the next layer - extendTrack(extendLayers, n + 1, newTrack, hits, trackList); - } - - //didn't find any hits in this layer that match the track...but let's try the next one - if (cannotExtendThisLayer) - extendTrack(extendLayers, n + 1, origTrack, hits, trackList); - - return; + +// // Done with track finding for this strategy +// if (_diag != null) +// _diag.fireFinderDone(_trackseeds, _seededmcp); + return _trackseeds.size() > 0; + } + + /** + * Return the list of track candidates. + * + * @return track candidates + */ + public List<SeedCandidate> getTrackSeeds() { + return _trackseeds; + } + + /** + * Clear the list of track candidates accumulated from previous calls to + * SeedTrackFinder (typically done before starting a new event). + */ + public void clearTrackSeedList() { + _trackseeds.clear(); + _seededmcp.clear(); + _confirmedmcp.clear(); + } + + /** + * Set the maximum number of fits for a given seed in a confirm or extend + * step. + * + * @param maxfits maximum number of fits + */ + public void setMaxFit(int maxfits) { + _confirmer.setMaxFit(maxfits); + } + + /** + * Return the list of MCParticles that formed valid 3-hit seeds. + * + * @return list of seeded MCParticles + */ + public Set<MCParticle> getSeededMCParticles() { + return _seededmcp; + } + + /** + * Return the list of confirmed MCParticles. + * + * @return confirmed MCParticles + */ + public Set<MCParticle> getConfirmedMCParticles() { + return _confirmedmcp; + } + + /** + * Return the StraightTrackConfirmerExtender + * + * @return confirmer/extender object + * + */ + public StraightTrackConfirmerExtender getConfirmer() { + return _confirmer; + } + + public void setDebug(boolean debug) { + System.out.println("Setting " + this.getClass().getSimpleName() + " debug to " + debug); + _debug = debug; + } + public void setTrackCheck (TrackCheck checker){ + _trackCheck=checker; } } Modified: java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/svt/alignment/BuildCompact.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/svt/alignment/BuildCompact.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/main/java/org/hps/svt/alignment/BuildCompact.java Mon Nov 3 01:04:28 2014 @@ -30,7 +30,6 @@ import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; -import org.apache.commons.lang.StringUtils; import org.hps.conditions.deprecated.HPSSVTSensorSetup; //===> import org.hps.conditions.deprecated.SvtUtils; import org.hps.recon.tracking.CoordinateTransformations; @@ -48,6 +47,7 @@ import org.lcsim.detector.tracker.silicon.SiSensor; import org.lcsim.geometry.Detector; import org.lcsim.geometry.GeometryReader; +import org.lcsim.geometry.compact.converter.MilleParameter; import org.lcsim.util.xml.ElementFactory.ElementCreationException; @@ -56,7 +56,6 @@ private static int runNumber = -1; //1351; private static String detectorName = ""; //"HPS-TestRun-v7"; private static ConditionsManager conditionsManager = null; - private static double corrScaleFactor = -1.; private static Options createCmdLineOpts() { Options options = new Options(); @@ -147,98 +146,6 @@ } } - - private static class MilleParameter { - 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 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 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 getDim() { - int h = (int) (getHalf() * 1e4); - int t = (int) (getType() * 1e3); - return (int) Math.floor((id- h -t)/1e2); - } - - private int getSensor() { - int h = (int) (getHalf() * 1e4); - int t = (int) (getType() * 1e3); - int d = (int) (getDim() * 1e2); - return (id - h - t -d); - } - - public int getType() { - int h = (int) (getHalf() * 1e4); - return (int) Math.floor((id -h)/1e3); - } - - private int getHalf() { - return (int)Math.floor(id/1e4); - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public double getValue() { - return value; - } - - public void setValue(double value) { - this.value = value; - } - - public double getPresigma() { - return presigma; - } - - public void setPresigma(double presigma) { - this.presigma = presigma; - } - } - public static void main(String[] args) { Modified: java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/test/java/org/hps/recon/tracking/TrackRecoFromScratchTest.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/test/java/org/hps/recon/tracking/TrackRecoFromScratchTest.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/tracking/src/test/java/org/hps/recon/tracking/TrackRecoFromScratchTest.java Mon Nov 3 01:04:28 2014 @@ -16,7 +16,7 @@ public class TrackRecoFromScratchTest extends TestCase { static final String testURLBase = "http://www.lcsim.org/test/hps-java"; - static final String testFileName = "radmuon_12.lcio-1-1788.slcio"; + static final String testFileName = "TrackRecoFromScratchTest_radmuon_12.lcio-1-1788.slcio"; private final int nEvents = 10; public void testRecon() throws Exception Modified: java/branches/hps_java_trunk_HPSJAVA-255/users/pom.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/users/pom.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/users/pom.xml Mon Nov 3 01:04:28 2014 @@ -7,7 +7,7 @@ <groupId>org.hps</groupId> <artifactId>hps-parent</artifactId> <relativePath>../parent/pom.xml</relativePath> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <scm> <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/users/</url> Modified: java/branches/hps_java_trunk_HPSJAVA-255/users/src/main/java/org/hps/users/luca/FEETrigger.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/users/src/main/java/org/hps/users/luca/FEETrigger.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/users/src/main/java/org/hps/users/luca/FEETrigger.java Mon Nov 3 01:04:28 2014 @@ -29,8 +29,8 @@ // The number of cluster over threshold that must occur in a region // before a trigger occurs. - private int zone1Prescaling = 1000; - private int zone2Prescaling = 100; + private int zone1Prescaling = 50; + private int zone2Prescaling = 10; /** * Sets the energy threshold required for a cluster to be counted. @@ -91,10 +91,60 @@ // 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++; } - } + */ + //V2 + /* + 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++; } + */ + //V prova + /* + 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++; } + */ + //V7 + /* + if( ix > 19 || ix < -22) { zone3Count++; } + 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 + }*/ + //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 + */ + //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 + + } } } Modified: java/branches/hps_java_trunk_HPSJAVA-255/users/src/main/java/org/hps/users/luca/RawDataReader.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/users/src/main/java/org/hps/users/luca/RawDataReader.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/users/src/main/java/org/hps/users/luca/RawDataReader.java Mon Nov 3 01:04:28 2014 @@ -17,6 +17,8 @@ import org.lcsim.util.Driver; import org.lcsim.lcio.LCIOConstants; import java.io.PrintWriter; +import org.lcsim.geometry.IDDecoder; +import org.lcsim.event.CalorimeterHit; /** * @@ -28,7 +30,7 @@ private FileWriter writer2; String outputFileName = "raw1.txt"; String outputFileName2 = "raw2.txt"; - String rawCollectionName; + String rawCollectionName="EcalReadoutHits"; String ecalReadoutName = "EcalHits"; String ecalCollectionName = "EcalCorrectedHits"; double scale = 1.0; @@ -88,24 +90,170 @@ @Override public void process(EventHeader event) { - if (event.hasCollection(HPSRawCalorimeterHit.class, rawCollectionName)) { - // Get the list of ECal hits. - List<HPSRawCalorimeterHit> hits = event.get(HPSRawCalorimeterHit.class, rawCollectionName); - for(HPSRawCalorimeterHit hit : hits){ + + if (event.hasCollection(RawCalorimeterHit.class, rawCollectionName)) { + // Get the list of ECal hits + + List<RawCalorimeterHit> hits = event.get(RawCalorimeterHit.class, rawCollectionName); + IDDecoder dec = event.getMetaData(hits).getIDDecoder(); + for(RawCalorimeterHit hit : hits){ + dec.setID(hit.getCellID()); + int ix = dec.getValue("ix"); + int iy = dec.getValue("iy"); + int id=getCrystal(ix,iy); try{ - writer.append(hit.getCellID()+" "+hit.getAmplitude()); + writer.append(id+" "+hit.getAmplitude() + " \n"); } catch(IOException e){ System.err.println("Error closing utput file for event display."); } - try{writer2.append(hit.getAnalogHit().getIdentifierFieldValue("ix") + " " + hit.getAnalogHit().getIdentifierFieldValue("iy") + " " + hit.getAnalogHit().getRawEnergy()+" \n"); - } - - catch(IOException e){ - System.err.println("Error closing utput file for event display."); -} + } } else{System.out.println("NUOOO \n");} - } -} + + if(event.hasCollection(CalorimeterHit.class, "EcalHits")){ + List<CalorimeterHit> hits = event.get(CalorimeterHit.class, "EcalHits"); + for(CalorimeterHit hit : hits){ + int id=getCrystal(hit); + try{ + writer2.append(id + " " + hit.getRawEnergy() + "\n"); + } + catch(IOException e){System.err.println("Non riesco a scrivere raw2.");} + } + } + else{System.out.println("NUOOO hits \n");} + } + + + public int getCrystal (CalorimeterHit hit){ + int x,y,id=0; + x= (-1)*hit.getIdentifierFieldValue("ix"); + y= hit.getIdentifierFieldValue("iy"); + + if(y==5){ + if(x<0) + {id=x+24;} + else id= x+23; + } + + else if(y==4) + {if(x<0){ + id=x+70;} + else id=x+69;} + + else if(y==3) + {if(x<0){ + id=x+116;} + else id=x+115;} + + else if(y==2) + {if(x<0){ + id=x+162;} + else id=x+161;} + + else if(y==1) + {x=-x; + if(x>0){ + id=-x+208;} + else if(x==-1){id=208;} + else if(x<-1) id=-x+198;} + + else if(y==-1) + {x=-x; + if(x>0){ + id=-x+245;} + else if(x==-1 )id=245; + else if(x<-1){id=-x+235;}} + + + else if(y==-2) + {if(x<0){ + id=x+282;} + else id=x+281;} + + else if(y==-3) + {if(x<0){ + id=x+328;} + else id=x+327;} + + else if(y==-4) + {if(x<0){ + id=x+374;} + else id=x+373;} + + else if(y==-5) + {if(x<0){ + id=x+420;} + else id=x+419;} + + return id; + + } + + public int getCrystal (int ix, int iy){ + + int x,y,id=0; + x= (-1)*ix; + y= iy; + + if(y==5){ + if(x<0) + {id=x+24;} + else id= x+23; + } + + else if(y==4) + {if(x<0){ + id=x+70;} + else id=x+69;} + + else if(y==3) + {if(x<0){ + id=x+116;} + else id=x+115;} + + else if(y==2) + {if(x<0){ + id=x+162;} + else id=x+161;} + + else if(y==1) + {x=-x; + if(x>0){ + id=-x+208;} + else if(x==-1){id=208;} + else if(x<-1) id=-x+198;} + + else if(y==-1) + {x=-x; + if(x>0){ + id=-x+245;} + else if(x==-1 )id=245; + else if(x<-1){id=-x+235;}} + + + else if(y==-2) + {if(x<0){ + id=x+282;} + else id=x+281;} + + else if(y==-3) + {if(x<0){ + id=x+328;} + else id=x+327;} + + else if(y==-4) + {if(x<0){ + id=x+374;} + else id=x+373;} + + else if(y==-5) + {if(x<0){ + id=x+420;} + else id=x+419;} + + return id; + + } +} Modified: java/branches/hps_java_trunk_HPSJAVA-255/users/src/main/java/org/hps/users/mgraham/StraightTrackAnalysis.java ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/users/src/main/java/org/hps/users/mgraham/StraightTrackAnalysis.java (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/users/src/main/java/org/hps/users/mgraham/StraightTrackAnalysis.java Mon Nov 3 01:04:28 2014 @@ -1,13 +1,18 @@ package org.hps.users.mgraham; import hep.aida.IHistogram1D; +import java.util.HashMap; import java.util.List; -import org.hps.recon.tracking.nobfield.StraightTrack; +import java.util.Map; +import org.hps.analysis.examples.TrackAnalysis; import org.lcsim.event.EventHeader; +import org.lcsim.event.LCRelation; import org.lcsim.event.RawTrackerHit; +import org.lcsim.event.RelationalTable; import org.lcsim.event.SimTrackerHit; import org.lcsim.event.Track; import org.lcsim.event.TrackerHit; +import org.lcsim.event.base.BaseRelationalTable; import org.lcsim.geometry.Detector; import org.lcsim.util.Driver; import org.lcsim.util.aida.AIDA; @@ -23,6 +28,9 @@ private String mcSvtHitsName = "TrackerHits"; private String rawHitsName = "RawTrackerHitMaker_RawTrackerHits"; private String clustersName = "StripClusterer_SiTrackerHitStrip1D"; + private final String helicalTrackMCRelationsCollectionName = "HelicalTrackMCRelations"; + private final String helicalTrackHitRelationsCollectionName = "HelicalTrackHitRelations"; + private final String rotatedHelicalTrackHitRelationsCollectionName = "RotatedHelicalTrackHitRelations"; private String hthName = "HelicalTrackHits"; private String tracksName = "StraightTracks"; @@ -72,16 +80,57 @@ aida.histogram1D("Number of Layers Hit").fill(totLayers); List<Track> tracks = event.get(Track.class, tracksName); aida.histogram1D("Number of Tracks found").fill(tracks.size()); + + //make some maps and relation tables + Map<Track, TrackAnalysis> tkanalMap = new HashMap<Track, TrackAnalysis>(); + RelationalTable hittomc = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED); + List<LCRelation> mcrelations = event.get(LCRelation.class, helicalTrackMCRelationsCollectionName); + for (LCRelation relation : mcrelations) + if (relation != null && relation.getFrom() != null && relation.getTo() != null) + hittomc.add(relation.getFrom(), relation.getTo()); + + System.out.println("Size of hittomc collection " + hittomc.size()); + RelationalTable mcHittomcP = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED); + // Get the collections of SimTrackerHits + List<List<SimTrackerHit>> simcols = event.get(SimTrackerHit.class); + // Loop over the SimTrackerHits and fill in the relational table + for (List<SimTrackerHit> simlist : simcols) + for (SimTrackerHit simhit : simlist) + if (simhit.getMCParticle() != null) + mcHittomcP.add(simhit, simhit.getMCParticle()); + + RelationalTable trktomc = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED); + RelationalTable rawtomc = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED); + if (event.hasCollection(LCRelation.class, "SVTTrueHitRelations")) { + List<LCRelation> trueHitRelations = event.get(LCRelation.class, "SVTTrueHitRelations"); + for (LCRelation relation : trueHitRelations) + if (relation != null && relation.getFrom() != null && relation.getTo() != null) + rawtomc.add(relation.getFrom(), relation.getTo()); + } + + RelationalTable hittostrip = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED); + List<LCRelation> hitrelations = event.get(LCRelation.class, helicalTrackHitRelationsCollectionName); + for (LCRelation relation : hitrelations) + if (relation != null && relation.getFrom() != null && relation.getTo() != null) + hittostrip.add(relation.getFrom(), relation.getTo()); + + RelationalTable hittorotated = new BaseRelationalTable(RelationalTable.Mode.ONE_TO_ONE, RelationalTable.Weighting.UNWEIGHTED); + List<LCRelation> rotaterelations = event.get(LCRelation.class, rotatedHelicalTrackHitRelationsCollectionName); + for (LCRelation relation : rotaterelations) + if (relation != null && relation.getFrom() != null && relation.getTo() != null) + hittorotated.add(relation.getFrom(), relation.getTo()); + for (Track trk : tracks) { - StraightTrack stght = (StraightTrack) trk; - aida.histogram1D("x0", 50, -2, 2).fill(stght.getTrackParameters()[0]); - aida.histogram1D("y0", 50, -2, 2).fill(stght.getTrackParameters()[2]); - aida.histogram1D("xz slope", 50, -0.2, 0.25).fill(stght.getTrackParameters()[1]); - aida.histogram1D("yz slope", 50, -0.25, 0.25).fill(stght.getTrackParameters()[3]); - aida.histogram1D("track chi2 per ndf", 50, 0, 10).fill(stght.getChi2()/stght.getNDF()); - aida.histogram1D("track nhits", 50, 0, 10).fill(stght.getTrackerHits().size()); +// StraightTrack stght = (StraightTrack) trk; + aida.histogram1D("d0", 50, -2, 2).fill(trk.getTrackParameters()[0]); + aida.histogram1D("z0", 50, -2, 2).fill(trk.getTrackParameters()[3]); + aida.histogram1D("xy slope", 50, -0.2, 0.25).fill(trk.getTrackParameters()[1]); + aida.histogram1D("sz slope", 50, -0.25, 0.25).fill(trk.getTrackParameters()[4]); + aida.histogram1D("track chi2 per ndf", 50, 0, 2).fill(trk.getChi2() / trk.getNDF()); + aida.histogram1D("track nhits", 50, 0, 10).fill(trk.getTrackerHits().size()); + TrackAnalysis tkanal = new TrackAnalysis(trk, hittomc); + } - } } } Modified: java/branches/hps_java_trunk_HPSJAVA-255/util/pom.xml ============================================================================= --- java/branches/hps_java_trunk_HPSJAVA-255/util/pom.xml (original) +++ java/branches/hps_java_trunk_HPSJAVA-255/util/pom.xml Mon Nov 3 01:04:28 2014 @@ -7,7 +7,7 @@ <groupId>org.hps</groupId> <artifactId>hps-parent</artifactId> <relativePath>../parent/pom.xml</relativePath> - <version>3.0.3-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <scm> <url>http://java.freehep.org/svn/repos/hps/list/java/trunk/util/</url>