Author: [log in to unmask] Date: Tue Jun 16 18:01:21 2015 New Revision: 3149 Log: Starting to update so it works with engineering run detector. Currently, it's a mess .... Modified: java/trunk/users/src/main/java/org/hps/users/omoreno/SvtHitEfficiency.java Modified: java/trunk/users/src/main/java/org/hps/users/omoreno/SvtHitEfficiency.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/omoreno/SvtHitEfficiency.java (original) +++ java/trunk/users/src/main/java/org/hps/users/omoreno/SvtHitEfficiency.java Tue Jun 16 18:01:21 2015 @@ -11,7 +11,6 @@ import hep.aida.IPlotter; import hep.aida.IHistogram1D; import hep.aida.ITree; - import hep.physics.vec.BasicHep3Vector; import hep.physics.vec.Hep3Vector; import hep.physics.vec.VecOp; @@ -27,12 +26,12 @@ import org.lcsim.detector.tracker.silicon.SiSensor; import org.lcsim.detector.tracker.silicon.SiStrips; import org.lcsim.event.EventHeader; +import org.lcsim.event.ReconstructedParticle; import org.lcsim.event.Track; import org.lcsim.event.TrackerHit; import org.lcsim.fit.helicaltrack.HelicalTrackHit; import org.lcsim.geometry.Detector; import org.lcsim.util.Driver; - import org.hps.recon.tracking.TrackUtils; import org.hps.recon.tracking.TrackerHitUtils; @@ -56,11 +55,12 @@ IHistogramFactory histogramFactory; IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory(); protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>(); - private Map<String, IHistogram1D> trackMomentumPlots = new HashMap<String, IHistogram1D>(); + private Map<String, IHistogram1D> trackPlots = new HashMap<String, IHistogram1D>(); //private Map<SiSensor, Map<Integer, Hep3Vector>> stripPositions = new HashMap<SiSensor, Map<Integer, Hep3Vector>>(); private List<HpsSiSensor> sensors = null; + private Map<Track, ReconstructedParticle> reconParticleMap = new HashMap<Track, ReconstructedParticle>(); private Map<Integer, SvtStereoLayer> topStereoLayers = new HashMap<Integer, SvtStereoLayer>(); private Map<Integer, SvtStereoLayer> bottomStereoLayers = new HashMap<Integer, SvtStereoLayer>(); @@ -90,6 +90,7 @@ // Collections private String trackCollectionName = "MatchedTracks"; + private String fsParticlesCollectionName = "FinalStateParticles"; private String stereoHitCollectionName = "HelicalTrackHits"; private String ecalClustersCollectionName = "EcalClusters"; @@ -164,19 +165,25 @@ ICloud2D cloud2D = null; */ - if (enableMomentumPlots) { - - plotters.put("Track Momentum", plotterFactory.create("Track Momentum")); - plotters.get("Track Momentum").createRegions(1, 2); - - trackMomentumPlots.put("Track Momentum", histogramFactory.createHistogram1D("Track Momentum", 50, 0, 5)); - plotters.get("Track Momentum").region(0).plot(trackMomentumPlots.get("Track Momentum")); + plotters.put("Event Information", plotterFactory.create("Event information")); + plotters.get("Event Information").createRegions(2, 3); + + trackPlots.put("Number of tracks", histogramFactory.createHistogram1D("Number of tracks", 10, 0, 10)); + plotters.get("Event Information").region(0).plot(trackPlots.get("Number of tracks")); + + trackPlots.put("Unused Layer", histogramFactory.createHistogram1D("Unused Layer", 6, 1, 7)); + plotters.get("Event Information").region(1).plot(trackPlots.get("Unused Layer")); + + plotters.put("Track Momentum", plotterFactory.create("Track Momentum")); + plotters.get("Track Momentum").createRegions(1, 2); + + trackMomentumPlots.put("Track Momentum", histogramFactory.createHistogram1D("Track Momentum", 50, 0, 1.5)); + plotters.get("Track Momentum").region(0).plot(trackMomentumPlots.get("Track Momentum")); - trackMomentumPlots.put("Track Momentum - Tracks Within Acceptance", - histogramFactory.createHistogram1D("Track Momentum - Tracks Within Acceptance", 50, 0, 5)); - plotters.get("Track Momentum").region(0) - .plot(trackMomentumPlots.get("Track Momentum - Tracks Within Acceptance")); - } + trackMomentumPlots.put("Track Momentum - Tracks Within Acceptance", + histogramFactory.createHistogram1D("Track Momentum - Tracks Within Acceptance", 50, 0, 1.5)); + plotters.get("Track Momentum").region(0) + .plot(trackMomentumPlots.get("Track Momentum - Tracks Within Acceptance")); // Create a Map from sensor to bad channels and from bad channels to // strip position @@ -274,17 +281,6 @@ return stripPositions.get(sensor).get(physicalChannel); }*/ - /** - * Print a debug message if they are enabled. - * - * @param debugMessage : message to be printed - */ - private void printDebug(String debugMessage){ - if(debug){ - System.out.println(this.getClass().getSimpleName() + ": " + debugMessage); - } - } - public void process(EventHeader event){ // If the event does not have tracks, skip it @@ -293,7 +289,16 @@ // Get the list of tracks from the event List<Track> tracks = event.get(Track.class, trackCollectionName); - if(tracks.size() >= 2 ) return; + // For now, only look at events with a single track + if(tracks.size() != 1 ) return; + + // Get the list of final state particles from the event. These will + // be used to obtain the track momentum. + List<ReconstructedParticle> fsParticles = event.get(ReconstructedParticle.class, fsParticlesCollectionName); + + this.mapReconstructedParticlesToTracks(tracks, fsParticles); + + trackPlots.get("Number of tracks").fill(tracks.size()); // Get the list of Ecal clusters from the event //List<Cluster> ecalClusters = event.get(Cluster.class, ecalClustersCollectionName); @@ -308,23 +313,21 @@ } // Calculate the momentum of the track - double momentum = (new BasicHep3Vector(track.getTrackStates().get(0).getMomentum())).magnitude(); - - if (enableMomentumPlots) { - trackMomentumPlots.get("Track Momentum").fill(momentum); - } - + double p = this.getReconstructedParticle(track).getMomentum().magnitude(); + + trackMomentumPlots.get("Track Momentum").fill(p); + // Find which of the layers isn't being used in the track fit int unusedLayer = this.getUnusedSvtLayer(track.getTrackerHits()); + + trackPlots.get("Unused Layer").fill(unusedLayer); // Extrapolate the track to the unused layer and check that it lies // within the acceptance of that layer. If it doesn't, move on // to the next event - if(!isWithinAcceptance(track, unusedLayer)) continue; - - if (enableMomentumPlots) { - trackMomentumPlots.get("Track Momentum - Tracks Within Acceptance").fill(momentum); - } + //if(!isWithinAcceptance(track, unusedLayer)) continue; + + trackMomentumPlots.get("Track Momentum - Tracks Within Acceptance").fill(p); //ecalClusterTrackMatch = false; // Check if there is an Ecal cluster in the same detector volume as the track @@ -417,13 +420,35 @@ int[] svtLayer = new int[6]; for (TrackerHit hit : hits) { - HelicalTrackHit stereoHit = (HelicalTrackHit) hit; - int layer = (stereoHit.Layer() - 1)/2; - svtLayer[layer]++; + + int layer = -1; + switch ((int) Math.floor(hit.getPosition()[0])/100) { + case 1: + layer = 1; + break; + case 2: + layer = 2; + break; + case 3: + layer = 3; + break; + case 5: + layer = 4; + break; + case 7: + layer = 5; + break; + case 9: + layer = 6; + break; + default: + throw new RuntimeException("Layer not found"); + } + svtLayer[layer - 1]++; } for(int layer = 0; layer < svtLayer.length; layer++){ - if(svtLayer[layer] == 0) return (2*layer + 1); + if(svtLayer[layer] == 0) return layer; } return -1; @@ -477,13 +502,13 @@ //--------------------------------------------------------------------------// //Rotate the track position to the JLab coordinate system - this.printDebug("Track position in tracking frame: " + trackPosition.toString()); + //this.printDebug("Track position in tracking frame: " + trackPosition.toString()); Hep3Vector trackPositionDet = VecOp.mult(VecOp.inverse(this.trackerHitUtils.detToTrackRotationMatrix()), trackPosition); - this.printDebug("Track position in JLab frame " + trackPositionDet.toString()); + //this.printDebug("Track position in JLab frame " + trackPositionDet.toString()); // Rotate the track to the sensor coordinates ITransform3D globalToLocal = sensor.getReadoutElectrodes(ChargeCarrier.HOLE).getGlobalToLocal(); globalToLocal.transform(trackPositionDet); - this.printDebug("Track position in sensor electrodes frame " + trackPositionDet.toString()); + //this.printDebug("Track position in sensor electrodes frame " + trackPositionDet.toString()); // Find the closest channel to the track position double deltaY = Double.MAX_VALUE; @@ -516,7 +541,7 @@ if(sensor.isBadChannel(intersectingChannel) || sensor.isBadChannel(intersectingChannel+1) || sensor.isBadChannel(intersectingChannel-1)){ - this.printDebug("Track intersects a bad channel!"); + //this.printDebug("Track intersects a bad channel!"); return false; } } @@ -619,4 +644,21 @@ }*/ System.out.println("% \n%===================================================================%"); } + + private void mapReconstructedParticlesToTracks(List<Track> tracks, List<ReconstructedParticle> particles) { + + reconParticleMap.clear(); + for (ReconstructedParticle particle : particles) { + for (Track track : tracks) { + if (!particle.getTracks().isEmpty() && particle.getTracks().get(0) == track) { + reconParticleMap.put(track, particle); + } + } + } + } + + private ReconstructedParticle getReconstructedParticle(Track track) { + return reconParticleMap.get(track); + } + }