hps-java/src/main/java/org/lcsim/hps/users/omoreno
diff -u -r1.5 -r1.6
--- SvtPerformance.java 30 Jul 2012 06:29:32 -0000 1.5
+++ SvtPerformance.java 24 May 2013 01:54:16 -0000 1.6
@@ -9,19 +9,27 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import org.lcsim.detector.tracker.silicon.SiSensor;
import org.lcsim.event.EventHeader;
import org.lcsim.event.RawTrackerHit;
import org.lcsim.event.Track;
import org.lcsim.event.TrackerHit;
+import org.lcsim.fit.helicaltrack.HelicalTrackCross;
import org.lcsim.fit.helicaltrack.HelicalTrackHit;
+import org.lcsim.fit.helicaltrack.HelicalTrackStrip;
import org.lcsim.geometry.Detector;
import org.lcsim.hps.monitoring.AIDAFrame;
import org.lcsim.hps.recon.ecal.HPSEcalCluster;
+import org.lcsim.hps.recon.tracking.HPSSVTCalibrationConstants;
+import org.lcsim.hps.recon.tracking.HPSSVTCalibrationConstants.ChannelConstants;
+import org.lcsim.hps.recon.tracking.HPSShapeFitParameters;
+import org.lcsim.hps.recon.tracking.HPSShaperAnalyticFitAlgorithm;
import org.lcsim.hps.recon.tracking.SvtTrackExtrapolator;
import org.lcsim.hps.recon.tracking.SvtUtils;
import org.lcsim.hps.recon.tracking.TrackUtils;
+import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D;
import org.lcsim.recon.tracking.seedtracker.SeedTrack;
import org.lcsim.util.Driver;
import org.lcsim.util.aida.AIDA;
@@ -30,50 +38,34 @@
* Svt Performance Plots
*
* @author Omar Moreno <[log in to unmask]>
- * @version $Id: SvtPerformance.java,v 1.5 2012/07/30 06:29:32 omoreno Exp $
+ * @version $Id: SvtPerformance.java,v 1.6 2013/05/24 01:54:16 omoreno Exp $
*/
public class SvtPerformance extends Driver {
private AIDA aida;
- private List<AIDAFrame> frames = new ArrayList<AIDAFrame>();
- private List<IHistogram1D> histos1D = new ArrayList<IHistogram1D>();
- private List<IHistogram2D> histos2D = new ArrayList<IHistogram2D>();
private List<IPlotter> plotters = new ArrayList<IPlotter>();
TrackUtils trkUtil = new TrackUtils();
SvtTrackExtrapolator extrapolator = new SvtTrackExtrapolator();
+ HPSShaperAnalyticFitAlgorithm shaperFitter = new HPSShaperAnalyticFitAlgorithm();
- double totalTracksFound = 0;
- double totalTopTracksFound = 0;
- double totalBottomTracksFound = 0;
- double totalNumberEvents = 0;
- double totalNumberSingleTrkEvents = 0;
- double possibleTracks = 0;
- double possibleTopTracks = 0;
- double possibleBottomTracks = 0;
- double totalFourHitTracks = 0;
- double totalTracksWith5LayersHit = 0;
+ String sensorName = null;
+
int plotterIndex = 0;
+ double totalNumberOfEvents = 0;
double totalTracks = 0;
double totalTwoTrackEvents = 0;
-
+ double idealNoise = 886; // e-
+
double[] topLayers;
double[] bottomLayers;
- Map<Integer, List<HelicalTrackHit>> topLayerMap = new HashMap<Integer, List<HelicalTrackHit>>();
- Map<Integer, List<HelicalTrackHit>> bottomLayerMap = new HashMap<Integer, List<HelicalTrackHit>>();
- boolean debug = true;
- boolean enableHitPositionPlots = false;
-
- // Plot flags
+ boolean debug = false;
// Collection Names
- private String stereoHitCollectionName = "HelicalTrackHits";
private String trackCollectionName = "MatchedTracks";
- private String ecalClustersCollectionName = "EcalClusters";
- public SvtPerformance() {
- }
+ public SvtPerformance() {}
// --- Setters ---//
// ---------------//
@@ -85,295 +77,162 @@
this.debug = debug;
}
- public void setEnableHitPositionPlots(boolean enableHitPositionPlots) {
- this.enableHitPositionPlots = enableHitPositionPlots;
+ /**
+ *
+ */
+ public void setSensorName(String sensorName){
+ this.sensorName = sensorName;
}
protected void detectorChanged(Detector detector) {
-
- // Initialize all maps
- for(int layer = 1; layer < 6; layer++){
- topLayerMap.put(layer, new ArrayList<HelicalTrackHit>());
- bottomLayerMap.put(layer, new ArrayList<HelicalTrackHit>());
- }
-
+
// setup AIDA
aida = AIDA.defaultInstance();
aida.tree().cd("/");
- // Create AIDA Frames
- for (int index = 0; index < 2; index++)
- frames.add(new AIDAFrame());
-
- // Set frame titles
- frames.get(0).setTitle("Stereo Hit Positions");
-
+ Set<SiSensor> sensors = SvtUtils.getInstance().getSensors();
+
String title = null;
IHistogram2D histo2D = null;
IHistogram1D histo1D = null;
-
- // --- Hit Positions ---//
- // ---------------------//
- if (enableHitPositionPlots) {
- plotters.add(PlotUtils.setupPlotter("Hit Positions", 1, 2));
- title = "Hit Positions - XZ";
- histo2D = aida.histogram2D(title, 5, 1, 6, 200, -100, 100);
- histos2D.add(histo2D);
- PlotUtils.setup2DRegion(plotters.get(plotterIndex), title, 0, "Layer #", "x [mm]", histo2D);
- title = "Hit Positions - YZ";
- histo2D = aida.histogram2D(title, 5, 1, 6, 200, -100, 100);
- PlotUtils.setup2DRegion(plotters.get(plotterIndex), title, 1, "Layer #", "y [mm]", histo2D);
-
- frames.get(0).addPlotter(plotters.get(plotterIndex));
- plotterIndex++;
- plotters.add(PlotUtils.setupPlotter("Chi Squared", 0, 0));
- title = "ChiSquared";
- histo1D = aida.histogram1D("ChiSquared", 50, 0, 50);
- PlotUtils.setup1DRegion(plotters.get(plotterIndex), title, 0, "Chi Squared", histo1D);
- frames.get(0).addPlotter(plotters.get(plotterIndex));
- }
-
- for (AIDAFrame frame : frames) {
- frame.pack();
- frame.setVisible(true);
+
+ //--- MIP Plots ---//
+ //-----------------//
+ plotters.add(PlotUtils.setupPlotter("Cluster Charge", 5, 4));
+ for(SiSensor sensor : sensors){
+ title = SvtUtils.getInstance().getDescription(sensor) + " - Cluster Charge";
+ histo1D = aida.histogram1D(title, 500, 0, 50000);
+ PlotUtils.setup1DRegion(plotters.get(plotterIndex), title, PlotUtils.getPlotterRegion(sensor), "Cluster Charge [e-]", histo1D);
}
- }
-
- public void process(EventHeader event) {
- totalNumberEvents++;
-
- // Get the list of tracks in the event
- List<SeedTrack> tracks = event.get(SeedTrack.class, trackCollectionName);
-
- totalTracks += tracks.size();
-
- if (tracks.size() == 2) totalTwoTrackEvents++;
-
- // For now, only look at event which have less than a single track
- if (tracks.size() >= 2) {
- if (debug)
- System.out.println(this.getClass().getSimpleName() + ": Two track event found! Skipping ...!");
- return;
- }
-
- // Increment the event number
- totalNumberSingleTrkEvents++;
- this.clearLayers();
+ plotterIndex++;
- // Loop through all HelicalTrackHits and arrange them by layer
- if (!event.hasCollection(HelicalTrackHit.class, stereoHitCollectionName)){
- if(tracks.size() != 0) System.out.println("This event has a track but the HelicalTrackHit collection is empty");
- return;
- }
-
- // Get the list of HelicalTrackHits
- List<HelicalTrackHit> stereoHits = event.get(HelicalTrackHit.class, stereoHitCollectionName);
-
- for (HelicalTrackHit stereoHit : stereoHits) {
- if (debug)
- System.out.println(this.getClass().getSimpleName() + " : Stereo Hit position = " + stereoHit.getCorrectedPosition().toString());
-
- // Get the layer associated with the stereoHit
- int layer = stereoHit.Layer();
- int mapPosition = ((layer - 1)/2) + 1;
-
- // Find the detector volume the hit corresponds to - Top or Bottom.
- // Then "add" the hit to the corresponding layer
- if (stereoHit.getCorrectedPosition().y() > 0) {
- topLayerMap.get(mapPosition).add(stereoHit);
- if (debug){
- System.out.println(this.getClass().getSimpleName() + " : Found Top Hit!");
- System.out.println(this.getClass().getSimpleName() + " : Layer " + stereoHit.Layer());
- }
-
- } else if (stereoHit.getCorrectedPosition().y() < 0) {
- bottomLayerMap.get(mapPosition).add(stereoHit);
- if (debug){
- System.out.println(this.getClass().getSimpleName() + " : Found Bottom Hit!");
- System.out.println(this.getClass().getSimpleName() + " : Layer " + stereoHit.Layer());
- System.out.println(this.getClass().getSimpleName() + " : Layer Size: " + bottomLayerMap.get(mapPosition).size());
- }
- } else throw new RuntimeException("Invalid hit position - y = " + stereoHit.y());
- }
-
- // Get the list of Ecal Clusters
- List<HPSEcalCluster> ecalClusters = event.get(HPSEcalCluster.class, ecalClustersCollectionName);
-
- // Check if there are four consencutive hits on either volume and
- // that there is an Ecal cluster in the same volume
- if(!ecalClusters.isEmpty()){
- if(debug) System.out.println(this.getClass().getSimpleName() + " Ecal Cluster size: " + ecalClusters.size());
- for(HPSEcalCluster ecalCluster : ecalClusters){
- if(debug) System.out.println(this.getClass().getSimpleName() + " Cluster Position: [" + ecalCluster.getPosition()[0] + ", " + ecalCluster.getPosition()[1] + ", " + ecalCluster.getPosition()[2]);
- if(ecalCluster.getPosition()[1] > 0 && this.topHasConsecutiveHits()){
- if(debug) System.out.println(this.getClass().getSimpleName() + " : Found Possible Top Track!");
- possibleTopTracks++;
- possibleTracks++;
- break;
- } else if(ecalCluster.getPosition()[1] < 0 && this.bottomHasConsecutiveHits()){
- if(debug) System.out.println(this.getClass().getSimpleName() + " : Found Possible Bottom Track!");
- possibleBottomTracks++;
- possibleTracks++;
- break;
- } else if(ecalCluster.getPosition()[1] < 0 && this.topHasConsecutiveHits()){
- return;
- }
- else if(ecalCluster.getPosition()[1] > 0 && this.bottomHasConsecutiveHits()){
- return;
- }
- }
- } else if(ecalClusters.isEmpty()){
- if(debug) System.out.println(this.getClass().getName() + " : No Ecal Clusters Found!");
+ if(sensorName != null){
+ plotters.add(PlotUtils.setupPlotter("Cluster Charge", 0, 0));
+ title = sensorName + " - Cluster Charge";
+ PlotUtils.setup1DRegion(plotters.get(plotterIndex), title, 0, "Cluster Charge [e-]", aida.histogram1D(title));
}
-
- // Only continue if an event has a track
- if (tracks.isEmpty()) {
- if (debug) System.out.println(this.getClass().getSimpleName() + ": No Tracks Were Found!");
- return;
+ plotterIndex++;
+
+
+ //-------------------//
+
+ plotters.add(PlotUtils.setupPlotter("Cluster Charge vs Seed Strip", 5, 4));
+ for(SiSensor sensor : sensors){
+ title = SvtUtils.getInstance().getDescription(sensor) + " - Cluster Charge vs Seed Strip";
+ histo2D = aida.histogram2D(title, 640, 0, 639, 500, 0, 50000);
+ PlotUtils.setup2DRegion(plotters.get(plotterIndex), title, PlotUtils.getPlotterRegion(sensor), "Physical Channel Number", "Cluster Charge [e-]", histo2D);
}
-
- if (debug) System.out.println(this.getClass().getSimpleName() + ": Number of Tracks: " + tracks.size());
-
- if(this.topHasConsecutiveHits() || this.bottomHasConsecutiveHits()){
- totalTracksFound += tracks.size();
- } else {
- if(debug) System.out.println(this.getClass().getName() + ": Track has no helical track associated with it!");
+ plotterIndex++;
+
+ if(sensorName != null){
+ plotters.add(PlotUtils.setupPlotter("Cluster Charge vs Seed Strip", 0, 0));
+ title = sensorName + " - Cluster Charge vs Seed Strip";
+ PlotUtils.setup2DRegion(plotters.get(plotterIndex), title, 0, "Physical Channel Number", "Cluster Charge [e-]", aida.histogram2D(title));
+ }
+ plotterIndex++;
+
+ //--- Signal to Noise ---//
+ //-----------------------//
+ plotters.add(PlotUtils.setupPlotter("Signal to Noise", 5, 4));
+ for(SiSensor sensor : sensors){
+ title = SvtUtils.getInstance().getDescription(sensor) + " - Signal to Noise";
+ histo1D = aida.histogram1D(title, 25, 0, 50);
+ PlotUtils.setup1DRegion(plotters.get(plotterIndex), title, PlotUtils.getPlotterRegion(sensor), "Signal To Noise", histo1D);
}
-
- for (SeedTrack track : tracks) {
- trkUtil.setTrack(track);
- extrapolator.setTrack(track);
-
- // Check which volume the track corresponds to
- if (trkUtil.getZ0() > 0 ) {
- totalTopTracksFound++;
- if (debug) System.out.println(this.getClass().getSimpleName() + " : Found Top Track!");
- } else if (trkUtil.getZ0() < 0 ) {
- totalBottomTracksFound++;
- if (debug) System.out.println(this.getClass().getSimpleName() + " : Found Bottom Track!");
- }
-
- // Check if the track has four hits associated with it. This should
- // be the case when
- // only four hits are used to fit the track
-
- if (track.getTrackerHits().size() == 4 && !ecalClusters.isEmpty()) {
-
- // Get the position of the track at the last Layer
- Hep3Vector trkPositionAtLayer5 = extrapolator.extrapolateTrack(696.1715 /* mm */);
-
- if (debug)
- System.out.println(this.getClass().getSimpleName() + ": Track Position at Layer 5: "
- + trkPositionAtLayer5.toString());
-
- if (trkPositionAtLayer5.y() < 67/* 69.89656 */&& trkPositionAtLayer5.y() > -27/*-28.73156*/
- && trkPositionAtLayer5.z() > 11/* 12.59405 */&& trkPositionAtLayer5.z() < 47/* 50.93395 */) {
-
- if (trkUtil.getZ0() > 0 && track.getChi2() < 10) {
- for (HPSEcalCluster ecalCluster : ecalClusters) {
- if (ecalCluster.getPosition()[1] > 0) {
- totalFourHitTracks++;
- // if (topLayers[4] > 0)
- // totalTracksWith5LayersHit++;
- // break;
- }
- }
- }
- /*
- * if(trkUtil.getZ0() > 0 && topLayers[4] > 0 &&
- * track.getChi2() < 10){ for(HPSEcalCluster ecalCluster :
- * ecalClusters){ if(ecalCluster.getPosition()[1] > 0){
- * totalTracksWith5LayersHit++; break; } } }
- */
-// else if (trkUtil.getZ0() > 0 && topLayers[4] == 0) {
-// for (TrackerHit hit : track.getTrackerHits()) {
-// HelicalTrackHit hth = (HelicalTrackHit) hit;
-// int arrayPosition = (hth.Layer() - 1) / 2;
- // String title = "Hit Positions - Layer " +
- // String.valueOf(arrayPosition+1);
- // String title = "Hit Positions - XZ";
- // System.out.println(title);
- // aida.histogram2D(title).fill(arrayPosition + 1,
- // hth.getCorrectedPosition().y());
- // title = "Hit Positions - YZ";
- // aida.histogram2D(title).fill(arrayPosition + 1,
- // hth.getCorrectedPosition().z());
-// }
-// aida.histogram1D("ChiSquared").fill(track.getChi2());
-// } else if (trkUtil.getZ0() < 0 && bottomLayers[4] > 0) {
-// for (HPSEcalCluster ecalCluster : ecalClusters) {
-// if (ecalCluster.getPosition()[1] < 0) {
- // totalTracksWith5LayersHit++;
-// break;
-// }
-// }
-// }
- }
- }
+ plotterIndex++;
+
+ if(sensorName != null){
+ plotters.add(PlotUtils.setupPlotter("Signal to Noise", 0, 0));
+ title = sensorName + " - Signal to Noise";
+ PlotUtils.setup1DRegion(plotters.get(plotterIndex), title, 0, "Signal to Noise", aida.histogram1D(title));
}
+ plotterIndex++;
+
+ // Show the plotters
+ for(IPlotter plotter : plotters) plotter.show();
}
- private boolean hasConsecutiveHits(double[] layers) {
- for (int index = 0; index < 2; index++) {
- if (layers[index] > 0 && layers[index + 1] > 0 && layers[index + 2] > 0 && layers[index + 3] > 0) {
- return true;
- }
- }
+ public void process(EventHeader event) {
+ totalNumberOfEvents++;
- return false;
- }
-
- private boolean topHasConsecutiveHits(){
- for(int index = 1; index < 3; index++){
- if(this.getNumberTopLayerHits(index) > 0 &&
- this.getNumberTopLayerHits(index + 1) > 0 &&
- this.getNumberTopLayerHits(index + 2) > 0 &&
- this.getNumberTopLayerHits(index + 3) > 0 ){
- return true;
- }
- }
- return false;
- }
-
- private boolean bottomHasConsecutiveHits(){
- for(int index = 1; index < 3; index++){
- if(this.getNumberBottomLayerHits(index) > 0 &&
- this.getNumberBottomLayerHits(index + 1) > 0 &&
- this.getNumberBottomLayerHits(index + 2) > 0 &&
- this.getNumberBottomLayerHits(index + 3) > 0){
- return true;
- }
- }
- return false;
- }
-
- private void clearLayers(){
- for(int layer = 1; layer < 6; layer++){
- topLayerMap.get(layer).clear();
- bottomLayerMap.get(layer).clear();
- }
+ // If the event doesn't have tracks, skip the event
+ if(!event.hasCollection(Track.class, trackCollectionName)) return;
+ List<Track> tracks = event.get(Track.class, trackCollectionName);
+
+ totalTracks += tracks.size();
+ if(tracks.size() == 2) totalTwoTrackEvents++;
+
+ String title = null;
+ SiSensor sensor = null;
+ RawTrackerHit rawHit = null;
+ double hitCharge = 0;
+ double totalAdc = 0;
+ double noise = 0;
+ double ston = 0;
+ int channel = 0;
+ int maxChannel = 0;
+ double maxAdc = 0;
+ double gain = 0;
+ ChannelConstants constants = null;
+ HPSShapeFitParameters fit = null;
+
+ // Loop over all tracks in an event
+ for(Track track : tracks){
+ // Loop over all stereo hits associated with a track
+ for(TrackerHit trackHit : track.getTrackerHits()){
+ // Loop over the strip hits used to crate the stereo hit
+ for(HelicalTrackStrip stripHit : ((HelicalTrackCross) trackHit).getStrips()){
+ // Loop over all the raw hits used to create the cluster
+ hitCharge = 0;
+ totalAdc = 0;
+ maxAdc = 0;
+ for(Object hit : stripHit.rawhits()){
+ rawHit = (RawTrackerHit) hit;
+ sensor = (SiSensor) rawHit.getDetectorElement();
+ channel = rawHit.getIdentifierFieldValue("strip");
+ constants = HPSSVTCalibrationConstants.getChannelConstants(sensor, channel);
+ fit = shaperFitter.fitShape(rawHit, constants);
+ if(fit.getAmp() > maxAdc){
+ maxChannel = channel;
+ maxAdc = fit.getAmp();
+ }
+ gain = constants.getNoise()/idealNoise;
+ totalAdc += fit.getAmp();
+ noise += Math.pow(constants.getNoise(),2);
+ //hitCharge += fit.getAmp()/HPSSVTCalibrationConstants.getGain(sensor, channel);
+ hitCharge += fit.getAmp()/gain;
+ }
+
+ title = SvtUtils.getInstance().getDescription(sensor) + " - Cluster Charge";
+ aida.histogram1D(title).fill(hitCharge);
+
+ title = SvtUtils.getInstance().getDescription(sensor) + " - Cluster Charge vs Seed Strip";
+ aida.histogram2D(title).fill(maxChannel, hitCharge);
+
+ noise = Math.sqrt(noise/stripHit.rawhits().size());
+ ston = totalAdc/noise;
+ title = SvtUtils.getInstance().getDescription(sensor) + " - Signal to Noise";
+ aida.histogram1D(title).fill(ston);
+ }
+ }
+ }
}
+
- private int getNumberTopLayerHits(int layer){
- return topLayerMap.get(layer).size();
+ /**
+ * print debug statements
+ */
+ public void printDebug(String debugStatement){
+ if(!debug) return;
+ System.out.println(this.getClass().getSimpleName() + ": " + debugStatement);
}
- private int getNumberBottomLayerHits(int layer){
- return bottomLayerMap.get(layer).size();
- }
-
@Override
public void endOfData() {
System.out.println("%===================================================================% \n");
- System.out.println("Number of tracks per event: " + (totalTracks/ totalNumberEvents));
- System.out.println("Number of events with two tracks per event: " + (totalTwoTrackEvents/totalNumberEvents));
- System.out.println("Total Track Reconstruction Efficiency: " + totalTracksFound + " / " + possibleTracks + " = " + (totalTracksFound / possibleTracks) * 100 + "%");
- System.out.println("Total Top Track Reconstruction Efficiency: " + totalTopTracksFound + " / " + possibleTopTracks + " = " + (totalTopTracksFound / possibleTopTracks)* 100 + "%");
- System.out.println("Total Bottom Track Reconstruction Efficiency: " + totalBottomTracksFound + " / " + possibleBottomTracks + " = " + (totalBottomTracksFound / possibleBottomTracks) * 100 + "%");
- System.out.println("Percentage of 4 hit tracks: " + (totalFourHitTracks / totalTracksFound) * 100 + "%");
- System.out.println("Hit Efficiency: " + (totalTracksWith5LayersHit / totalFourHitTracks) * 100 + "%");
-// System.out.println("Percentage of Two Track Events: " + (totalTwoTrackEvents / totalEvents) * 100 + "%");
- System.out.println("%===================================================================% \n");
+ System.out.println("Number of tracks per event: " + (totalTracks/ totalNumberOfEvents));
+ System.out.println("Number of events with two tracks per event: " + (totalTwoTrackEvents/totalNumberOfEvents));
+ System.out.println("\n%===================================================================% \n");
}
}