ROOT logo
/**************************************************************************
* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
*                                                                        *
* Author: The ALICE Off-line Project.                                    *
* Contributors are mentioned in the code where appropriate.              *
*                                                                        *
* Permission to use, copy, modify and distribute this software and its   *
* documentation strictly for non-commercial purposes is hereby granted   *
* without fee, provided that the above copyright notice appears in all   *
* copies and that both the copyright notice and this permission notice   *
* appear in the supporting documentation. The authors make no claims     *
* about the suitability of this software for any purpose. It is          *
* provided "as is" without express or implied warranty.                  *
**************************************************************************/

// $Id$

///
/// Maker/merger of contours. Can create contour from a set polygons or
/// merger a set of contours into a single one.
/// 
/// This is based on (one of the) algorithm found in 
/// Diane L. Souvaine and Iliana Bjorling-Sachs,
/// Proceedings of the IEEE, Vol. 80, No. 9, September 1992, p. 1449
///
/// Note that besides the AliMUON prefix, nothing is really MUON specific
/// in this class...
///
/// \author Laurent Aphecetche, Subatech
///

#include "AliMUONContourMaker.h"

#include "AliCodeTimer.h"
#include "AliLog.h"
#include "AliMUONContour.h"
#include "AliMUONPointWithRef.h"
#include "AliMUONPolygon.h"
#include "AliMUONSegment.h"
#include "AliMUONSegmentTree.h"
#include "Riostream.h"
#include "TArrayD.h"
#include "TMath.h"
#include <cassert>
#include "TArrayI.h"

/// \cond CLASSIMP
ClassImp(AliMUONContourMaker)
/// \endcond

//_____________________________________________________________________________
AliMUONContourMaker::AliMUONContourMaker() 
{
/// Default constructor
}


//_____________________________________________________________________________
AliMUONContourMaker::~AliMUONContourMaker()
{
/// Destructor
}

//_____________________________________________________________________________
AliMUONContour* 
AliMUONContourMaker::CreateContour(const TObjArray& polygons, const char* name) const
{
  /// Create the contour of the polygon array
  /// and get back the intermediate verticals and horizontal segments
  /// both arrays are arrays of AliMUONSegment objects.
  
  AliCodeTimerAuto("",0);
  
  if ( polygons.IsEmpty() ) return 0x0; // protection against user error...
  
  // Sanity check : insure that all polygons are oriented counter-clockwise
  TIter next(&polygons);
  AliMUONPolygon* pol;
  while ( ( pol = static_cast<AliMUONPolygon*>(next()) ) )
  {
    if ( !pol->IsCounterClockwiseOriented() )
    {
      AliError(Form("Got a clockwise oriented polygon in CreateContour(%s). That's not OK !",name));
      StdoutToAliError(polygons.Print());
      return 0x0;
    }
  }
  
  AliMUONContour* contour(0x0);
  
  if ( polygons.GetLast() == 0 ) 
  {
    AliCodeTimerAuto("Trivial case",1);
    contour = new AliMUONContour(name);
    pol = static_cast<AliMUONPolygon*>(polygons.First());
    contour->Add(*pol);
    contour->AssertOrientation();
    return contour;
  }
  
  TObjArray polygonVerticalEdges; // arrray of AliMUONSegment objects  
  polygonVerticalEdges.SetOwner(kTRUE);
  // get vertical edges of input polygons
  GetVerticalEdges(polygons,polygonVerticalEdges);
  
  // sort them in ascending x order
  // if same x, insure that left edges are before right edges
  // within same x, order by increasing bottommost y (see AliMUONSegment::Compare method)
  polygonVerticalEdges.Sort();
  
  if ( polygonVerticalEdges.GetLast()+1 < 2 ) 
  {
    polygons.Print();
    AliFatal(Form("Got too few edges here for createContour %s",name));
  }
  
  // Find the vertical edges of the merged contour. This is the meat of the algorithm...
  TObjArray contourVerticalEdges;
  contourVerticalEdges.SetOwner(kTRUE);
  Sweep(polygonVerticalEdges,contourVerticalEdges);
  
  TObjArray horizontals;
  horizontals.SetOwner(kTRUE);
  VerticalToHorizontal(contourVerticalEdges,horizontals);
  
  contour = FinalizeContour(contourVerticalEdges,horizontals);
  
  if ( contour && name ) contour->SetName(name);
  
  return contour;
}

//_____________________________________________________________________________
AliMUONContour* 
AliMUONContourMaker::FinalizeContour(const TObjArray& verticals,
                                     const TObjArray& horizontals) const
{  
  /// For a list of vertical and horizontal edges, we build the final
  /// contour object.
  
  AliCodeTimerAuto("",0);
  
  TObjArray all; // array of AliMUONSegment
  TObjArray inorder; // array of AliMUONSegment

  all.SetOwner(kFALSE);
  inorder.SetOwner(kFALSE);
    
  for ( Int_t i = 0; i <= verticals.GetLast(); ++i ) 
  {
    all.Add(verticals.UncheckedAt(i));
    all.Add(horizontals.UncheckedAt(i));
  }

  TArrayI alreadyAdded(all.GetLast()+1);
  alreadyAdded.Reset();
  
  Int_t i(0);
  
  AliMUONContour* contour = new AliMUONContour;
  
  int total(0);
  
  while ( !all.IsEmpty() )
  {
    total++;
    
    if ( total > 1000 ) 
    {
      AliError("Total 1000 reached !!!!");
      return 0x0;
    }
    
    AliMUONSegment* si = static_cast<AliMUONSegment*>(all.UncheckedAt(i));
    inorder.Add(si);
    alreadyAdded[i] = 1;
    const AliMUONSegment* all0 = static_cast<const AliMUONSegment*>(all.First());
    if ( i != 0 && AliMUONSegment::AreEqual(si->EndX(),all0->StartX()) && AliMUONSegment::AreEqual(si->EndY(),all0->StartY()) )
    {
      Int_t n(-1);
      
      AliMUONPolygon polygon(inorder.GetLast()+2);

      // we got a cycle. Add it to the contour
      for ( Int_t j = 0; j <= inorder.GetLast(); ++j ) 
      {
        AliMUONSegment* s = static_cast<AliMUONSegment*>(inorder.UncheckedAt(j));
        polygon.SetVertex(++n,s->StartX(),s->StartY());
        all.Remove(s);
      }
      
      all.Compress();

      polygon.Close();
      
      contour->Add(polygon);
      
      if ( ! all.IsEmpty() )
      {
        i = 0;
        inorder.Clear();
        alreadyAdded.Set(all.GetLast()+1);
        alreadyAdded.Reset();
      }
      continue;
    }
    
    for ( Int_t j = 0; j <= all.GetLast(); ++j) 
    {
      if ( j != i && alreadyAdded[j] == 0 ) 
      {        
        const AliMUONSegment* sj = static_cast<const AliMUONSegment*>(all.UncheckedAt(j));
        if ( AliMUONSegment::AreEqual(si->EndX(),sj->StartX()) && AliMUONSegment::AreEqual(si->EndY(),sj->StartY()))
        {
          i = j;
          break;
        }
      }
    }    
  }
  
  contour->AssertOrientation(kTRUE);
  return contour;
}


//_____________________________________________________________________________
void 
AliMUONContourMaker::GetVerticalEdges(const TObjArray& polygons, TObjArray& polygonVerticalEdges) const
{
  /// From an array of polygons, extract the list of vertical edges.
  /// Output array polygonVerticalEdges should be empty before calling.
  
  AliCodeTimerAuto("",0);
  
  for ( Int_t i = 0; i <= polygons.GetLast(); ++i ) 
  {
    const AliMUONPolygon* g = static_cast<const AliMUONPolygon*>(polygons.UncheckedAt(i));
    for ( Int_t j = 0; j < g->NumberOfVertices()-1; ++j ) 
    {
      if ( AliMUONSegment::AreEqual(g->X(j),g->X(j+1)) ) // segment is vertical
      {
        polygonVerticalEdges.Add(new AliMUONSegment(g->X(j),g->Y(j),g->X(j+1),g->Y(j+1)));
      }
    }
  }
}


//_____________________________________________________________________________
void
AliMUONContourMaker::GetYPositions(const TObjArray& polygonVerticalEdges,
                                   TArrayD& yPositions) const
{
  /// Fill the array yPositions with the different y positions found in 
  /// polygonVerticalEdges
  
  AliCodeTimerAuto("",0);
  
  Double_t* y = new Double_t[polygonVerticalEdges.GetSize()*2];
  Int_t n(0);
  
  for ( Int_t i = 0; i < polygonVerticalEdges.GetLast(); ++i ) 
  {
    AliMUONSegment* s = static_cast<AliMUONSegment*>(polygonVerticalEdges.UncheckedAt(i));
    y[n] = s->StartY();
    y[n+1] = s->EndY();
    n += 2;
  }
  Int_t* ix = new Int_t[n+1];
  
  TMath::Sort(n,y,ix,kFALSE);
  
  yPositions.Set(n+1);
  
  Int_t u(0);
  Double_t x(FLT_MAX);
  
  for ( Int_t i = 0; i < n; ++i ) 
  {
    if ( y[ix[i]] != x )
    {
      yPositions[u] = y[ix[i]];
      x = y[ix[i]];
      ++u;
    }
  }

  yPositions.Set(u);
  
  delete[] ix;
  delete[] y;
  
}

//_____________________________________________________________________________
AliMUONContour* 
AliMUONContourMaker::MergeContour(const TObjArray& contours, const char* name) const
{
  /// Merge all the polygons of all contours into a single contour
  
  AliCodeTimerAuto("",0);
  
  TObjArray polygons;
  polygons.SetOwner(kTRUE);
  
  TIter next(&contours);
  AliMUONContour* contour;
  while ( ( contour = static_cast<AliMUONContour*>(next()) ) )
  {
    const TObjArray* contourPolygons = contour->Polygons();
    TIter nextPol(contourPolygons);
    AliMUONPolygon* pol;
    while ( ( pol = static_cast<AliMUONPolygon*>(nextPol()) ) )
    {
      polygons.Add(new AliMUONPolygon(*pol));
    }
  }
  
  if ( polygons.IsEmpty() ) return 0x0;
  
  contour = CreateContour(polygons,name);
  
  return contour;
}

//_____________________________________________________________________________
void 
AliMUONContourMaker::SortPoints(const TObjArray& polygonVerticalEdges, 
                                TObjArray& sortedPoints) const
{
  /// Sort the point of the vertical edges in ascending order, first on ordinate, 
  /// then on abcissa, and put them in output vector sortedPoints.
  /// Output array sortedPoints should be empty before calling this method.
  
  AliCodeTimerAuto("",0);
  
  for ( Int_t i = 0; i <= polygonVerticalEdges.GetLast(); ++i )
  {
    const AliMUONSegment* e = static_cast<const AliMUONSegment*>(polygonVerticalEdges.UncheckedAt(i));
    sortedPoints.Add(new AliMUONPointWithRef(e->StartX(),e->StartY(),i));
    sortedPoints.Add(new AliMUONPointWithRef(e->EndX(),e->EndY(),i));
    // note that we keep track of the original edge, which is used
    // later on to deduce orientation of horizontal edges.
  }
  
  sortedPoints.Sort(); 
}

//_____________________________________________________________________________
void 
AliMUONContourMaker::Sweep(const TObjArray& polygonVerticalEdges, 
                           TObjArray& contourVerticalEdges) const
{
  /// This is the meat of the algorithm of the contour merging...
  
  AliCodeTimerAuto("",0);
  
  TArrayD yPositions;
  GetYPositions(polygonVerticalEdges,yPositions);
  
  AliMUONSegmentTree segmentTree(yPositions);
  
  for ( Int_t i = 0; i <= polygonVerticalEdges.GetLast(); ++i )
  {
    const AliMUONSegment* edge = static_cast<const AliMUONSegment*>(polygonVerticalEdges.UncheckedAt(i));
    
    assert(edge!=0x0);
    
    if ( edge->IsLeftEdge() ) 
    {
      segmentTree.Contribution(edge->Bottom(),edge->Top());
      segmentTree.InsertInterval(edge->Bottom(),edge->Top());
    }
    else
    {
      segmentTree.DeleteInterval(edge->Bottom(),edge->Top());
      segmentTree.Contribution(edge->Bottom(),edge->Top());
    }
    
    AliMUONSegment e1(*edge);
    
    if ( i < polygonVerticalEdges.GetLast() ) 
    {
      const AliMUONSegment* next = static_cast<const AliMUONSegment*>(polygonVerticalEdges.UncheckedAt(i+1));
      e1 = *next;
    }

    if ( ( edge->IsLeftEdge() != e1.IsLeftEdge() ) ||
        ( !AliMUONSegment::AreEqual(edge->StartX(),e1.StartX() ) ) ||
        ( i == polygonVerticalEdges.GetLast() ) )
    {
      const TObjArray& stack = segmentTree.Stack();
      
      double x = edge->StartX();
      
      for ( Int_t j = 0; j <= stack.GetLast(); ++j )
      {
        AliMUONSegment* sj = static_cast<AliMUONSegment*>(stack.UncheckedAt(j));
        AliMUONSegment* s = new AliMUONSegment(x,sj->StartY(),x,sj->EndY());
        
        if  (s->IsAPoint()) 
        {
          delete s;
          continue;
        }
        
        if ( edge->IsLeftEdge() != s->IsLeftEdge() ) 
        {
          s->Set(x,sj->EndY(),x,sj->StartY());
        }
        contourVerticalEdges.Add(s);
      }
      segmentTree.ResetStack();
    }
  }
}

//_____________________________________________________________________________
void 
AliMUONContourMaker::VerticalToHorizontal(const TObjArray& polygonVerticalEdges,
                                          TObjArray& horizontalEdges) const
{
  /// Deduce the set of horizontal edges from the vertical edges
  /// Output array horizontalEdges should be empty before calling this method
  
  AliCodeTimerAuto("",0);
  
  TObjArray points; // array of AliMUONPointWithRef
  points.SetOwner(kTRUE);
  
  SortPoints(polygonVerticalEdges,points);
  
  for ( Int_t k = 0; k < (points.GetLast()+1)/2; ++k )
  {
    const AliMUONPointWithRef* p1 = static_cast<AliMUONPointWithRef*>(points.UncheckedAt(k*2));
    const AliMUONPointWithRef* p2 = static_cast<AliMUONPointWithRef*>(points.UncheckedAt(k*2+1));
    
    const AliMUONSegment* refEdge = static_cast<const AliMUONSegment*>(polygonVerticalEdges.UncheckedAt(p1->Ref()));
    
    // (p1,p2) is the horizontal edge.
    // refEdge is used to deduce the orientation of (p1,p2)
    
    if ( AliMUONSegment::AreEqual(p1->X(),refEdge->EndX()) && AliMUONSegment::AreEqual(p1->Y(),refEdge->EndY()) )
//    if ( AreEqual(p1,refEdge->End()) )
    {
      horizontalEdges.Add(new AliMUONSegment(p1->X(),p1->Y(),p2->X(),p2->Y()));
    }
    else
    {
      horizontalEdges.Add(new AliMUONSegment(p2->X(),p2->Y(),p1->X(),p1->Y()));
    }
  }
}

 AliMUONContourMaker.cxx:1
 AliMUONContourMaker.cxx:2
 AliMUONContourMaker.cxx:3
 AliMUONContourMaker.cxx:4
 AliMUONContourMaker.cxx:5
 AliMUONContourMaker.cxx:6
 AliMUONContourMaker.cxx:7
 AliMUONContourMaker.cxx:8
 AliMUONContourMaker.cxx:9
 AliMUONContourMaker.cxx:10
 AliMUONContourMaker.cxx:11
 AliMUONContourMaker.cxx:12
 AliMUONContourMaker.cxx:13
 AliMUONContourMaker.cxx:14
 AliMUONContourMaker.cxx:15
 AliMUONContourMaker.cxx:16
 AliMUONContourMaker.cxx:17
 AliMUONContourMaker.cxx:18
 AliMUONContourMaker.cxx:19
 AliMUONContourMaker.cxx:20
 AliMUONContourMaker.cxx:21
 AliMUONContourMaker.cxx:22
 AliMUONContourMaker.cxx:23
 AliMUONContourMaker.cxx:24
 AliMUONContourMaker.cxx:25
 AliMUONContourMaker.cxx:26
 AliMUONContourMaker.cxx:27
 AliMUONContourMaker.cxx:28
 AliMUONContourMaker.cxx:29
 AliMUONContourMaker.cxx:30
 AliMUONContourMaker.cxx:31
 AliMUONContourMaker.cxx:32
 AliMUONContourMaker.cxx:33
 AliMUONContourMaker.cxx:34
 AliMUONContourMaker.cxx:35
 AliMUONContourMaker.cxx:36
 AliMUONContourMaker.cxx:37
 AliMUONContourMaker.cxx:38
 AliMUONContourMaker.cxx:39
 AliMUONContourMaker.cxx:40
 AliMUONContourMaker.cxx:41
 AliMUONContourMaker.cxx:42
 AliMUONContourMaker.cxx:43
 AliMUONContourMaker.cxx:44
 AliMUONContourMaker.cxx:45
 AliMUONContourMaker.cxx:46
 AliMUONContourMaker.cxx:47
 AliMUONContourMaker.cxx:48
 AliMUONContourMaker.cxx:49
 AliMUONContourMaker.cxx:50
 AliMUONContourMaker.cxx:51
 AliMUONContourMaker.cxx:52
 AliMUONContourMaker.cxx:53
 AliMUONContourMaker.cxx:54
 AliMUONContourMaker.cxx:55
 AliMUONContourMaker.cxx:56
 AliMUONContourMaker.cxx:57
 AliMUONContourMaker.cxx:58
 AliMUONContourMaker.cxx:59
 AliMUONContourMaker.cxx:60
 AliMUONContourMaker.cxx:61
 AliMUONContourMaker.cxx:62
 AliMUONContourMaker.cxx:63
 AliMUONContourMaker.cxx:64
 AliMUONContourMaker.cxx:65
 AliMUONContourMaker.cxx:66
 AliMUONContourMaker.cxx:67
 AliMUONContourMaker.cxx:68
 AliMUONContourMaker.cxx:69
 AliMUONContourMaker.cxx:70
 AliMUONContourMaker.cxx:71
 AliMUONContourMaker.cxx:72
 AliMUONContourMaker.cxx:73
 AliMUONContourMaker.cxx:74
 AliMUONContourMaker.cxx:75
 AliMUONContourMaker.cxx:76
 AliMUONContourMaker.cxx:77
 AliMUONContourMaker.cxx:78
 AliMUONContourMaker.cxx:79
 AliMUONContourMaker.cxx:80
 AliMUONContourMaker.cxx:81
 AliMUONContourMaker.cxx:82
 AliMUONContourMaker.cxx:83
 AliMUONContourMaker.cxx:84
 AliMUONContourMaker.cxx:85
 AliMUONContourMaker.cxx:86
 AliMUONContourMaker.cxx:87
 AliMUONContourMaker.cxx:88
 AliMUONContourMaker.cxx:89
 AliMUONContourMaker.cxx:90
 AliMUONContourMaker.cxx:91
 AliMUONContourMaker.cxx:92
 AliMUONContourMaker.cxx:93
 AliMUONContourMaker.cxx:94
 AliMUONContourMaker.cxx:95
 AliMUONContourMaker.cxx:96
 AliMUONContourMaker.cxx:97
 AliMUONContourMaker.cxx:98
 AliMUONContourMaker.cxx:99
 AliMUONContourMaker.cxx:100
 AliMUONContourMaker.cxx:101
 AliMUONContourMaker.cxx:102
 AliMUONContourMaker.cxx:103
 AliMUONContourMaker.cxx:104
 AliMUONContourMaker.cxx:105
 AliMUONContourMaker.cxx:106
 AliMUONContourMaker.cxx:107
 AliMUONContourMaker.cxx:108
 AliMUONContourMaker.cxx:109
 AliMUONContourMaker.cxx:110
 AliMUONContourMaker.cxx:111
 AliMUONContourMaker.cxx:112
 AliMUONContourMaker.cxx:113
 AliMUONContourMaker.cxx:114
 AliMUONContourMaker.cxx:115
 AliMUONContourMaker.cxx:116
 AliMUONContourMaker.cxx:117
 AliMUONContourMaker.cxx:118
 AliMUONContourMaker.cxx:119
 AliMUONContourMaker.cxx:120
 AliMUONContourMaker.cxx:121
 AliMUONContourMaker.cxx:122
 AliMUONContourMaker.cxx:123
 AliMUONContourMaker.cxx:124
 AliMUONContourMaker.cxx:125
 AliMUONContourMaker.cxx:126
 AliMUONContourMaker.cxx:127
 AliMUONContourMaker.cxx:128
 AliMUONContourMaker.cxx:129
 AliMUONContourMaker.cxx:130
 AliMUONContourMaker.cxx:131
 AliMUONContourMaker.cxx:132
 AliMUONContourMaker.cxx:133
 AliMUONContourMaker.cxx:134
 AliMUONContourMaker.cxx:135
 AliMUONContourMaker.cxx:136
 AliMUONContourMaker.cxx:137
 AliMUONContourMaker.cxx:138
 AliMUONContourMaker.cxx:139
 AliMUONContourMaker.cxx:140
 AliMUONContourMaker.cxx:141
 AliMUONContourMaker.cxx:142
 AliMUONContourMaker.cxx:143
 AliMUONContourMaker.cxx:144
 AliMUONContourMaker.cxx:145
 AliMUONContourMaker.cxx:146
 AliMUONContourMaker.cxx:147
 AliMUONContourMaker.cxx:148
 AliMUONContourMaker.cxx:149
 AliMUONContourMaker.cxx:150
 AliMUONContourMaker.cxx:151
 AliMUONContourMaker.cxx:152
 AliMUONContourMaker.cxx:153
 AliMUONContourMaker.cxx:154
 AliMUONContourMaker.cxx:155
 AliMUONContourMaker.cxx:156
 AliMUONContourMaker.cxx:157
 AliMUONContourMaker.cxx:158
 AliMUONContourMaker.cxx:159
 AliMUONContourMaker.cxx:160
 AliMUONContourMaker.cxx:161
 AliMUONContourMaker.cxx:162
 AliMUONContourMaker.cxx:163
 AliMUONContourMaker.cxx:164
 AliMUONContourMaker.cxx:165
 AliMUONContourMaker.cxx:166
 AliMUONContourMaker.cxx:167
 AliMUONContourMaker.cxx:168
 AliMUONContourMaker.cxx:169
 AliMUONContourMaker.cxx:170
 AliMUONContourMaker.cxx:171
 AliMUONContourMaker.cxx:172
 AliMUONContourMaker.cxx:173
 AliMUONContourMaker.cxx:174
 AliMUONContourMaker.cxx:175
 AliMUONContourMaker.cxx:176
 AliMUONContourMaker.cxx:177
 AliMUONContourMaker.cxx:178
 AliMUONContourMaker.cxx:179
 AliMUONContourMaker.cxx:180
 AliMUONContourMaker.cxx:181
 AliMUONContourMaker.cxx:182
 AliMUONContourMaker.cxx:183
 AliMUONContourMaker.cxx:184
 AliMUONContourMaker.cxx:185
 AliMUONContourMaker.cxx:186
 AliMUONContourMaker.cxx:187
 AliMUONContourMaker.cxx:188
 AliMUONContourMaker.cxx:189
 AliMUONContourMaker.cxx:190
 AliMUONContourMaker.cxx:191
 AliMUONContourMaker.cxx:192
 AliMUONContourMaker.cxx:193
 AliMUONContourMaker.cxx:194
 AliMUONContourMaker.cxx:195
 AliMUONContourMaker.cxx:196
 AliMUONContourMaker.cxx:197
 AliMUONContourMaker.cxx:198
 AliMUONContourMaker.cxx:199
 AliMUONContourMaker.cxx:200
 AliMUONContourMaker.cxx:201
 AliMUONContourMaker.cxx:202
 AliMUONContourMaker.cxx:203
 AliMUONContourMaker.cxx:204
 AliMUONContourMaker.cxx:205
 AliMUONContourMaker.cxx:206
 AliMUONContourMaker.cxx:207
 AliMUONContourMaker.cxx:208
 AliMUONContourMaker.cxx:209
 AliMUONContourMaker.cxx:210
 AliMUONContourMaker.cxx:211
 AliMUONContourMaker.cxx:212
 AliMUONContourMaker.cxx:213
 AliMUONContourMaker.cxx:214
 AliMUONContourMaker.cxx:215
 AliMUONContourMaker.cxx:216
 AliMUONContourMaker.cxx:217
 AliMUONContourMaker.cxx:218
 AliMUONContourMaker.cxx:219
 AliMUONContourMaker.cxx:220
 AliMUONContourMaker.cxx:221
 AliMUONContourMaker.cxx:222
 AliMUONContourMaker.cxx:223
 AliMUONContourMaker.cxx:224
 AliMUONContourMaker.cxx:225
 AliMUONContourMaker.cxx:226
 AliMUONContourMaker.cxx:227
 AliMUONContourMaker.cxx:228
 AliMUONContourMaker.cxx:229
 AliMUONContourMaker.cxx:230
 AliMUONContourMaker.cxx:231
 AliMUONContourMaker.cxx:232
 AliMUONContourMaker.cxx:233
 AliMUONContourMaker.cxx:234
 AliMUONContourMaker.cxx:235
 AliMUONContourMaker.cxx:236
 AliMUONContourMaker.cxx:237
 AliMUONContourMaker.cxx:238
 AliMUONContourMaker.cxx:239
 AliMUONContourMaker.cxx:240
 AliMUONContourMaker.cxx:241
 AliMUONContourMaker.cxx:242
 AliMUONContourMaker.cxx:243
 AliMUONContourMaker.cxx:244
 AliMUONContourMaker.cxx:245
 AliMUONContourMaker.cxx:246
 AliMUONContourMaker.cxx:247
 AliMUONContourMaker.cxx:248
 AliMUONContourMaker.cxx:249
 AliMUONContourMaker.cxx:250
 AliMUONContourMaker.cxx:251
 AliMUONContourMaker.cxx:252
 AliMUONContourMaker.cxx:253
 AliMUONContourMaker.cxx:254
 AliMUONContourMaker.cxx:255
 AliMUONContourMaker.cxx:256
 AliMUONContourMaker.cxx:257
 AliMUONContourMaker.cxx:258
 AliMUONContourMaker.cxx:259
 AliMUONContourMaker.cxx:260
 AliMUONContourMaker.cxx:261
 AliMUONContourMaker.cxx:262
 AliMUONContourMaker.cxx:263
 AliMUONContourMaker.cxx:264
 AliMUONContourMaker.cxx:265
 AliMUONContourMaker.cxx:266
 AliMUONContourMaker.cxx:267
 AliMUONContourMaker.cxx:268
 AliMUONContourMaker.cxx:269
 AliMUONContourMaker.cxx:270
 AliMUONContourMaker.cxx:271
 AliMUONContourMaker.cxx:272
 AliMUONContourMaker.cxx:273
 AliMUONContourMaker.cxx:274
 AliMUONContourMaker.cxx:275
 AliMUONContourMaker.cxx:276
 AliMUONContourMaker.cxx:277
 AliMUONContourMaker.cxx:278
 AliMUONContourMaker.cxx:279
 AliMUONContourMaker.cxx:280
 AliMUONContourMaker.cxx:281
 AliMUONContourMaker.cxx:282
 AliMUONContourMaker.cxx:283
 AliMUONContourMaker.cxx:284
 AliMUONContourMaker.cxx:285
 AliMUONContourMaker.cxx:286
 AliMUONContourMaker.cxx:287
 AliMUONContourMaker.cxx:288
 AliMUONContourMaker.cxx:289
 AliMUONContourMaker.cxx:290
 AliMUONContourMaker.cxx:291
 AliMUONContourMaker.cxx:292
 AliMUONContourMaker.cxx:293
 AliMUONContourMaker.cxx:294
 AliMUONContourMaker.cxx:295
 AliMUONContourMaker.cxx:296
 AliMUONContourMaker.cxx:297
 AliMUONContourMaker.cxx:298
 AliMUONContourMaker.cxx:299
 AliMUONContourMaker.cxx:300
 AliMUONContourMaker.cxx:301
 AliMUONContourMaker.cxx:302
 AliMUONContourMaker.cxx:303
 AliMUONContourMaker.cxx:304
 AliMUONContourMaker.cxx:305
 AliMUONContourMaker.cxx:306
 AliMUONContourMaker.cxx:307
 AliMUONContourMaker.cxx:308
 AliMUONContourMaker.cxx:309
 AliMUONContourMaker.cxx:310
 AliMUONContourMaker.cxx:311
 AliMUONContourMaker.cxx:312
 AliMUONContourMaker.cxx:313
 AliMUONContourMaker.cxx:314
 AliMUONContourMaker.cxx:315
 AliMUONContourMaker.cxx:316
 AliMUONContourMaker.cxx:317
 AliMUONContourMaker.cxx:318
 AliMUONContourMaker.cxx:319
 AliMUONContourMaker.cxx:320
 AliMUONContourMaker.cxx:321
 AliMUONContourMaker.cxx:322
 AliMUONContourMaker.cxx:323
 AliMUONContourMaker.cxx:324
 AliMUONContourMaker.cxx:325
 AliMUONContourMaker.cxx:326
 AliMUONContourMaker.cxx:327
 AliMUONContourMaker.cxx:328
 AliMUONContourMaker.cxx:329
 AliMUONContourMaker.cxx:330
 AliMUONContourMaker.cxx:331
 AliMUONContourMaker.cxx:332
 AliMUONContourMaker.cxx:333
 AliMUONContourMaker.cxx:334
 AliMUONContourMaker.cxx:335
 AliMUONContourMaker.cxx:336
 AliMUONContourMaker.cxx:337
 AliMUONContourMaker.cxx:338
 AliMUONContourMaker.cxx:339
 AliMUONContourMaker.cxx:340
 AliMUONContourMaker.cxx:341
 AliMUONContourMaker.cxx:342
 AliMUONContourMaker.cxx:343
 AliMUONContourMaker.cxx:344
 AliMUONContourMaker.cxx:345
 AliMUONContourMaker.cxx:346
 AliMUONContourMaker.cxx:347
 AliMUONContourMaker.cxx:348
 AliMUONContourMaker.cxx:349
 AliMUONContourMaker.cxx:350
 AliMUONContourMaker.cxx:351
 AliMUONContourMaker.cxx:352
 AliMUONContourMaker.cxx:353
 AliMUONContourMaker.cxx:354
 AliMUONContourMaker.cxx:355
 AliMUONContourMaker.cxx:356
 AliMUONContourMaker.cxx:357
 AliMUONContourMaker.cxx:358
 AliMUONContourMaker.cxx:359
 AliMUONContourMaker.cxx:360
 AliMUONContourMaker.cxx:361
 AliMUONContourMaker.cxx:362
 AliMUONContourMaker.cxx:363
 AliMUONContourMaker.cxx:364
 AliMUONContourMaker.cxx:365
 AliMUONContourMaker.cxx:366
 AliMUONContourMaker.cxx:367
 AliMUONContourMaker.cxx:368
 AliMUONContourMaker.cxx:369
 AliMUONContourMaker.cxx:370
 AliMUONContourMaker.cxx:371
 AliMUONContourMaker.cxx:372
 AliMUONContourMaker.cxx:373
 AliMUONContourMaker.cxx:374
 AliMUONContourMaker.cxx:375
 AliMUONContourMaker.cxx:376
 AliMUONContourMaker.cxx:377
 AliMUONContourMaker.cxx:378
 AliMUONContourMaker.cxx:379
 AliMUONContourMaker.cxx:380
 AliMUONContourMaker.cxx:381
 AliMUONContourMaker.cxx:382
 AliMUONContourMaker.cxx:383
 AliMUONContourMaker.cxx:384
 AliMUONContourMaker.cxx:385
 AliMUONContourMaker.cxx:386
 AliMUONContourMaker.cxx:387
 AliMUONContourMaker.cxx:388
 AliMUONContourMaker.cxx:389
 AliMUONContourMaker.cxx:390
 AliMUONContourMaker.cxx:391
 AliMUONContourMaker.cxx:392
 AliMUONContourMaker.cxx:393
 AliMUONContourMaker.cxx:394
 AliMUONContourMaker.cxx:395
 AliMUONContourMaker.cxx:396
 AliMUONContourMaker.cxx:397
 AliMUONContourMaker.cxx:398
 AliMUONContourMaker.cxx:399
 AliMUONContourMaker.cxx:400
 AliMUONContourMaker.cxx:401
 AliMUONContourMaker.cxx:402
 AliMUONContourMaker.cxx:403
 AliMUONContourMaker.cxx:404
 AliMUONContourMaker.cxx:405
 AliMUONContourMaker.cxx:406
 AliMUONContourMaker.cxx:407
 AliMUONContourMaker.cxx:408
 AliMUONContourMaker.cxx:409
 AliMUONContourMaker.cxx:410
 AliMUONContourMaker.cxx:411
 AliMUONContourMaker.cxx:412
 AliMUONContourMaker.cxx:413
 AliMUONContourMaker.cxx:414
 AliMUONContourMaker.cxx:415
 AliMUONContourMaker.cxx:416
 AliMUONContourMaker.cxx:417
 AliMUONContourMaker.cxx:418
 AliMUONContourMaker.cxx:419
 AliMUONContourMaker.cxx:420
 AliMUONContourMaker.cxx:421
 AliMUONContourMaker.cxx:422
 AliMUONContourMaker.cxx:423
 AliMUONContourMaker.cxx:424
 AliMUONContourMaker.cxx:425
 AliMUONContourMaker.cxx:426
 AliMUONContourMaker.cxx:427
 AliMUONContourMaker.cxx:428
 AliMUONContourMaker.cxx:429
 AliMUONContourMaker.cxx:430
 AliMUONContourMaker.cxx:431
 AliMUONContourMaker.cxx:432
 AliMUONContourMaker.cxx:433
 AliMUONContourMaker.cxx:434
 AliMUONContourMaker.cxx:435
 AliMUONContourMaker.cxx:436
 AliMUONContourMaker.cxx:437
 AliMUONContourMaker.cxx:438
 AliMUONContourMaker.cxx:439
 AliMUONContourMaker.cxx:440
 AliMUONContourMaker.cxx:441
 AliMUONContourMaker.cxx:442
 AliMUONContourMaker.cxx:443
 AliMUONContourMaker.cxx:444
 AliMUONContourMaker.cxx:445
 AliMUONContourMaker.cxx:446
 AliMUONContourMaker.cxx:447
 AliMUONContourMaker.cxx:448
 AliMUONContourMaker.cxx:449
 AliMUONContourMaker.cxx:450
 AliMUONContourMaker.cxx:451
 AliMUONContourMaker.cxx:452
 AliMUONContourMaker.cxx:453
 AliMUONContourMaker.cxx:454
 AliMUONContourMaker.cxx:455