Print

Print


Commit in lcsim/src/org/lcsim/recon/cluster/directedtree on MAIN
TrackHitMatcher.java+64-91.6 -> 1.7
GL: optional distance plots

lcsim/src/org/lcsim/recon/cluster/directedtree
TrackHitMatcher.java 1.6 -> 1.7
diff -u -r1.6 -r1.7
--- TrackHitMatcher.java	22 May 2006 18:01:10 -0000	1.6
+++ TrackHitMatcher.java	21 Jun 2006 18:02:59 -0000	1.7
@@ -7,7 +7,7 @@
 import hep.physics.vec.Hep3Vector;
 import hep.physics.vec.BasicHep3Vector;
 
-// import org.lcsim.util.aida.AIDA;
+import org.lcsim.util.aida.AIDA;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.CalorimeterHit;
 import org.lcsim.event.Track;
@@ -18,15 +18,21 @@
 import org.lcsim.geometry.IDDecoder;
 import org.lcsim.recon.cluster.util.CalHitMapMgr;
 
+// temporary: MC stuff
+import org.lcsim.event.SimCalorimeterHit;
+import org.lcsim.event.MCParticle;
+import org.lcsim.recon.ztracking.cheater.CheatTrack;
+
 /**
  * A helper class for track-hit matching in a single calorimeter component
  *
  * @author Guilherme Lima
- * @version $Id: TrackHitMatcher.java,v 1.6 2006/05/22 18:01:10 lima Exp $
+ * @version $Id: TrackHitMatcher.java,v 1.7 2006/06/21 18:02:59 lima Exp $
  */
 public class TrackHitMatcher {
 
     int _debug = 0;  // debug level, 0 for no printout
+    private boolean _makeDistancePlot = true;
 
     // constructors
     public TrackHitMatcher(String colName, double[] layers) {
@@ -58,7 +64,7 @@
       // Load hit collections
       _hitmap = _expert.getCollHitMap(_colName);
 
-      // loop over tracks
+      // Load tracks
       // Use recon.ztracking.cheater.TrackingCheater (MCParticle)
       List<Track> recoTracks = null;
       try {
@@ -71,12 +77,15 @@
       // Use mc.fast.tracking.MCFastTracking (smearing around MCParticle)
 //       List<Track> recoTracks = event.getTracks();
 
+      // loop over tracks
       for( Track trk : recoTracks ) {
 	_trk = trk;
 	_trkHitsMap = trkHitsMap;
 	_trkHits = trkHitsMap.get( trk );
 	int nhitsBefore = (_trkHits!=null ? _trkHits.size() : 0);
 
+	if(_makeDistancePlot) _mcp = ((CheatTrack)trk).getMCParticle();
+
 	if(_debug>0) {
 	    double mcE = ((org.lcsim.recon.ztracking.cheater.CheatTrack)trk).getMCParticle().getEnergy();
 	    System.out.println("TkHitMatcher: "+_colName+" - new track: E="+mcE);
@@ -86,20 +95,28 @@
 	Vector<Hep3Vector> trkIntercepts = intersects.get(trk);
 	if( trkIntercepts == null) continue;
 
-	int iint=0;
+	int ilay=0;
 	for( Hep3Vector pos : trkIntercepts ) {
 	  // find cell containing track-cylinder intersection
 	  long cellid = _segm.findCellContainingXYZ( pos );
-	  if(_debug>0) System.out.println("TkHitMatcher: "+_colName+" "+pos.x()+" "+pos.y()+" "+pos.z()+", cellid="+MyTools.printID(cellid));
+	  _minDist2 = 999999;  // reset for new layer
+	  if(_debug>0) {
+	      System.out.println("TkHitMatcher: "+_colName+" "+pos.x()+" "+pos.y()+" "+pos.z()+", cellid="+MyTools.printID(cellid));
+	  }
 	  if(cellid==0) continue;
 
 	  // save matched hits
 	  this.addHitToTrack( cellid );
 
+	  if(_makeDistancePlot) {
+	      // update for closest hits
+	      this.updateClosestDistance2ToHit(cellid,pos);
+	  }
+
 	  _segm.setID( cellid );
- 	  double rhoCell = _segm.getDistanceToSensitive(iint);
+ 	  double rhoCell = _segm.getDistanceToSensitive(ilay);
 	  if(_debug>1) {
-  	     System.out.println("layer="+iint+", pos="+pos+", cell pos=("
+  	     System.out.println("layer="+ilay+", pos="+pos+", cell pos=("
   	        +_segm.getX()+"; "+_segm.getY()+"; "+_segm.getZ()+")"
   	        +", rhoSwim="+Math.sqrt(pos.x()*pos.x()+pos.y()*pos.y())
   		+", rhoCell="+rhoCell+", #hits="+_hitmap.size());
@@ -109,8 +126,17 @@
 	  long[] neighs = _segm.getNeighbourIDs( 0, _dU, _dV );
 	  for(int i=0; i<neighs.length; ++i) {
 	      this.addHitToTrack( neighs[i] );
+
+	      if(_makeDistancePlot) {
+		  // update for closest hits
+		  this.updateClosestDistance2ToHit( neighs[i], pos );
+	      }
 	  }
-	  ++iint;
+
+	  // plot of shortest distance in layer
+	  if(_minDist2<1600) _aida.cloud1D("tkmatch shortDist in "+_colName).fill(Math.sqrt(_minDist2));
+
+	  ++ilay;
 	}
 
 	if(_debug>0) {
@@ -152,6 +178,31 @@
 	}
     }
 
+    // Checks whether hit is valid
+    private void updateClosestDistance2ToHit( long cellid, Hep3Vector x1 ) {
+	CalorimeterHit ihit = _hitmap.get(cellid);
+	if(ihit!=null) {
+	    SimCalorimeterHit simhit = (SimCalorimeterHit)ihit;
+	    if(simhit==null) return;
+
+	    boolean sameParticle = false;
+	    for(int i=0; i<simhit.getMCParticleCount(); ++i) {
+		if( simhit.getMCParticle(i) == _mcp ) {
+		    sameParticle = true;
+		    break;
+		}
+	    }
+	    if(!sameParticle) return;
+
+	    double[] x2 = ihit.getPosition();
+	    double dx = x2[0] - x1.x();
+	    double dy = x2[1] - x1.y();
+	    double dz = x2[2] - x1.z();
+	    double dist2 = dx*dx + dy*dy + dz*dz;
+	    if(dist2 < _minDist2) _minDist2 = dist2;
+	}
+    }
+
     //***** FIELDS ****
 
     // track currently being processed
@@ -164,9 +215,13 @@
 
     private CalHitMapMgr _expert = CalHitMapMgr.getInstance();
     private int _dU, _dV;
-//     private AIDA _aida = AIDA.defaultInstance();
+    private AIDA _aida = AIDA.defaultInstance();
     // these are for loop optimization
     private Track _trk = null;
     private List<CalorimeterHit> _trkHits = null;
     private Map<Track,List<CalorimeterHit>> _trkHitsMap = null;
+
+    // debugging stuff
+    private double _minDist2;
+    private MCParticle _mcp;
 }
CVSspam 0.2.8