[2] | 1 |
|
---|
| 2 | /** \class ExRootFilter
|
---|
| 3 | *
|
---|
| 4 | * Class simplifying classification and subarrays handling
|
---|
| 5 | *
|
---|
| 6 | * $Date: 2008-06-04 13:57:55 $
|
---|
| 7 | * $Revision: 1.1 $
|
---|
| 8 | *
|
---|
| 9 | *
|
---|
| 10 | * \author P. Demin - UCL, Louvain-la-Neuve
|
---|
| 11 | *
|
---|
| 12 | */
|
---|
| 13 |
|
---|
| 14 | #include "ExRootAnalysis/ExRootFilter.h"
|
---|
| 15 | #include "ExRootAnalysis/ExRootClassifier.h"
|
---|
| 16 |
|
---|
| 17 | #include "TSeqCollection.h"
|
---|
| 18 | #include "TObjArray.h"
|
---|
| 19 |
|
---|
| 20 | using namespace std;
|
---|
| 21 |
|
---|
[22] | 22 | typedef map<Int_t, TObjArray*> TCategoryMap;
|
---|
| 23 | typedef map<ExRootClassifier*, pair<Bool_t, TCategoryMap> > TClassifierMap;
|
---|
| 24 |
|
---|
[2] | 25 | ExRootFilter::ExRootFilter(const TSeqCollection *collection) :
|
---|
| 26 | fCollection(collection)
|
---|
| 27 | {
|
---|
| 28 | fIter = fCollection->MakeIterator();
|
---|
| 29 | }
|
---|
| 30 |
|
---|
| 31 | //------------------------------------------------------------------------------
|
---|
| 32 |
|
---|
| 33 | ExRootFilter::~ExRootFilter()
|
---|
| 34 | {
|
---|
| 35 | TClassifierMap::iterator it_map;
|
---|
| 36 | TCategoryMap::iterator it_submap;
|
---|
| 37 | for(it_map = fMap.begin(); it_map != fMap.end(); ++it_map)
|
---|
| 38 | {
|
---|
| 39 | for(it_submap = it_map->second.second.begin();
|
---|
| 40 | it_submap != it_map->second.second.end(); ++it_submap)
|
---|
| 41 | {
|
---|
| 42 | delete (it_submap->second);
|
---|
| 43 | }
|
---|
| 44 | }
|
---|
| 45 |
|
---|
| 46 | delete fIter;
|
---|
| 47 | }
|
---|
| 48 |
|
---|
| 49 | //------------------------------------------------------------------------------
|
---|
| 50 |
|
---|
| 51 | void ExRootFilter::Reset(ExRootClassifier *classifier)
|
---|
| 52 | {
|
---|
| 53 | TClassifierMap::iterator it_map;
|
---|
| 54 | TCategoryMap::iterator it_submap;
|
---|
| 55 | if(classifier)
|
---|
| 56 | {
|
---|
| 57 | it_map = fMap.find(classifier);
|
---|
| 58 | if(it_map != fMap.end())
|
---|
| 59 | {
|
---|
| 60 | it_map->second.first = kTRUE;
|
---|
| 61 | for(it_submap = it_map->second.second.begin();
|
---|
| 62 | it_submap != it_map->second.second.end(); ++it_submap)
|
---|
| 63 | {
|
---|
| 64 | it_submap->second->Clear();
|
---|
| 65 | }
|
---|
| 66 | }
|
---|
| 67 | }
|
---|
| 68 | else
|
---|
| 69 | {
|
---|
| 70 | for(it_map = fMap.begin(); it_map != fMap.end(); ++it_map)
|
---|
| 71 | {
|
---|
| 72 | it_map->second.first = kTRUE;
|
---|
| 73 | for(it_submap = it_map->second.second.begin();
|
---|
| 74 | it_submap != it_map->second.second.end(); ++it_submap)
|
---|
| 75 | {
|
---|
| 76 | it_submap->second->Clear();
|
---|
| 77 | }
|
---|
| 78 | }
|
---|
| 79 | }
|
---|
| 80 | }
|
---|
| 81 |
|
---|
| 82 | //------------------------------------------------------------------------------
|
---|
| 83 |
|
---|
| 84 | TObjArray *ExRootFilter::GetSubArray(ExRootClassifier *classifier, Int_t category)
|
---|
| 85 | {
|
---|
| 86 | Int_t result;
|
---|
| 87 | TObject *element;
|
---|
| 88 | TObjArray *array;
|
---|
| 89 | TCategoryMap::iterator it_submap;
|
---|
| 90 | pair<TCategoryMap::iterator, bool> pair_submap;
|
---|
| 91 | pair<TClassifierMap::iterator, bool> pair_map;
|
---|
| 92 |
|
---|
| 93 | TClassifierMap::iterator it_map = fMap.find(classifier);
|
---|
| 94 | if(it_map == fMap.end())
|
---|
| 95 | {
|
---|
| 96 | pair_map = fMap.insert(make_pair(classifier, make_pair(kTRUE, TCategoryMap())));
|
---|
| 97 | if(!pair_map.second) throw FilterExeption();
|
---|
| 98 |
|
---|
| 99 | it_map = pair_map.first;
|
---|
| 100 | }
|
---|
| 101 |
|
---|
| 102 | if(it_map->second.first)
|
---|
| 103 | {
|
---|
| 104 | it_map->second.first = kFALSE;
|
---|
| 105 | fIter->Reset();
|
---|
| 106 | while((element = fIter->Next()) != 0)
|
---|
| 107 | {
|
---|
| 108 | result = classifier->GetCategory(element);
|
---|
| 109 | if(result < 0) continue;
|
---|
| 110 | it_submap = it_map->second.second.find(result);
|
---|
| 111 | if(it_submap == it_map->second.second.end())
|
---|
| 112 | {
|
---|
| 113 | array = new TObjArray(fCollection->GetSize());
|
---|
| 114 | pair_submap = it_map->second.second.insert(make_pair(result, array));
|
---|
| 115 | if(!pair_submap.second) throw FilterExeption();
|
---|
| 116 |
|
---|
| 117 | it_submap = pair_submap.first;
|
---|
| 118 | }
|
---|
| 119 | it_submap->second->Add(element);
|
---|
| 120 | }
|
---|
| 121 | }
|
---|
| 122 |
|
---|
| 123 | it_submap = it_map->second.second.find(category);
|
---|
| 124 | return (it_submap != it_map->second.second.end()) ? it_submap->second : 0;
|
---|
| 125 | }
|
---|
| 126 |
|
---|
| 127 | //------------------------------------------------------------------------------
|
---|
| 128 |
|
---|