Print

Print


Commit in lcsim/src/org/lcsim/contrib/SteveMagill on MAIN
TrackMipClusterDriver.java+581added 1.1


lcsim/src/org/lcsim/contrib/SteveMagill
TrackMipClusterDriver.java added at 1.1
diff -N TrackMipClusterDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ TrackMipClusterDriver.java	23 Apr 2007 20:09:53 -0000	1.1
@@ -0,0 +1,581 @@
+package org.lcsim.contrib.SteveMagill;
+
+//  This driver extrapolates tracks into CAL, associating mips and determining interaction layer
+//  output : Mip Clusters and IL per track
+
+import java.util.*;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.Track;
+import org.lcsim.event.EventHeader;
+import org.lcsim.util.Driver;
+import org.lcsim.util.swim.*;
+import org.lcsim.util.lcio.LCIOConstants;
+import org.lcsim.recon.cluster.util.*;
+import org.lcsim.util.aida.*;
+import org.lcsim.geometry.*;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.BasicHep3Vector;
+import org.lcsim.geometry.subdetector.CylindricalCalorimeter;
+import org.lcsim.recon.ztracking.cheater.*;
+import org.lcsim.mc.fast.tracking.*;
+import hep.aida.*;
+import org.lcsim.spacegeom.*;
+import org.lcsim.geometry.util.CalorimeterIDDecoder;
+import org.lcsim.util.hitmap.HitMap;
+
+public class TrackMipClusterDriver extends Driver
+{
+   ITree tree;
+   IHistogramFactory histogramFactory;
+   IAnalysisFactory analysisFactory = IAnalysisFactory.create();
+   private AIDA aida = AIDA.defaultInstance();
+   private boolean _initialized = false;
+//    The number of layers in the EM Calorimeter Barrel, Endcap
+   private int _numbemlayers;
+   private int _numecemlayers;
+//    The number of layers in the Hadronic Calorimeter Barrel, Endcap
+   private  int _numbhadlayers;
+   private int _numechadlayers;
+//    The EM calorimeter hits, by layer in barrel, endcap
+   private List[] _emBLayerHits;
+   private List[] _emECLayerHits;
+//    The HAD calorimeter hits, by layer in barrel, endcap
+   private List[] _hadBLayerHits;
+   private List[] _hadECLayerHits;
+//    The radii of the barrel calorimeter layers
+   private double[] _emBRadii;
+   private double[] _hadBRadii;
+   private double[] BRadii = new double[100];
+   private double[] ECZs = new double[100];
+//    modified Barrel helix swimmer for org.lcsim test
+//   private Helix[] _emBSwimmers; //EM
+//   private Helix[] _hadBSwimmers; //HAD
+//   Z extent of the central barrel calorimeters.
+   private double _embZ; //EM Barrel Z
+   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;
+   private double _mincd;
+   private String _nameExt;
+   private String[] _hitcollnames;
+   private boolean trmipD = false;
+   private boolean trmipRes = false;
+//   private String[] _hitmapnames;
+   
+   public TrackMipClusterDriver(double dminE, double dminH, double dminTrC, double mincd)
+   {
+       _dminE = dminE;
+       _dminH = dminH;
+       _dminTrC = dminTrC;
+       _mincd = mincd;
+   }
+   
+    protected void process(EventHeader event)
+    {
+        super.process(event);  // executes all added drivers
+        
+        boolean mcfltr = true;
+//        mcfltr = (Boolean)event.get("MCFilt");
+//        System.out.println("MCFilt is " +mcfltr);
+        if (mcfltr)
+        {
+        
+//      Initialize things here
+        if(!_initialized)
+        {
+            // 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");
+            
+            //  Setup layer counts and distances for barrel, endcap
+            CylindricalCalorimeter emb = ((CylindricalCalorimeter) det.getSubdetectors().get("EMBarrel"));
+            _embZ = emb.getZMin();
+            _numbemlayers = emb.getLayering().getLayerCount();
+//            System.out.println("EM Barrel Layers " +_numbemlayers);
+            for (int i=0; i<_numbemlayers; ++i)
+            {
+                BRadii[i]=emb.getLayering().getDistanceToLayerSensorMid(i);
+//                System.out.println("EM Barrel Layer Number " +i+ " EM Barrel Radius " +_emBRadii[i]);
+            }
+            
+            CylindricalCalorimeter emec = ((CylindricalCalorimeter) det.getSubdetectors().get("EMEndcap"));
+            _numecemlayers = emec.getLayering().getLayerCount();
+//            System.out.println("EM EC Layers " +_numecemlayers);
+            for (int i=0; i<_numecemlayers; ++i)
+            {
+                ECZs[i] = emec.getLayering().getDistanceToLayerSensorMid(i);
+//                System.out.println("EM Endcap Layer Number " +i+ " EM Endcap Z " +_emecZ[i]);
+            }
+
+            CylindricalCalorimeter hadb = ((CylindricalCalorimeter) det.getSubdetectors().get("HADBarrel"));       
+            _hadbZ = hadb.getZMin();
+            _numbhadlayers = hadb.getLayering().getLayerCount();
+//            System.out.println("HAD Barrel Layers " +_numbhadlayers);   
+            for (int i=0; i<_numbhadlayers; ++i)
+            {
+                BRadii[i+_numbemlayers]=hadb.getLayering().getDistanceToLayerSensorMid(i);
+//                System.out.println("HAD Barrel Layer Number " +i+ " HAD Barrel Radius " +_hadBRadii[i]);
+            }
+            
+            CylindricalCalorimeter hadec = ((CylindricalCalorimeter) det.getSubdetectors().get("HADEndcap"));       
+            _numechadlayers = hadec.getLayering().getLayerCount();
+//            System.out.println("HAD Endcap Layers " +_numechadlayers); 
+            for (int i=0; i<_numechadlayers; ++i)
+            {
+                ECZs[i+_numecemlayers] = hadec.getLayering().getDistanceToLayerSensorMid(i);
+//                System.out.println("HAD Endcap Layer Number " +i+ " HAD Endcap Z " +_hadecZ[i]);
+            }
+        
+            _initialized = true;
+        }  // end of initialization section
+        
+        // Need cells in CAL, but need to have them arranged in layers with density for each cell
+        // only done once, and only internal to this piece of code
+        // variables for barrel
+        int nhitsBTotCAL=0;  int nhitsEMB=0;  int nhitsHADB=0;
+        double[][] celbtheta = new double[10000][100];
+        double[][] celbphi = new double[10000][100];
+        double[][] celbden = new double[10000][100];
+        long[][] celbID = new long[10000][100];
+        CalorimeterHit[][] celbhit = new CalorimeterHit[10000][100];
+        int[] nhitbLayer = new int[200];
+        // variables for endcap
+        int nhitsECTotCAL=0;  int nhitsEMEC=0;  int nhitsHADEC=0;
+        double[][] celectheta = new double[10000][100];
+        double[][] celecphi = new double[10000][100];
+        double[][] celecden = new double[10000][100];
+        long[][] celecID = new long[10000][100];
+        CalorimeterHit[][] celechit = new CalorimeterHit[10000][100];
+        int[] nhitecLayer = new int[200];
+        
+        for (int i=0; i<_hitcollnames.length; i++)
+        {
+            List<CalorimeterHit> chits = event.get(CalorimeterHit.class,_hitcollnames[i]);
+            CalorimeterIDDecoder caldecoder = (CalorimeterIDDecoder) event.getMetaData(chits).getIDDecoder();                  
+//            System.out.println("Collection is " +_hitcollnames[i]);
+            if (_hitcollnames[i] == "EcalBarrDigiHits")
+            {
+                for (CalorimeterHit chit : chits)
+                {
+                    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;
+                    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")
+            {
+                for (CalorimeterHit chit : chits)
+                {
+                    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;
+                    celbphi[nhitbLayer[nlay]][nlay] = cellphi;
+                    celbID[nhitbLayer[nlay]][nlay] = cID;
+                    celbhit[nhitbLayer[nlay]][nlay] = chit;
+                    nhitbLayer[nlay]++;
+                    nhitsHADB++;
+                    nhitsBTotCAL++;
+                }
+            } else if (_hitcollnames[i] == "EcalEndcapDigiHits")
+            {
+                for (CalorimeterHit chit : chits)
+                {
+                    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;
+                    celecID[nhitecLayer[nlay]][nlay] = cID;
+                    celechit[nhitecLayer[nlay]][nlay] = chit;
+                    nhitecLayer[nlay]++;
+                    nhitsEMEC++;
+                    nhitsECTotCAL++;
+                }
+            } else if (_hitcollnames[i] == "HcalEndcapDigiHits")
+            {
+                for (CalorimeterHit chit : chits)
+                {
+                    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;
+                    celecID[nhitecLayer[nlay]][nlay] = cID;
+                    celechit[nhitecLayer[nlay]][nlay] = chit;
+                    nhitecLayer[nlay]++;
+                    nhitsHADEC++;
+                    nhitsECTotCAL++;
+                }
+            } else
+            {
+                System.out.println("From TrackMipClusterDriver - IMPROPER COLLECTIONS");
+            }
+        }
+        if (trmipD) aida.cloud1D("Total number of hits in B CAL").fill(nhitsBTotCAL);
+        if (trmipD) aida.cloud1D("Total number of hits in EC CAL").fill(nhitsECTotCAL);
+        // 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();
+        for (int i=0; i<_numbemlayers+_numbhadlayers; ++i)
+        {
+            for (int j=0; j<nhitbLayer[i]; ++j)
+            {
+                celbden[j][i] = 1;
+                for (int k=0; k<nhitbLayer[i]; ++k)
+                {
+                    if (k == j) continue;
+                    double dmin = _dminE;
+                    double deltheta = Math.abs(celbtheta[k][i]-celbtheta[j][i]);
+                    if (trmipD) aida.cloud1D("Delta Theta B Cell").fill(deltheta);
+                    double delphi = Math.abs(celbphi[k][i]-celbphi[j][i]);
+                    if (delphi > Math.PI) delphi = 2*Math.PI-delphi;
+                    if (trmipD) aida.cloud1D("Delta Phi B Cell").fill(delphi);
+                    double distance = Math.sqrt(deltheta*deltheta+delphi*delphi);
+                    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 (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 (trmipD) aida.cloud1D("Cell Density B").fill(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());
+                }
+            }
+        }
+        
+        // Now calculate densities for hits in endcap
+        for (int i=0; i<_numecemlayers+_numechadlayers; ++i)
+        {
+            for (int j=0; j<nhitecLayer[i]; ++j)
+            {
+                celecden[j][i] = 1;
+                for (int k=0; k<nhitecLayer[i]; ++k)
+                {
+                    if (k == j) continue;
+                    double dmin = 2*_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 (distance < dmin)
+                    {
+                        if (i < 30) celecden[j][i] += 0.0017/distance;
+                        if (i > 29) celecden[j][i] += 0.0042/distance;
+                        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 (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());
+                }
+            }
+        }
+        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());
+
+        // 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<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<BasicCluster, Integer> clusILmap = new HashMap<BasicCluster, Integer>();
+        // Make hitmaps that contain mip hits
+        HitMap embhitmap = (HitMap) (event.get("EMBarrhitmap"));
+        HitMap hadbhitmap = (HitMap) (event.get("HADBarrhitmap"));
+        HitMap emechitmap = (HitMap) (event.get("EMEndcaphitmap"));
+        HitMap hadechitmap = (HitMap) (event.get("HADEndcaphitmap"));
+        double TotTrP = 0;
+        int jt = 0;
+        int[] IntLay = new int[200];
+        for (PerfectTrack 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();
+            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);
+            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]);
+            // 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]);
+            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 (trmipD) aida.cloud1D("Track pT Barrel 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
+                for (int j=0; j<_numbemlayers+_numbhadlayers; ++j)
+                {
+                    if (nointeraction)
+                    {
+                        double prden = 0;
+                        int ntcmatch = 0;
+                        long[] layerid = new long[200];
+                        CalorimeterHit[] layerHit = new CalorimeterHit[200];
+                        double drad = tswim.getDistanceToRadius(BRadii[j]);
+                        SpacePoint trackSP = tswim.getPointAtDistance(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);
+//                        System.out.println("Track Theta " + trbtheta + "Track phi " + trbphi);
+                        if (trmipD) aida.cloud2D("Theta vs Phi for tracks at EMBrad").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.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]);
+                            double trcedmin = _dminTrC;  
+                            if (j >= _numbemlayers) trcedmin = 2*trcedmin;
+                            if (delpos<trcedmin)
+                            {
+                               prden += celbden[i][j];
+                               layerid[ntcmatch] = celbID[i][j];
+                               layerHit[ntcmatch] = celbhit[i][j];
+                               ntcmatch++;
+                            }
+                        }
+                        if (ntcmatch>0) prden = prden/ntcmatch;
+                        if (prden == 0 || prden>_mincd) 
+                        {
+                            IntLay[jt] = j;
+                            nointeraction = false;
+                            if (trmipD) aida.cloud1D("Cell Density Sum for B Interactions").fill(prden);
+                        } else
+                        {
+                            if (trmipD) aida.cloud1D("Cell Density Sum for B Noninteractions").fill(prden);
+                            // add hits in this layer to mip cluster, remove from hitmap
+                            for (int l=0; l<ntcmatch; ++l)
+                            {
+//                                System.out.println("Add this hit to B mip cluster " + l + " Layer " +j);
+//                                System.out.println("Hit ID " + layerid[l] + " Hit " + layerHit[l]);
+                                mipclus.addHit(layerHit[l]);
+                                if (j<_numbemlayers)
+                                {
+                                    embhitmap.remove(layerid[l]);
+                                } else
+                                {
+                                    hadbhitmap.remove(layerid[l]);
+                                }
+                            }
+                        }
+//                        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]);
+            } else  // Endcap
+            {
+                if (trmipD) aida.cloud1D("Track pT Endcap 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
+                for (int j=0; j<_numecemlayers+_numechadlayers; ++j)
+                {
+                    if (nointeraction)
+                    {
+                        double prden = 0;
+                        int ntcmatch = 0;
+                        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();
+                        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
+                        for (int i=0; i<nhitecLayer[j]; ++i)
+                        {
+                            if (trmipD) aida.cloud2D("Theta vs Phi for CAL EC hits at ECZ").fill(celecphi[i][j],celectheta[i][j]);
+                            if (trmipD) aida.cloud1D("Del theta track CAL EC cell").fill(Math.abs(trectheta-celectheta[i][j]));
+                            double dthe = Math.abs(trectheta-celectheta[i][j]);
+                            double dphi = Math.abs(trecphi-celecphi[i][j]);
+                            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)
+                            {
+                               prden += celecden[i][j];
+                               layerid[ntcmatch] = celecID[i][j];
+                               layerHit[ntcmatch] = celechit[i][j];
+                               ntcmatch++;
+                            }
+                        }
+                        if (ntcmatch>0) prden = prden/ntcmatch;
+                        if (prden == 0 || prden>_mincd) 
+                        {
+                            IntLay[jt] = j;
+                            nointeraction = false;
+                            if (trmipD) aida.cloud1D("Cell Density Sum for EC Interactions").fill(prden);
+                        } else
+                        {
+                            if (trmipD) aida.cloud1D("Cell Density Sum for EC Noninteractions").fill(prden);
+                            // add hits in this layer to mip cluster
+//                            System.out.println("Number of matches " + ntcmatch);
+//                            System.out.println("Number of hits in this layer " + nhitecLayer[j]);
+                            for (int l=0; l<ntcmatch; ++l)
+                            {
+//                                System.out.println("Add this hit to EC mip cluster " + l + " Layer " +j);
+//                                System.out.println("Hit ID " + layerid[l] + " Hit " + layerHit[l]);
+                                mipclus.addHit(layerHit[l]);
+                                if (j<_numecemlayers)
+                                {
+                                    emechitmap.remove(layerid[l]);
+                                } else
+                                {
+                                    hadechitmap.remove(layerid[l]);
+                                }
+                            }
+                        }
+                    }
+                }
+                if (mipclus.getCalorimeterHits().size()==0) IntLay[jt]=0;
+                if (trmipD) 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]);
+
+            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());
+        for (BasicCluster mipcluster : mipclusters)
+        {
+            if (trmipRes) 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]);
+//            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());
+        
+    }  // end of filter loop
+    }
+    public void setClusterNameExtension(String ext)
+    {
+        _nameExt = ext;
+    }
+    public void setCollectionNames(String[] names)
+    {
+        _hitcollnames = names;
+    }
+}
+
CVSspam 0.2.8