lcsim/src/org/lcsim/recon/cluster/directedtree
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;
}