Commit in lcsim/src/org/lcsim/contrib/SteveMagill on MAIN
TrackMipClusterDriver.java+137-1261.2 -> 1.3


lcsim/src/org/lcsim/contrib/SteveMagill
TrackMipClusterDriver.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- TrackMipClusterDriver.java	18 May 2007 19:58:36 -0000	1.2
+++ TrackMipClusterDriver.java	29 May 2008 21:32:22 -0000	1.3
@@ -1,4 +1,4 @@
-package org.lcsim.contrib.SteveMagill;
+package org.lcsim.contrib.compile.SteveMagill;
 
 //  This driver extrapolates tracks into CAL, associating mips and determining interaction layer
 //  output : Mip Clusters and IL per track
@@ -55,8 +55,6 @@
    private double[] _emecZ; //EM Endcap Z
    private double _hadbZ; //HAD barrel z
    private double[] _hadecZ; // HAD endcap z
-//   The central magnetic field strength
-   private double[] _fieldStrength;
    private double _dminE;
    private double _dminH;
    private double _dminTrC;
@@ -64,7 +62,9 @@
    private String _nameExt;
    private String[] _hitcollnames;
    private boolean trmipD = false;
-   private boolean trmipRes = true;
+   private boolean trmipRes = false;
+   private SpacePoint trackspacept;
+   private double zField;
 //   private String[] _hitmapnames;
    
    public TrackMipClusterDriver(double dminE, double dminH, double dminTrC, double mincd)
@@ -84,9 +84,12 @@
         {
             // setup specific detector stuff here
             Detector det = event.getDetector();
-            double[] zero = {0, 0, 0};
-            _fieldStrength = det.getFieldMap().getField(zero);
-//            System.out.println("B Field " +_fieldStrength[2]+ " Tesla");
+//            double[] zero = {0, 0, 0};
+//            _fieldStrength = det.getFieldMap().getField(zero);
+            //  try this
+            Hep3Vector ip = new BasicHep3Vector();
+            zField = det.getFieldMap().getField(ip).z();
+//            System.out.println("B Field " + zField + " Tesla");
             
             //  Setup layer counts and distances for barrel, endcap
             CylindricalCalorimeter emb = ((CylindricalCalorimeter) det.getSubdetectors().get("EMBarrel"));
@@ -161,17 +164,19 @@
                     long cID = chit.getCellID();
                     caldecoder.setID(cID);
                     int nlay = caldecoder.getLayer();
-                    celbtheta[nhitbLayer[nlay]][nlay] = caldecoder.getTheta();
-                    double cellphi = caldecoder.getPhi();
-                    if (cellphi>Math.PI) cellphi=cellphi-2*Math.PI;
+                    double[] htpos = chit.getPosition();
+                    double cellphi = Math.atan2(htpos[1],htpos[0]);
+                    if (cellphi<0) cellphi+=2*Math.PI;
+                    double htr = Math.sqrt(htpos[0]*htpos[0]+htpos[1]*htpos[1]);
+                    double celltheta = Math.atan(htr/htpos[2]);
+                    if (celltheta<0) celltheta+=Math.PI;
+                    celbtheta[nhitbLayer[nlay]][nlay] = celltheta;
                     celbphi[nhitbLayer[nlay]][nlay] = cellphi;
                     celbID[nhitbLayer[nlay]][nlay] = cID;
                     celbhit[nhitbLayer[nlay]][nlay] = chit;
                     nhitbLayer[nlay]++;
                     nhitsEMB++;
                     nhitsBTotCAL++;
-                    if (trmipD) aida.cloud1D("Raw Cell E in EM CAL").fill(chit.getRawEnergy());
-                    if (trmipD) aida.cloud1D("Corrected Cell E in EM CAL").fill(chit.getCorrectedEnergy());
                 }
             } else if (_hitcollnames[i] == "HcalBarrDigiHits")
             {
@@ -180,9 +185,13 @@
                     long cID = chit.getCellID();
                     caldecoder.setID(cID);
                     int nlay = _numbemlayers + caldecoder.getLayer();
-                    celbtheta[nhitbLayer[nlay]][nlay] = caldecoder.getTheta();
-                    double cellphi = caldecoder.getPhi();
-                    if (cellphi>Math.PI) cellphi=cellphi-2*Math.PI;
+                    double[] htpos = chit.getPosition();
+                    double cellphi = Math.atan2(htpos[1],htpos[0]);
+                    if (cellphi<0) cellphi+=2*Math.PI;
+                    double htr = Math.sqrt(htpos[0]*htpos[0]+htpos[1]*htpos[1]);
+                    double celltheta = Math.atan(htr/htpos[2]);
+                    if (celltheta<0) celltheta+=Math.PI;
+                    celbtheta[nhitbLayer[nlay]][nlay] = celltheta;
                     celbphi[nhitbLayer[nlay]][nlay] = cellphi;
                     celbID[nhitbLayer[nlay]][nlay] = cID;
                     celbhit[nhitbLayer[nlay]][nlay] = chit;
@@ -197,10 +206,14 @@
                     long cID = chit.getCellID();
                     caldecoder.setID(cID);
                     int nlay = caldecoder.getLayer();
-                    celectheta[nhitecLayer[nlay]][nlay] = caldecoder.getTheta();
-                    double cellphi = caldecoder.getPhi();
-                    if (cellphi>Math.PI) cellphi=cellphi-2*Math.PI;
-                    celecphi[nhitecLayer[nlay]][nlay] = cellphi;
+                    double[] htpos = chit.getPosition();
+                    double cellphi = Math.atan2(htpos[1],htpos[0]);
+                    if (cellphi<0) cellphi+=2*Math.PI;
+                    double htr = Math.sqrt(htpos[0]*htpos[0]+htpos[1]*htpos[1]);
+                    double celltheta = Math.atan(htr/htpos[2]);
+                    if (celltheta<0) celltheta+=Math.PI;
+                    celectheta[nhitbLayer[nlay]][nlay] = celltheta;
+                    celecphi[nhitbLayer[nlay]][nlay] = cellphi;
                     celecID[nhitecLayer[nlay]][nlay] = cID;
                     celechit[nhitecLayer[nlay]][nlay] = chit;
                     nhitecLayer[nlay]++;
@@ -214,10 +227,14 @@
                     long cID = chit.getCellID();
                     caldecoder.setID(cID);
                     int nlay = _numecemlayers + caldecoder.getLayer();
-                    celectheta[nhitecLayer[nlay]][nlay] = caldecoder.getTheta();
-                    double cellphi = caldecoder.getPhi();
-                    if (cellphi>Math.PI) cellphi=cellphi-2*Math.PI;
-                    celecphi[nhitecLayer[nlay]][nlay] = cellphi;
+                    double[] htpos = chit.getPosition();
+                    double cellphi = Math.atan2(htpos[1],htpos[0]);
+                    if (cellphi<0) cellphi+=2*Math.PI;
+                    double htr = Math.sqrt(htpos[0]*htpos[0]+htpos[1]*htpos[1]);
+                    double celltheta = Math.atan(htr/htpos[2]);
+                    if (celltheta<0) celltheta+=Math.PI;
+                    celectheta[nhitbLayer[nlay]][nlay] = celltheta;
+                    celecphi[nhitbLayer[nlay]][nlay] = cellphi;
                     celecID[nhitecLayer[nlay]][nlay] = cID;
                     celechit[nhitecLayer[nlay]][nlay] = chit;
                     nhitecLayer[nlay]++;
@@ -234,10 +251,8 @@
         // aida.cloud2D("Number of hits B vs EC CAL").fill(nhitsBTotCAL,nhitsECTotCAL);
 
         // Now calculate densities for hits in barrel
-//        Map<Long, CalorimeterHit> lodenshitmap = new HashMap<Long, CalorimeterHit>();
-//        Map<Long, CalorimeterHit> hidenshitmap = new HashMap<Long, CalorimeterHit>();
-        HitMap lodenshitmap = new HitMap();
-        HitMap hidenshitmap = new HitMap();
+//        HitMap lodenshitmap = new HitMap();
+//        HitMap hidenshitmap = new HitMap();
         for (int i=0; i<_numbemlayers+_numbhadlayers; ++i)
         {
             for (int j=0; j<nhitbLayer[i]; ++j)
@@ -256,29 +271,30 @@
                     if (i >= _numbemlayers) dmin = _dminH;
                     if (distance < dmin)
                     {
-                        if (i < 30) celbden[j][i] += 0.0026/distance;
-                        if (i > 29) celbden[j][i] += 0.0052/distance;
+                        if (i < _numbemlayers) celbden[j][i] += 0.0026/distance;  // default is 0.0026
+                        if (i > _numbemlayers-1) celbden[j][i] += 0.0054/distance;  // default was 0.0052, try 0.0062
                         if (trmipD) 
                         {
                             if (i == 0) aida.cloud1D("Distance between EM B CAL hits layer 0").fill(distance);
-                            if (i < 30) aida.cloud1D("Distance between EM B CAL hits").fill(distance);
-                            if (i == 30) aida.cloud1D("Distance between HAD B CAL hits layer 0").fill(distance);
-                            if (i > 29) aida.cloud1D("Distance between HAD B CAL hits").fill(distance);
+                            if (i < _numbemlayers) aida.cloud1D("Distance between EM B CAL hits").fill(distance);
+                            if (i == _numbemlayers) aida.cloud1D("Distance between HAD B CAL hits layer 0").fill(distance);
+                            if (i > _numbemlayers-1) aida.cloud1D("Distance between HAD B CAL hits").fill(distance);
                         }
                     }
                 }
                 if (trmipD) aida.cloud1D("Cell Density B").fill(celbden[j][i]);
+                if (trmipD) aida.cloud2D("Cell Density B vs Layer").fill(i,celbden[j][i]);
                 // aida.cloud2D("Cell Density vs Vis E").fill(celbhit[j][i].getRawEnergy(),celbden[j][i]);
-                if (celbden[j][i] > 0 && celbden[j][i] < _mincd) 
-                {
-                    lodenshitmap.put(celbID[j][i],celbhit[j][i]);
-                    if (trmipD) aida.cloud1D("Visible E LowD hits").fill(celbhit[j][i].getRawEnergy());
-                }
-                if (celbden[j][i] > _mincd) 
-                {
-                    hidenshitmap.put(celbID[j][i],celbhit[j][i]);
-                    if (trmipD) aida.cloud1D("Visible E HighD hits").fill(celbhit[j][i].getRawEnergy());
-                }
+//                if (celbden[j][i] > 0 && celbden[j][i] < _mincd) 
+//                {
+//                    lodenshitmap.put(celbID[j][i],celbhit[j][i]);
+//                    if (trmipD) aida.cloud1D("Visible E LowD hits").fill(celbhit[j][i].getRawEnergy());
+//                }
+//                if (celbden[j][i] > _mincd) 
+//                {
+//                    hidenshitmap.put(celbID[j][i],celbhit[j][i]);
+//                    if (trmipD) aida.cloud1D("Visible E HighD hits").fill(celbhit[j][i].getRawEnergy());
+//                }
             }
         }
         
@@ -291,58 +307,56 @@
                 for (int k=0; k<nhitecLayer[i]; ++k)
                 {
                     if (k == j) continue;
-                    double dmin = 2*_dminE;
+                    double dmin = _dminE;
                     double deltheta = Math.abs(celectheta[k][i]-celectheta[j][i]);
                     if (trmipD) aida.cloud1D("Delta Theta EC Cell").fill(deltheta);
                     double delphi = Math.abs(celecphi[k][i]-celecphi[j][i]);
                     if (delphi > Math.PI) delphi = 2*Math.PI-delphi;
                     if (trmipD) aida.cloud1D("Delta Phi EC Cell").fill(delphi);
                     double distance = Math.sqrt(deltheta*deltheta+delphi*delphi);
-                    if (i >= _numecemlayers) dmin = 2*_dminH;
+                    if (i >= _numecemlayers) dmin = _dminH;
                     if (distance < dmin)
                     {
-                        if (i < 30) celecden[j][i] += 0.0017/distance;
-                        if (i > 29) celecden[j][i] += 0.0042/distance;
+                        if (i < _numecemlayers) celecden[j][i] += 0.0028/distance;  // default was 0.0017, try 0.0026
+                        if (i > _numecemlayers-1) celecden[j][i] += 0.0085/distance;  // default was 0.0042, try 0.0062
                         if (trmipD) 
                         {
                             if (i == 0) aida.cloud1D("Distance between EM EC CAL hits layer 0").fill(distance);
-                            if (i < 30) aida.cloud1D("Distance between EM EC CAL hits").fill(distance);
-                            if (i > 29) aida.cloud1D("Distance between HAD EC CAL hits").fill(distance);
-                            if (i == 30) aida.cloud1D("Distance between HAD EC CAL hits layer 0").fill(distance);
+                            if (i < _numecemlayers) aida.cloud1D("Distance between EM EC CAL hits").fill(distance);
+                            if (i > _numecemlayers-1) aida.cloud1D("Distance between HAD EC CAL hits").fill(distance);
+                            if (i == _numecemlayers) aida.cloud1D("Distance between HAD EC CAL hits layer 0").fill(distance);
                         }
                     }
                 }
                 if (trmipD) aida.cloud1D("Cell Density EC").fill(celecden[j][i]);
-                if (celecden[j][i] > 0 && celecden[j][i] < _mincd) 
-                {
-                    lodenshitmap.put(celecID[j][i],celechit[j][i]);
-                    if (trmipD) aida.cloud1D("Visible E LowD hits").fill(celechit[j][i].getRawEnergy());
-                }
-                if (celecden[j][i] > _mincd) 
-                {
-                    hidenshitmap.put(celecID[j][i],celechit[j][i]);
-                    if (trmipD) aida.cloud1D("Visible E HighD hits").fill(celechit[j][i].getRawEnergy());
-                }
+                if (trmipD) aida.cloud2D("Cell Density EC vs Layer").fill(i,celecden[j][i]);                
+//                if (celecden[j][i] > 0 && celecden[j][i] < _mincd) 
+//                {
+//                    lodenshitmap.put(celecID[j][i],celechit[j][i]);
+//                    if (trmipD) aida.cloud1D("Visible E LowD hits").fill(celechit[j][i].getRawEnergy());
+//                }
+//                if (celecden[j][i] > _mincd) 
+//                {
+//                    hidenshitmap.put(celecID[j][i],celechit[j][i]);
+//                    if (trmipD) aida.cloud1D("Visible E HighD hits").fill(celechit[j][i].getRawEnergy());
+//                }
             }
         }
-        List<CalorimeterHit> lodensHits = new Vector<CalorimeterHit>();
-        lodensHits.addAll(lodenshitmap.values());
-        event.put("LowDensityHits",lodensHits);
-        List<CalorimeterHit> hidensHits = new Vector<CalorimeterHit>();
-        hidensHits.addAll(hidenshitmap.values());
-        event.put("HighDensityHits",hidensHits);
-        if (trmipD) aida.cloud2D("LowD vs HighD hits").fill(hidensHits.size(),lodensHits.size());
+//        List<CalorimeterHit> lodensHits = new Vector<CalorimeterHit>();
+//        lodensHits.addAll(lodenshitmap.values());
+//        event.put("LowDensityHits",lodensHits);
+//        List<CalorimeterHit> hidensHits = new Vector<CalorimeterHit>();
+//        hidensHits.addAll(hidenshitmap.values());
+//        event.put("HighDensityHits",hidensHits);
 
         // Loop over tracks in event, extrapolate to layers and match hits if mips
-//        List<CheatTrack> evtracks = event.get(CheatTrack.class, "CombinedTracks");
-        List<PerfectTrack> evtracks = event.get(PerfectTrack.class, "PerfectTracks");      
-//        aida.cloud1D("Number of Combined Tracks").fill(evtracks.size());
-//        System.out.println("Number of CheatTracks " +evtracks.size());
-        List<Track> ctracks = new ArrayList<Track>();
+        List<Track> evtracks = event.get(Track.class, "PerfectTracks");      
+//        aida.cloud1D("Number of Tracks").fill(evtracks.size());
         List<BasicCluster> mipclusters = new ArrayList<BasicCluster>();
         //  also, need a map linking tracks to mip clusters for future use and map linking IL to track
-        Map<PerfectTrack, BasicCluster> trkmipmap = new HashMap<PerfectTrack, BasicCluster>();
+        Map<Track, BasicCluster> trkmipmap = new HashMap<Track, BasicCluster>();
         Map<BasicCluster, Integer> clusILmap = new HashMap<BasicCluster, Integer>();
+        Map<Track, SpacePoint> trkposmap = new HashMap<Track, SpacePoint>();
         // Make hitmaps that contain mip hits
         HitMap embhitmap = (HitMap) (event.get("EMBarrhitmap"));
         HitMap hadbhitmap = (HitMap) (event.get("HADBarrhitmap"));
@@ -351,37 +365,37 @@
         double TotTrP = 0;
         int jt = 0;
         int[] IntLay = new int[200];
-        for (PerfectTrack itrack : evtracks)
+//        System.out.println(" Starting Track Loop in TMC");
+        for (Track itrack : evtracks)
         {
-//            IntLay[jt] = 0;   // set to first layer as default if wanted
             BasicCluster mipclus = new BasicCluster();
             double trpt = Math.sqrt(itrack.getPX()*itrack.getPX()+itrack.getPY()*itrack.getPY());
             double[] trp = itrack.getMomentum();
             Hep3Vector trp3 = new BasicHep3Vector(trp);
-//            double[] tror = itrack.getReferencePoint();
-//            Hep3Vector tror3 = new BasicHep3Vector(tror);
-            Hep3Vector tror3 = itrack.getOrigin();
+            double[] trrp = itrack.getReferencePoint();
+            double[] trpar = itrack.getTrackParameters();
+            double[] tror = new double[3];
+            tror[0] = -trpar[0]*Math.sin(trpar[1])+trrp[0];
+            tror[1] = trpar[0]*Math.cos(trpar[1])+trrp[1];
+            tror[2] = trpar[3]+trrp[2];
+//            System.out.println(" Track Origin " + tror[0] + " " + tror[1] + " " + tror[2]);
+            Hep3Vector tror3 = new BasicHep3Vector(tror);
+            SpacePoint trorsp = new SpacePoint(tror3);  //  old swimmer was deprecated, uses SP now
             int trq = itrack.getCharge();
 //            System.out.println("Track Charge " + trq + " Track P " + trp3 + " Origin " + tror3);
-            if (trq == 0) continue;  // sometimes these are photons!
-            ctracks.add(itrack);
-            // ctracks.set(jt, itrack);
+            if (trq == 0) continue;  // shouldn't need this, but it doesn't hurt
             TotTrP += Math.sqrt(itrack.getPX()*itrack.getPX()+itrack.getPY()*itrack.getPY()+itrack.getPZ()*itrack.getPZ());
-            if (trmipD) aida.cloud1D("pT of all Combined Tracks").fill(trpt);
-            HelixSwimmer tswim = new HelixSwimmer(_fieldStrength[2]);
+            if (trmipD) aida.cloud1D("pT of all Tracks").fill(trpt);
+            HelixSwimmer tswim = new HelixSwimmer(zField);
             // swim track to 1st layer of CAL, arguments are momentum, origin, and charge
-            tswim.setTrack(trp3, tror3, trq);
-//            System.out.println("Radius of first EM Barrel layer" + BRadii[0]);
+//            tswim.setTrack(trp3, tror3, trq);  // deprecated
+            tswim.setTrack(trp3, trorsp, trq);
             double torad = tswim.getDistanceToRadius(BRadii[0]);  // this is midpoint of first active layer of EM Barrel Cal
             double toz = tswim.getDistanceToZ(ECZs[0]);  // this is midpoint of first active layer of EM Endcap Cal
-//            System.out.println("Track pT " +trpt);
-//            System.out.println("Track momentum " +trp3);
-//            System.out.println("Track origin " +tror3);
-//            System.out.println("Rad Dist " +torad+ "Z Dist " +toz);
             //  if distance to radius is less than distance to z, use barrel hit collection, else use endcap
-            if (torad < toz)  // in Barrel
+            if (torad < Math.abs(toz))  // in Barrel
             {
-                if (trmipD) aida.cloud1D("Track pT Barrel Tracks").fill(trpt);
+                if (trmipD) aida.cloud1D("Track pT B Tracks").fill(trpt);
                 boolean nointeraction = true;
                 IntLay[jt] = _numbemlayers+_numbhadlayers;   // set to last layer
                 //  loop over all barrel layers, swimming track to radius and getting spacepoint
@@ -394,32 +408,32 @@
                         long[] layerid = new long[200];
                         CalorimeterHit[] layerHit = new CalorimeterHit[200];
                         double drad = tswim.getDistanceToRadius(BRadii[j]);
-                        SpacePoint trackSP = tswim.getPointAtDistance(drad);
+                        SpacePoint trackSP = tswim.getPointAtLength(drad);
 //                        System.out.println("Barrel Layer " + j + "Barrel Radius " + BRadii[j] + "SpacePoint " + trackSP);
-                        double trbtheta = trackSP.theta();
-                        if (trmipD) aida.cloud1D("Track Theta at EMBrad").fill(trbtheta);
-                        double trbphi = trackSP.phi();
-                        if (trmipD) aida.cloud1D("Track Phi at EMBrad").fill(trbphi);
+                        double trbtheta = Math.atan(trackSP.rxy()/trackSP.z());
+                        if (trbtheta<0) trbtheta+=Math.PI;
+                        double trbphi = Math.atan2(trackSP.y(),trackSP.x());
+                        if (trbphi<0) trbphi+=2*Math.PI;
+                        if (trmipD) aida.cloud1D("Track Theta at Brad").fill(trbtheta);
+                        if (trmipD) aida.cloud1D("Track Phi at Brad").fill(trbphi);
 //                        System.out.println("Track Theta " + trbtheta + "Track phi " + trbphi);
-                        if (trmipD) aida.cloud2D("Theta vs Phi for tracks at EMBrad").fill(trbphi,trbtheta);
+                        if (trmipD) aida.cloud2D("Theta vs Phi for tracks at Brad").fill(trbphi,trbtheta);
                         //  now loop over all hits in layer, adding mips or determining IL
                         for (int i=0; i<nhitbLayer[j]; ++i)
                         {
-                            if (trmipD) aida.cloud2D("Theta vs Phi for CAL B hits at EMBrad").fill(celbphi[i][j],celbtheta[i][j]);
+                            if (trmipD) aida.cloud2D("Theta vs Phi for CAL B hits at Brad").fill(celbphi[i][j],celbtheta[i][j]);
                             if (trmipD) aida.cloud1D("Del theta track CAL B cell").fill(Math.abs(trbtheta-celbtheta[i][j]));
                             double dthe = Math.abs(trbtheta-celbtheta[i][j]);
                             double dphi = Math.abs(trbphi-celbphi[i][j]);
                             if (dphi > Math.PI) dphi = 2*Math.PI-dphi;
                             if (trmipD) aida.cloud1D("Del phi track CAL B cell").fill(dphi);
                             double delpos = Math.sqrt(dphi*dphi+dthe*dthe);
-                            if (trmipD) aida.cloud2D("Del theta vs Del phi track CAL B cell").fill(dphi,dthe);
                             if (trmipD) aida.cloud1D("Del Pos Track CAL B cell").fill(delpos);
-                            // if (trpt>5 && j<30 && delpos<0.0075) aida.cloud1D("Cell Density for close B cells").fill(celbden[i][j]);
-                            // if (trpt>5 && j<30 && delpos>0.0075) aida.cloud1D("Cell Density for far B cells").fill(celbden[i][j]);
-                            // if (trpt>5 && j>29 && delpos<0.025) aida.cloud1D("Cell Density for close B cells").fill(celbden[i][j]);
-                            // if (trpt>5 && j>29 && delpos>0.025) aida.cloud1D("Cell Density for far B cells").fill(celbden[i][j]);
+                            if (trmipD && j<_numbemlayers) aida.cloud1D("Del Pos Track CAL B EM cell").fill(delpos);
+                            if (trmipD && j>_numbemlayers-1) aida.cloud1D("Del Pos Track CAL B HAD cell").fill(delpos);
+                            if (trmipD) aida.cloud2D("Del Pos Track CAL B cell vs cell density").fill(celbden[i][j],delpos);
                             double trcedmin = _dminTrC;  
-                            if (j >= _numbemlayers) trcedmin = 2*trcedmin;
+                            if (j >= _numbemlayers) trcedmin = 2.0*trcedmin;
                             if (delpos<trcedmin)
                             {
                                prden += celbden[i][j];
@@ -452,14 +466,13 @@
                                 }
                             }
                         }
-//                        if (trpt>5) System.out.println("Layer number " + j + " Number of matches " + ntcmatch + " Match density " + prden);
                     }
                 }
                 if (mipclus.getCalorimeterHits().size()==0) IntLay[jt]=0;
-                if (trmipD) aida.cloud1D("Interaction Layer in B").fill(IntLay[jt]);
+                aida.cloud1D("Interaction Layer in B").fill(IntLay[jt]);
             } else  // Endcap
             {
-                if (trmipD) aida.cloud1D("Track pT Endcap Tracks").fill(trpt);
+                if (trmipD) aida.cloud1D("Track pT EC Tracks").fill(trpt);
                 boolean nointeraction = true;
                 IntLay[jt] = _numecemlayers+_numechadlayers;  // set to last layer
                 //  loop over all barrel layers, swimming track to radius and getting spacepoint
@@ -472,11 +485,12 @@
                         long[] layerid = new long[200];
                         CalorimeterHit[] layerHit = new CalorimeterHit[200];
                         double drad = tswim.getDistanceToZ(ECZs[j]);
-                        SpacePoint trackSP = tswim.getPointAtDistance(drad);
-//                        System.out.println("Spacepoint in EMEndcap Layer 0 " +trackSP);
-                        double trectheta = trackSP.theta();
+                        SpacePoint trackSP = tswim.getPointAtLength(drad);
+                        double trectheta = Math.atan(trackSP.rxy()/trackSP.z());
+                        if (trectheta<0) trectheta+=Math.PI;
+                        double trecphi = Math.atan2(trackSP.y(),trackSP.x());
+                        if (trecphi<0) trecphi+=2*Math.PI;
                         if (trmipD) aida.cloud1D("Track Theta at ECZ").fill(trectheta);
-                        double trecphi = trackSP.phi();
                         if (trmipD) aida.cloud1D("Track Phi at ECZ").fill(trecphi);
                         if (trmipD) aida.cloud2D("Theta vs Phi for tracks at ECZ").fill(trecphi,trectheta);
                         // have track theta, phi in Endcaps - check for mip hits in Endcap Collections
@@ -489,11 +503,12 @@
                             if (dphi > Math.PI) dphi = 2*Math.PI-dphi;
                             if (trmipD) aida.cloud1D("Del phi track CAL EC cell").fill(dphi);
                             double delpos = Math.sqrt(dphi*dphi+dthe*dthe);
-                            if (trmipD) aida.cloud2D("Del theta vs Del phi track CAL EC cell").fill(dphi,dthe);
                             if (trmipD) aida.cloud1D("Del Pos Track CAL EC cell").fill(delpos);
-                            double trcedmin = 2*_dminTrC;  
-                            if (j >= _numecemlayers) trcedmin = 2*trcedmin;
-                            if (delpos<2*trcedmin)
+                            if (trmipD && j<_numecemlayers) aida.cloud1D("Del Pos Track CAL EC EM cell").fill(delpos);
+                            if (trmipD && j>_numecemlayers-1) aida.cloud1D("Del Pos Track CAL EC HAD cell").fill(delpos);                            
+                            double trcedmin = _dminTrC;  
+                            if (j >= _numecemlayers) trcedmin = 2.0*trcedmin;
+                            if (delpos<trcedmin)
                             {
                                prden += celecden[i][j];
                                layerid[ntcmatch] = celecID[i][j];
@@ -530,36 +545,32 @@
                     }
                 }
                 if (mipclus.getCalorimeterHits().size()==0) IntLay[jt]=0;
-                if (trmipD) aida.cloud1D("Interaction Layer in EC").fill(IntLay[jt]);
+                aida.cloud1D("Interaction Layer in EC").fill(IntLay[jt]);
             }
             //  add mip cluster to cluster list and fill maps
             mipclusters.add(mipclus);
             trkmipmap.put(itrack, mipclus);
             clusILmap.put(mipclus, IntLay[jt]);
-
+            trkposmap.put(itrack, trackspacept);
             jt++;  // increment track index
         }
         if (trmipD) aida.cloud1D("Total Track Momentum").fill(TotTrP);
-        if (trmipRes) aida.cloud1D("Number of Perfect Tracks").fill(evtracks.size());
-        if (trmipRes) aida.cloud1D("Number of mip clusters").fill(mipclusters.size());
-        if (trmipRes) aida.cloud2D("No of Tracks vs No of MipClus").fill(mipclusters.size(),evtracks.size());
+        if (trmipD) aida.cloud1D("Number of Perfect Tracks").fill(evtracks.size());
+        if (trmipD) aida.cloud1D("Number of mip clusters").fill(mipclusters.size());
+        if (trmipD) aida.cloud2D("No of Tracks vs No of MipClus").fill(mipclusters.size(),evtracks.size());
         for (BasicCluster mipcluster : mipclusters)
         {
-            if (trmipRes) aida.cloud1D("Number of hits in Mip Cluster").fill(mipcluster.getCalorimeterHits().size());
+            if (trmipD) aida.cloud1D("Number of hits in Mip Cluster").fill(mipcluster.getCalorimeterHits().size());
         }
         for (int i=0; i<evtracks.size(); ++i)
         {
-            if (trmipRes) aida.cloud1D("Interaction Layer all Tracks").fill(IntLay[i]);
+            aida.cloud1D("Interaction Layer all Tracks").fill(IntLay[i]);
 //            System.out.println("Interaction Layer for Track " + IntLay[i]);
         }
-        if (ctracks.size() > 0) event.put("Cheated Tracks", ctracks);  // cheated tracks now in event
         if (mipclusters.size() > 0) event.put(_nameExt, mipclusters);
         event.put("TrackMipMap",trkmipmap);
         event.put("MipClusILMap",clusILmap);
-//        System.out.println("EMB mip hitmap size " + embhitmap.size());
-//        System.out.println("HADB mip hitmap size " + hadbhitmap.size());
-//        System.out.println("EMEC mip hitmap size " + emechitmap.size());
-//        System.out.println("HADEC mip hitmap size " + hadechitmap.size());
+        event.put("TrackPosMap",trkposmap);
     }
     public void setClusterNameExtension(String ext)
     {
CVSspam 0.2.8