Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
THnSparse_Internal.h
Go to the documentation of this file.
1 // @(#)root/hist:$Id$
2 // Author: Axel Naumann (2007-09-11)
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2012, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #ifndef ROOT_THnSparse_Internal
13 #define ROOT_THnSparse_Internal
14 
15 /*************************************************************************
16  * Non-API classes for THnSparse. *
17  * I.e. interesting to look at if you want to know how it works, but *
18  * don't use directly. *
19  * Implementation in THnSparse.cxx. *
20  *************************************************************************/
21 
22 #include "TArrayD.h"
23 
24 #include "TObject.h"
25 
26 class TBrowser;
27 class TH1;
28 class THnSparse;
29 
30 class THnSparseArrayChunk: public TObject {
31  private:
32 
33  THnSparseArrayChunk(const THnSparseArrayChunk&); // Not implemented
34  THnSparseArrayChunk& operator=(const THnSparseArrayChunk&); // Not implemented
35 
36  public:
37  THnSparseArrayChunk():
38  fCoordinateAllocationSize(-1), fSingleCoordinateSize(0), fCoordinatesSize(0), fCoordinates(0),
39  fContent(0), fSumw2(0) {}
40 
41  THnSparseArrayChunk(Int_t coordsize, bool errors, TArray* cont);
42  virtual ~THnSparseArrayChunk();
43 
44  Int_t fCoordinateAllocationSize; //! size of the allocated coordinate buffer; -1 means none or fCoordinatesSize
45  Int_t fSingleCoordinateSize; // size of a single bin coordinate
46  Int_t fCoordinatesSize; // size of the bin coordinate buffer
47  Char_t *fCoordinates; //[fCoordinatesSize] compact bin coordinate buffer
48  TArray *fContent; // bin content
49  TArrayD *fSumw2; // bin errors
50 
51  void AddBin(Int_t idx, const Char_t* idxbuf);
52  void AddBinContent(Int_t idx, Double_t v = 1.) {
53  fContent->SetAt(v + fContent->GetAt(idx), idx);
54  if (fSumw2)
55  fSumw2->SetAt(v * v+ fSumw2->GetAt(idx), idx);
56  }
57  void Sumw2();
58  Int_t GetEntries() const { return fCoordinatesSize / fSingleCoordinateSize; }
59  Bool_t Matches(Int_t idx, const Char_t* idxbuf) const {
60  // Check whether bin at idx batches idxbuf.
61  // If we don't store indexes we trust the caller that it does match,
62  // see comment in THnSparseCompactBinCoord::GetHash().
63  return fSingleCoordinateSize <= 8 ||
64  !memcmp(fCoordinates + idx * fSingleCoordinateSize, idxbuf, fSingleCoordinateSize); }
65 
66  ClassDef(THnSparseArrayChunk, 1); // chunks of linearized bins
67 };
68 #endif // ROOT_THnSparse_Internal
69