ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/CmsHi/HafHistogram/interface/HColumn.h
Revision: 1.1
Committed: Wed Sep 29 15:44:21 2010 UTC (14 years, 7 months ago) by yjlee
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Log Message:
HafHistogram tool

File Contents

# User Rev Content
1 yjlee 1.1 #ifndef HCOLUMN_H
2     #define HCOLUMN_H
3    
4     /** \class HColumn Ganzhur/HafHistogram/interface/HColumn.h
5     *
6     * Description:
7     * Analysis code of the CMS experiment;
8     * Original version is a part of HAF package developed for CMS: UserCode/HAF
9     * Nested class hierarchy to hold information about HTuple columns
10     *
11     * \author Marcel Kunze, Ruhr-University Bochum, Germany
12     *
13     * \version $Id: HColumn.h,v 1.4 2010/03/05 10:24:31 musella Exp $
14     *
15     */
16    
17     #include <assert.h>
18     #include "TNamed.h"
19     #include "TString.h"
20     #include "TVector.h"
21     #include "TTree.h"
22     #include "TBranch.h"
23    
24     #include "TLorentzVector.h"
25     #include "TVector3.h"
26     #include "TClonesArray.h"
27    
28     #ifndef HTRange_HH
29     #define HTRange_HH
30    
31     template<class T>
32     class HTRange {
33    
34     public:
35    
36     HTRange() :
37     fDefined(kFALSE), fLower(0), fUpper(0)
38     {
39     }
40    
41     HTRange(T lower, T upper) :
42     fDefined(kTRUE), fLower(lower), fUpper(upper)
43     {
44     }
45    
46     HTRange(const HTRange<T>& o) :
47     fDefined(o.fDefined), fLower(o.fLower), fUpper(o.fUpper)
48     {
49     }
50    
51     virtual ~HTRange() {}
52    
53     HTRange<T>& operator= (const HTRange<T> &o)
54     {
55     if (&o == this) return *this;
56     fDefined = o.fDefined ;
57     fLower = o.fLower ;
58     fUpper = o.fUpper ;
59     return *this ;
60     }
61    
62     Bool_t operator()() const { return fDefined ; }
63    
64     T lower() const { return fLower ; }
65     T upper() const { return fUpper ; }
66    
67     private:
68    
69     Bool_t fDefined ;
70     T fLower, fUpper ;
71    
72     };
73     #endif
74    
75    
76     #ifndef HTAbsValVector_HH
77     #define HTAbsValVector_HH
78    
79     template<class T>
80     class HTAbsValVector {
81    
82     public:
83    
84     // This must return the number of the stored elements
85     virtual size_t length() const = 0 ;
86    
87     // This provides access to the indifidual elements.
88     // Index runs from 0 to length()-1. Here () means that we do not requre
89     // index checking from it, though the real classe may do what they like.
90     virtual const T& operator()(size_t i) const = 0;
91     virtual T& operator()(size_t i) = 0;
92     virtual const T& operator[](size_t i) const = 0;
93     virtual T& operator[](size_t i) = 0;
94    
95     };
96     #endif
97    
98    
99     #ifndef HTAbsValArray_HH
100     #define HTAbsValArray_HH
101    
102     template<class T, size_t N>
103     class HTValArray : public HTAbsValVector<T> {
104    
105     public:
106    
107     HTValArray() {}
108     HTValArray( const T& v ) ;
109     HTValArray( const HTValArray<T,N> &v ) ;
110    
111     HTValArray<T,N>& operator=( const HTValArray<T,N> &v ) ;
112    
113     virtual size_t length() const ;
114     virtual const T& operator()(size_t i) const ;
115    
116     T& operator()(size_t i) { return _array[i] ; }
117     const T& operator[](size_t i) const {
118     assert ( i<N ) ;
119     return _array[i] ;
120     }
121     T& operator[](size_t i) {
122     assert ( i<N ) ;
123     return _array[i] ;
124     }
125    
126     private:
127    
128     T _array[N] ;
129    
130     };
131    
132     template<class T, size_t N>
133     HTValArray<T,N>::HTValArray( const T& v )
134     {
135     for ( int i = 0 ; i < N ; i ++ ) {
136     _array[i] = v ;
137     }
138     }
139    
140     template<class T, size_t N>
141     HTValArray<T,N>::HTValArray( const HTValArray<T,N> &v )
142     {
143     for ( int i = 0 ; i < N ; i ++ ) {
144     _array[i] = v._array[i] ;
145     }
146     }
147    
148     template<class T, size_t N>
149     HTValArray<T,N>&
150     HTValArray<T,N>::operator=( const HTValArray<T,N> &v )
151     {
152     for ( int i = 0 ; i < N ; i ++ ) {
153     _array[i] = v._array[i] ;
154     }
155     return *this ;
156     }
157    
158     template<class T, size_t N>
159     size_t
160     HTValArray<T,N>::length() const
161     {
162     return N;
163     }
164    
165     template<class T, size_t N>
166     const T&
167     HTValArray<T,N>::operator()(size_t i) const
168     {
169     return _array[i] ;
170     }
171    
172     #endif
173    
174    
175     #ifndef HTValVector_HH
176     #define HTValVector_HH
177    
178     using namespace std;
179     #include <deque>
180    
181     template<class T>
182     class HTValVector : public HTAbsValVector<T>
183     {
184    
185     public:
186    
187     typedef typename deque<T>::value_type value_type;
188     typedef typename deque<T>::pointer pointer;
189     typedef typename deque<T>::const_pointer conts_pointer;
190     typedef typename deque<T>::iterator iterator;
191     typedef typename deque<T>::const_iterator const_iterator;
192     typedef typename deque<T>::reference reference;
193     typedef typename deque<T>::const_reference const_reference;
194     typedef typename deque<T>::size_type size_type;
195     typedef typename deque<T>::difference_type difference_type;
196    
197     HTValVector() : _d() {}
198     HTValVector( size_type n ) : _d(n) {}
199     HTValVector( const HTValVector<T> &d ) : _d(d._d) {}
200     HTValVector( const deque<T> &d ) : _d(d) {}
201    
202     virtual ~HTValVector() {}
203    
204     virtual HTValVector<T>& operator=(const HTValVector<T>& d) { _d=d._d; return *this; }
205     virtual bool operator<(const HTValVector<T>& d) { return _d<d._d; }
206     virtual bool operator==(const HTValVector<T>& d) { return _d==d._d; }
207     virtual const T& operator()(size_type i) const { return _d[i]; }
208     virtual T& operator()(size_type i) { return _d[i]; }
209     virtual const T& operator[](size_type i) const { return _d[i]; }
210     virtual T& operator[](size_type i) { return _d[i]; }
211    
212     virtual size_type size() const { return _d.size(); }
213     virtual size_type length() const { return _d.size(); }
214     virtual size_type entries() const { return _d.size(); }
215     virtual void append(const T& t) { _d.push_back(t); }
216     virtual void prepend(const T& t) { _d.push_front(t); }
217     virtual bool remove(const T& t) {
218     for( iterator i=_d.begin(); i!=_d.end(); ++i ) {
219     if( *i == t ) {
220     _d.erase(i);
221     return true;
222     }
223     }
224     return false;
225     }
226     virtual bool contains(const T& t) const {
227     for( const_iterator i=_d.begin(); i!=_d.end(); ++i ) {
228     if( *i == t ) return true;
229     }
230     return false;
231     }
232     virtual bool isEmpty() const { return _d.empty(); }
233     virtual void reshape(size_type n) { _d.resize(n); }
234     virtual iterator begin() { return _d.begin(); }
235     virtual iterator end() { return _d.end(); }
236     virtual void clear() { _d.clear(); }
237    
238     protected:
239    
240     deque<T> _d;
241    
242     };
243    
244     #endif
245    
246    
247     #ifndef HTValOrderedVector_HH
248     #define HTValOrderedVector_HH
249    
250     using namespace std;
251     #include <vector>
252     #include <deque>
253    
254     template<class T>
255     class HTValOrderedVector : public HTValVector<T>
256     {
257    
258     public:
259    
260     typedef typename deque<T>::size_type size_type;
261    
262     HTValOrderedVector() : HTValVector<T>() {}
263     HTValOrderedVector( size_type n ) : HTValVector<T>() {}
264     HTValOrderedVector( const HTValOrderedVector<T> &v )
265     : HTValVector<T>(v) {}
266     HTValOrderedVector( const vector<T> &v ) : HTValVector<T>(v) {}
267    
268     virtual ~HTValOrderedVector() {}
269    
270     void resize(size_type n) {}
271    
272     };
273    
274     #endif
275    
276    
277     // Parent class (abstract):
278     class HColumn : public TNamed {
279    
280     public:
281    
282     HColumn(const char* l) :
283     TNamed(l,l), fLabel(l), fUseDefValue(0), fPointer(0), fBranch(0) {}
284     virtual ~HColumn() {}
285     const TString &GetLabel() const { return fLabel; }
286     TBranch* GetBrPointer() { return fBranch; }
287     void* GetPointer() { return fPointer; }
288     void SetPointer(void* p) { fPointer = p; }
289     void SetUseDefValue(Int_t b) { fUseDefValue = b; }
290     const Int_t & GetUseDefValue() const { return fUseDefValue; }
291     virtual void SetDefValue() = 0;
292     virtual void SetValue(const void*, HColumn* cp=0) = 0;
293    
294     protected:
295    
296     TString fLabel;
297     Int_t fUseDefValue;
298     void* fPointer; //!
299     TBranch* fBranch;
300    
301     ClassDef(HColumn,1) // HColumn
302    
303     };
304    
305    
306     // Classes for Bool_t:
307     class BoolColumn : public HColumn {
308     public:
309     BoolColumn(const char*, const Bool_t &, const Bool_t &, TTree*);
310     virtual ~BoolColumn() { delete (Bool_t*)fPointer; }
311     virtual void SetDefValue() { *(Char_t*)fPointer = fDefValue; }
312     virtual void SetValue(const void* p, HColumn* cp=0) {
313     *(Char_t*)fPointer = *(const Bool_t*)p;
314     }
315     private:
316     Bool_t fDefValue;
317     };
318    
319     class BoolArrColumn : public HColumn {
320     public:
321     BoolArrColumn(const char*, const HTAbsValVector<Bool_t> &, const Bool_t &,
322     TTree*);
323     virtual ~BoolArrColumn() { delete[] (Bool_t*)fPointer; }
324     virtual void SetDefValue() {
325     for(Int_t i = 0; i < fMax; ++i) ((Char_t*)fPointer)[i] = fDefValue;
326     }
327     virtual void SetValue(const void*, HColumn* cp=0);
328     private:
329     Bool_t fDefValue;
330     Int_t fMax;
331     };
332    
333     class BoolDynArrColumn : public HColumn {
334     public:
335     BoolDynArrColumn(const char*, const HTAbsValVector<Bool_t> &,
336     const Bool_t &, HColumn*, TTree*);
337     virtual ~BoolDynArrColumn() { delete[] (Bool_t*)fPointer; }
338     virtual void SetDefValue();
339     virtual void SetValue(const void*, HColumn* cp=0);
340     private:
341     Bool_t fDefValue;
342     HColumn* fIndexPtr;
343     };
344    
345     // Classes for Int_t:
346     class IntColumn : public HColumn {
347     public:
348     IntColumn(const char*, const Int_t &, const Int_t &, TTree*);
349     virtual ~IntColumn() { delete (Int_t*)fPointer; }
350     virtual void SetDefValue() { *(Int_t*)fPointer = fDefValue; }
351     virtual void SetValue(const void* p, HColumn* cp=0) {
352     *(Int_t*)fPointer = *(const Int_t*)p;
353     }
354     private:
355     Int_t fDefValue;
356     };
357    
358     class IntArrColumn : public HColumn {
359     public:
360     IntArrColumn(const char*, const HTAbsValVector<Int_t> &, const Int_t &,
361     TTree*);
362     virtual ~IntArrColumn() { delete[] (Int_t*)fPointer; }
363     virtual void SetDefValue() {
364     for(Int_t i = 0; i < fMax; ++i) ((Int_t*)fPointer)[i] = fDefValue;
365     }
366     virtual void SetValue(const void*, HColumn* cp=0);
367     private:
368     Int_t fDefValue;
369     Int_t fMax;
370     };
371    
372     class IntDynArrColumn : public HColumn {
373     public:
374     IntDynArrColumn(const char*, const HTAbsValVector<Int_t> &,
375     const Int_t &, HColumn*, TTree*);
376     virtual ~IntDynArrColumn() { delete[] (Int_t*)fPointer; }
377     virtual void SetDefValue();
378     virtual void SetValue(const void*, HColumn* cp=0);
379     private:
380     Int_t fDefValue;
381     HColumn* fIndexPtr;
382     };
383    
384     // Classes for Float_t:
385     class FloatColumn : public HColumn {
386     public:
387     FloatColumn(const char*, const Float_t &, const Float_t &, TTree*);
388     virtual ~FloatColumn() { delete (Float_t*)fPointer; }
389     virtual void SetDefValue() { *(Float_t*)fPointer = fDefValue; }
390     virtual void SetValue(const void* p, HColumn* cp=0) {
391     *(Float_t*)fPointer = *(const Float_t*)p;
392     }
393     private:
394     Float_t fDefValue;
395     };
396    
397     class FloatArrColumn : public HColumn {
398     public:
399     FloatArrColumn(const char*, const HTAbsValVector<Float_t> &, const Float_t &,
400     TTree*);
401     FloatArrColumn(const char*, const TVector &, const Float_t &,
402     TTree*);
403     virtual ~FloatArrColumn() { delete[] (Float_t*)fPointer; }
404     virtual void SetDefValue() {
405     for(Int_t i = 0; i < fMax; ++i) ((Float_t*)fPointer)[i] = fDefValue;
406     }
407     virtual void SetValue(const void*, HColumn* cp=0);
408     private:
409     Float_t fDefValue;
410     Int_t fMax;
411     };
412    
413     class FloatDynArrColumn : public HColumn {
414     public:
415     FloatDynArrColumn(const char*, const HTAbsValVector<Float_t> &,
416     const Float_t &, HColumn*, TTree*);
417     FloatDynArrColumn(const char*, const TVector &,
418     const Float_t &, HColumn*, TTree*);
419     virtual ~FloatDynArrColumn() { delete[] (Float_t*)fPointer; }
420     virtual void SetDefValue();
421     virtual void SetValue(const void*, HColumn* cp=0);
422     private:
423     Float_t fDefValue;
424     HColumn* fIndexPtr;
425     };
426    
427     // Classes for Double_t:
428     class DoubleColumn : public HColumn {
429     public:
430     DoubleColumn(const char*, const Double_t &, const Double_t &, TTree*);
431     virtual ~DoubleColumn() { delete (Double_t*)fPointer; }
432     virtual void SetDefValue() { *(Double_t*)fPointer = fDefValue; }
433     virtual void SetValue(const void* p, HColumn* cp=0) {
434     *(Double_t*)fPointer = *(const Double_t*)p;
435     }
436     private:
437     Double_t fDefValue;
438     };
439    
440     class DoubleArrColumn : public HColumn {
441     public:
442     DoubleArrColumn(const char*, const HTAbsValVector<Double_t> &,
443     const Double_t &, TTree*);
444     virtual ~DoubleArrColumn() { delete[] (Double_t*)fPointer; }
445     virtual void SetDefValue() {
446     for(Int_t i = 0; i < fMax; ++i) ((Double_t*)fPointer)[i] = fDefValue;
447     }
448     virtual void SetValue(const void*, HColumn* cp=0);
449     private:
450     Double_t fDefValue;
451     Int_t fMax;
452     };
453    
454     class DoubleDynArrColumn : public HColumn {
455     public:
456     DoubleDynArrColumn(const char*, const HTAbsValVector<Double_t> &,
457     const Double_t &, HColumn*, TTree*);
458     virtual ~DoubleDynArrColumn() { delete[] (Double_t*)fPointer; }
459     virtual void SetDefValue();
460     virtual void SetValue(const void*, HColumn* cp=0);
461     private:
462     Double_t fDefValue;
463     HColumn* fIndexPtr;
464     };
465    
466     // String column:
467     class StringColumn : public HColumn {
468     public:
469     StringColumn(const TString &, const TString &,
470     const TString &, TTree*);
471     virtual ~StringColumn() { delete[] (TString*)fPointer; }
472     virtual void SetDefValue();
473     virtual void SetValue(const void*, HColumn* cp=0);
474     private:
475     TString fDefValue;
476     };
477    
478     // Classes for generic objects
479     template <class T>
480     class ClassColumn : public HColumn {
481     public:
482     ClassColumn(const char * name, const T& v, const T& d, TTree * t) :
483     HColumn(name), fDefValue(d)
484     {
485     // Create a new branch:
486     T * p = new T(v);
487     fPointer = p;
488     fBranch = t->Branch(name,p);
489     }
490     virtual void SetDefValue() { *(T*)fPointer = fDefValue; }
491     virtual void SetValue(const void* p, HColumn* cp=0) { *(T*)fPointer = *(const T*)p; }
492     private:
493     T fDefValue;
494     };
495    
496     typedef ClassColumn<TLorentzVector> TLorentzColum;
497     typedef ClassColumn<TVector3> TVector3Colum;
498    
499     template <class T>
500     class ClonesColumn : public HColumn {
501     public:
502     ClonesColumn(const char * name, const HTAbsValVector<T>& v, const T& d, HColumn* inp, TTree* t) :
503     HColumn(name), fDefValue(d), fIndexPtr(inp)
504     {
505     // Create a new branch:
506     fClones = new TClonesArray(fDefValue.ClassName(),v.length());
507     fPointer = fClones;
508     fBranch = t->Branch(name,&fClones,128000,0);
509     SetValue(&v);
510     }
511     virtual void SetDefValue()
512     {
513     fClones->Delete();
514     int np = *((Int_t*)(fIndexPtr->GetPointer()));
515     for( Int_t i = 0; i < np; ++i) new( (*fClones)[i] ) T(fDefValue);
516     }
517     virtual void SetValue(const void* p, HColumn* cp=0)
518     {
519     const HTAbsValVector<T>& vp = *(const HTAbsValVector<T>*) p;
520     int np = vp.length();
521     if( cp != 0 ) {
522     np = *((Int_t*)(cp->GetPointer()));
523     }
524     fClones->Delete();
525     if( np > (int)vp.length() ) {
526     SetDefValue();
527     } else {
528     for( Int_t i = 0; i < np; ++i) new( (*fClones)[i] ) T(vp(i));
529     }
530     }
531    
532     private:
533     TClonesArray * fClones;
534     T fDefValue;
535     HColumn * fIndexPtr;
536     };
537    
538     typedef ClonesColumn<TLorentzVector> TLorentzClonesColumn;
539     typedef ClonesColumn<TVector3> TVector3ClonesColum;
540    
541    
542     #endif