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$

///
/// \class AliMUONSegmentTree
///
/// Implementation of a segment tree, which is used to make contour
/// merging (see AliMUONContourMaker)
///
/// \author Laurent Aphecetche, Subatech
///

#include "AliMUONSegmentTree.h"

#include "AliLog.h"
#include "AliMUONNode.h"
#include "Riostream.h"
#include "TArrayD.h"
#include "TMath.h"

using std::cout;
using std::endl;
/// \cond CLASSIMP
ClassImp(AliMUONSegmentTree)
/// \endcond

//_____________________________________________________________________________
AliMUONSegmentTree::AliMUONSegmentTree(const TArrayD& values)
: fRoot(0x0), fStack()
{
  /// Values should be sorted and have at least 2 elements.
  
  fStack.SetOwner(kTRUE);
  
  if ( values.GetSize() < 2 ) 
  {
    AliFatal("cannot build a segmenttree with less than 2 values !");
  }
  
  fRoot = Build(values,0,values.GetSize()-1);
}

//_____________________________________________________________________________
AliMUONSegmentTree::~AliMUONSegmentTree()
{
  /// dtor
  delete fRoot;
}

//_____________________________________________________________________________
AliMUONNode* 
AliMUONSegmentTree::Build(const TArrayD& values, Int_t i, Int_t j)
{
  /// Build the segment tree from a list of values
  
  double midpoint(TMath::Sqrt(-1.0));
  Int_t mid((i+j)/2);
  
  if ( mid != i && mid != j ) midpoint = values[mid];
  
  AliMUONNode* node = new AliMUONNode(values[i],values[j],midpoint);
  
  if ( j - i == 1 ) return node;
  
  node->LeftNode(Build(values,i,(i+j)/2));
  node->RightNode(Build(values,(i+j)/2,j));
  
  return node;
}

//_____________________________________________________________________________
void 
AliMUONSegmentTree::Contribution(double b, double e)
{
  /// Compute the contribution of edge (b,e)
  fRoot->Contribution(b,e,fStack);
}

//_____________________________________________________________________________
void 
AliMUONSegmentTree::InsertInterval(double b, double e)
{
  /// Insert interval (b,e)
  fRoot->InsertInterval(b,e,fStack);
}

//_____________________________________________________________________________
void 
AliMUONSegmentTree::DeleteInterval(double b, double e)
{
  /// Delete interval (b,e)
  fRoot->DeleteInterval(b,e,fStack);
}

//_____________________________________________________________________________
void 
AliMUONSegmentTree::Print(Option_t*) const
{
  /// Printout
  if (fRoot) 
    fRoot->Print(); 
  else 
    cout << "Empty binary tree" << endl; 
}
 AliMUONSegmentTree.cxx:1
 AliMUONSegmentTree.cxx:2
 AliMUONSegmentTree.cxx:3
 AliMUONSegmentTree.cxx:4
 AliMUONSegmentTree.cxx:5
 AliMUONSegmentTree.cxx:6
 AliMUONSegmentTree.cxx:7
 AliMUONSegmentTree.cxx:8
 AliMUONSegmentTree.cxx:9
 AliMUONSegmentTree.cxx:10
 AliMUONSegmentTree.cxx:11
 AliMUONSegmentTree.cxx:12
 AliMUONSegmentTree.cxx:13
 AliMUONSegmentTree.cxx:14
 AliMUONSegmentTree.cxx:15
 AliMUONSegmentTree.cxx:16
 AliMUONSegmentTree.cxx:17
 AliMUONSegmentTree.cxx:18
 AliMUONSegmentTree.cxx:19
 AliMUONSegmentTree.cxx:20
 AliMUONSegmentTree.cxx:21
 AliMUONSegmentTree.cxx:22
 AliMUONSegmentTree.cxx:23
 AliMUONSegmentTree.cxx:24
 AliMUONSegmentTree.cxx:25
 AliMUONSegmentTree.cxx:26
 AliMUONSegmentTree.cxx:27
 AliMUONSegmentTree.cxx:28
 AliMUONSegmentTree.cxx:29
 AliMUONSegmentTree.cxx:30
 AliMUONSegmentTree.cxx:31
 AliMUONSegmentTree.cxx:32
 AliMUONSegmentTree.cxx:33
 AliMUONSegmentTree.cxx:34
 AliMUONSegmentTree.cxx:35
 AliMUONSegmentTree.cxx:36
 AliMUONSegmentTree.cxx:37
 AliMUONSegmentTree.cxx:38
 AliMUONSegmentTree.cxx:39
 AliMUONSegmentTree.cxx:40
 AliMUONSegmentTree.cxx:41
 AliMUONSegmentTree.cxx:42
 AliMUONSegmentTree.cxx:43
 AliMUONSegmentTree.cxx:44
 AliMUONSegmentTree.cxx:45
 AliMUONSegmentTree.cxx:46
 AliMUONSegmentTree.cxx:47
 AliMUONSegmentTree.cxx:48
 AliMUONSegmentTree.cxx:49
 AliMUONSegmentTree.cxx:50
 AliMUONSegmentTree.cxx:51
 AliMUONSegmentTree.cxx:52
 AliMUONSegmentTree.cxx:53
 AliMUONSegmentTree.cxx:54
 AliMUONSegmentTree.cxx:55
 AliMUONSegmentTree.cxx:56
 AliMUONSegmentTree.cxx:57
 AliMUONSegmentTree.cxx:58
 AliMUONSegmentTree.cxx:59
 AliMUONSegmentTree.cxx:60
 AliMUONSegmentTree.cxx:61
 AliMUONSegmentTree.cxx:62
 AliMUONSegmentTree.cxx:63
 AliMUONSegmentTree.cxx:64
 AliMUONSegmentTree.cxx:65
 AliMUONSegmentTree.cxx:66
 AliMUONSegmentTree.cxx:67
 AliMUONSegmentTree.cxx:68
 AliMUONSegmentTree.cxx:69
 AliMUONSegmentTree.cxx:70
 AliMUONSegmentTree.cxx:71
 AliMUONSegmentTree.cxx:72
 AliMUONSegmentTree.cxx:73
 AliMUONSegmentTree.cxx:74
 AliMUONSegmentTree.cxx:75
 AliMUONSegmentTree.cxx:76
 AliMUONSegmentTree.cxx:77
 AliMUONSegmentTree.cxx:78
 AliMUONSegmentTree.cxx:79
 AliMUONSegmentTree.cxx:80
 AliMUONSegmentTree.cxx:81
 AliMUONSegmentTree.cxx:82
 AliMUONSegmentTree.cxx:83
 AliMUONSegmentTree.cxx:84
 AliMUONSegmentTree.cxx:85
 AliMUONSegmentTree.cxx:86
 AliMUONSegmentTree.cxx:87
 AliMUONSegmentTree.cxx:88
 AliMUONSegmentTree.cxx:89
 AliMUONSegmentTree.cxx:90
 AliMUONSegmentTree.cxx:91
 AliMUONSegmentTree.cxx:92
 AliMUONSegmentTree.cxx:93
 AliMUONSegmentTree.cxx:94
 AliMUONSegmentTree.cxx:95
 AliMUONSegmentTree.cxx:96
 AliMUONSegmentTree.cxx:97
 AliMUONSegmentTree.cxx:98
 AliMUONSegmentTree.cxx:99
 AliMUONSegmentTree.cxx:100
 AliMUONSegmentTree.cxx:101
 AliMUONSegmentTree.cxx:102
 AliMUONSegmentTree.cxx:103
 AliMUONSegmentTree.cxx:104
 AliMUONSegmentTree.cxx:105
 AliMUONSegmentTree.cxx:106
 AliMUONSegmentTree.cxx:107
 AliMUONSegmentTree.cxx:108
 AliMUONSegmentTree.cxx:109
 AliMUONSegmentTree.cxx:110
 AliMUONSegmentTree.cxx:111
 AliMUONSegmentTree.cxx:112
 AliMUONSegmentTree.cxx:113
 AliMUONSegmentTree.cxx:114
 AliMUONSegmentTree.cxx:115
 AliMUONSegmentTree.cxx:116
 AliMUONSegmentTree.cxx:117
 AliMUONSegmentTree.cxx:118