ROOT logo
#ifndef ROOT_TreeSearch_PatternTree
#define ROOT_TreeSearch_PatternTree

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// TreeSearch::PatternTree                                                   //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#include "Pattern.h"
#include "TreeWalk.h"
#include <vector>
#include <map>
#include <iostream>
#include <cassert>

using std::vector;

namespace TreeSearch {

  class TreeParam_t {
  public:
    TreeParam_t( UInt_t maxdepth, Double_t width, Double_t maxslope,
		 const vector<Double_t>& zpos ) 
      : fMaxdepth(maxdepth), fNormalized(false), fWidth(width),
	fMaxslope(maxslope), fZpos(zpos) {}
    Int_t Normalize();
    UInt_t   maxdepth() const { return fMaxdepth; }
    Double_t width()    const { return fWidth; }
    Double_t maxslope() const { return fMaxslope; }
    const vector<Double_t>& zpos() const { return fZpos; }
  private: 
    UInt_t    fMaxdepth;    // Depth of tree
    Bool_t    fNormalized;  // maxslope and zpos are normalized
    Double_t  fWidth;       // Physical detector width (needed in Hitpattern)
    Double_t  fMaxslope;    // Max slope (dx/dz) of tracks
    vector<Double_t> fZpos; // z-positions of pattern planes
  };

  class PatternTree {
  public:
    PatternTree( const TreeParam_t& param,
		 UInt_t nPatterns = 0, UInt_t nLinks = 0 );
    virtual ~PatternTree();
    // TODO: copy c'tor, assignment (see below)
    // TODO: implement Read()

    static PatternTree* Read( const char* filename, const TreeParam_t& param );

    void   Print( Option_t* opt="", std::ostream& os = std::cout );
    Int_t  Write( const char* filename );

    Bool_t IsOK()       const { return fParamOK; }
    UInt_t GetNlevels() const { return fParameters.maxdepth()+1; }
    UInt_t GetNplanes() const { return fParameters.zpos().size(); }
    const TreeParam_t& GetParameters() const { return fParameters; }
    Link*  GetRoot() { return fLinks.empty() ? 0 : &fLinks.front(); }
    Double_t GetWidth() const { return fParameters.width(); }

    // Copy an arbitrary tree into the PatternTree array structures
    class CopyPattern : public NodeVisitor {
    public:
      CopyPattern( PatternTree* tree ) : fTree(tree) { assert(fTree); }
      virtual ETreeOp operator() ( const NodeDescriptor& nd );

    private:
      PatternTree* fTree;    // Tree object to fill
      std::map<Pattern*,Int_t> fMap;   // Index map for serializing 
      void AddChild( Pattern* parent, Pattern* child, Int_t type );
    };
    friend class CopyPattern;

  private:
    
    typedef vector<Pattern>::size_type vpsz_t;
    typedef vector<Link>::size_type vlsz_t;
    typedef vector<UShort_t>::size_type vsiz_t;

    TreeParam_t      fParameters; // Tree parameters (levels, width, depth)
    Bool_t           fParamOK;    // Flag: Parameters are tested valid

    vector<Pattern>  fPatterns;   // Array of all patterns
    vector<Link>     fLinks;      // Array of all links
    vector<UShort_t> fBits;       // Array of all pattern bits
 
    // Variables for unserializing the tree

    vpsz_t           fNpat;       // Current pattern count 
    vlsz_t           fNlnk;       // Current link count
    vsiz_t           fNbit;       // Current bit count

    // Disallow copying and assignment for now. The vectors can NOT be copied 
    // directly since they contain pointers to the other vectors' elements!
    PatternTree( const PatternTree& orig );
    const PatternTree& operator=( const PatternTree& rhs );

    ClassDef(PatternTree,0)   // Precomputed template database
  };

///////////////////////////////////////////////////////////////////////////////

}  // end namespace TreeSearch

#endif
 PatternTree.h:1
 PatternTree.h:2
 PatternTree.h:3
 PatternTree.h:4
 PatternTree.h:5
 PatternTree.h:6
 PatternTree.h:7
 PatternTree.h:8
 PatternTree.h:9
 PatternTree.h:10
 PatternTree.h:11
 PatternTree.h:12
 PatternTree.h:13
 PatternTree.h:14
 PatternTree.h:15
 PatternTree.h:16
 PatternTree.h:17
 PatternTree.h:18
 PatternTree.h:19
 PatternTree.h:20
 PatternTree.h:21
 PatternTree.h:22
 PatternTree.h:23
 PatternTree.h:24
 PatternTree.h:25
 PatternTree.h:26
 PatternTree.h:27
 PatternTree.h:28
 PatternTree.h:29
 PatternTree.h:30
 PatternTree.h:31
 PatternTree.h:32
 PatternTree.h:33
 PatternTree.h:34
 PatternTree.h:35
 PatternTree.h:36
 PatternTree.h:37
 PatternTree.h:38
 PatternTree.h:39
 PatternTree.h:40
 PatternTree.h:41
 PatternTree.h:42
 PatternTree.h:43
 PatternTree.h:44
 PatternTree.h:45
 PatternTree.h:46
 PatternTree.h:47
 PatternTree.h:48
 PatternTree.h:49
 PatternTree.h:50
 PatternTree.h:51
 PatternTree.h:52
 PatternTree.h:53
 PatternTree.h:54
 PatternTree.h:55
 PatternTree.h:56
 PatternTree.h:57
 PatternTree.h:58
 PatternTree.h:59
 PatternTree.h:60
 PatternTree.h:61
 PatternTree.h:62
 PatternTree.h:63
 PatternTree.h:64
 PatternTree.h:65
 PatternTree.h:66
 PatternTree.h:67
 PatternTree.h:68
 PatternTree.h:69
 PatternTree.h:70
 PatternTree.h:71
 PatternTree.h:72
 PatternTree.h:73
 PatternTree.h:74
 PatternTree.h:75
 PatternTree.h:76
 PatternTree.h:77
 PatternTree.h:78
 PatternTree.h:79
 PatternTree.h:80
 PatternTree.h:81
 PatternTree.h:82
 PatternTree.h:83
 PatternTree.h:84
 PatternTree.h:85
 PatternTree.h:86
 PatternTree.h:87
 PatternTree.h:88
 PatternTree.h:89
 PatternTree.h:90
 PatternTree.h:91
 PatternTree.h:92
 PatternTree.h:93
 PatternTree.h:94
 PatternTree.h:95
 PatternTree.h:96
 PatternTree.h:97
 PatternTree.h:98
 PatternTree.h:99
 PatternTree.h:100
 PatternTree.h:101
 PatternTree.h:102
 PatternTree.h:103
 PatternTree.h:104