/[PAMELA software]/PamCut/Collections/SmartCollection/SmartCollection.cpp
ViewVC logotype

Diff of /PamCut/Collections/SmartCollection/SmartCollection.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1 by pam-fi, Wed May 27 13:30:09 2009 UTC revision 1.7 by pam-fi, Thu Jul 8 14:00:33 2010 UTC
# Line 9  Line 9 
9    
10  #include "SmartCollection.h"  #include "SmartCollection.h"
11    
12  void SmartCollection::AddAction(CollectionAction& action) {  SmartCollection::~SmartCollection() {
13    _actions.push_back(&action);    if (_owns) {
14        for (unsigned int i = 0; i < _actions.size(); i++)
15          if (_actions[i] != NULL) {
16            delete _actions[i];
17            _actions[i] = NULL;
18          }
19      }
20    }
21    
22    void SmartCollection::AddAction(CollectionAction *action) {
23      _actions.push_back(action);
24      _actionsPositions.push_back(GetSize() - 1);
25  }  }
26    
27  CollectionAction *SmartCollection::GetAction(unsigned int iAction) {  CollectionAction *SmartCollection::GetAction(unsigned int iAction) {
# Line 22  CollectionAction *SmartCollection::GetAc Line 33  CollectionAction *SmartCollection::GetAc
33      return _actions[iAction];      return _actions[iAction];
34  }  }
35    
36  void SmartCollection::Setup(PamLevel2 *events){  CollectionAction *SmartCollection::GetAction(const char *actionName) {
37      if (_actions.size() == 0)
38        return NULL;
39      for (unsigned int i = 0; i < _actions.size(); i++) {
40        if (strcmp(_actions[i]->GetName(), actionName) == 0)
41          return _actions[i];
42      }
43    
44      return NULL;
45    }
46    
47    void SmartCollection::Setup(PamLevel2 *events) {
48    PamCutCollection::Setup(events);    PamCutCollection::Setup(events);
49      //cout << GetName() << endl;
50    
51    for (unsigned int i = 0; i < GetSize(); i++){    for (unsigned int i = 0; i < _actions.size(); i++) {
52      _actions[i]->Setup(events);      _actions[i]->Setup(events);
53    }    }
54  }  }
55    
56  void SmartCollection::Finalize(){  void SmartCollection::Finalize() {
57    PamCutCollection::Finalize();    PamCutCollection::Finalize();
58    
59    for (unsigned int i = 0; i < GetSize(); i++){    for (unsigned int i = 0; i < _actions.size(); i++) {
60      _actions[i]->Finalize();      _actions[i]->Finalize();
61    }    }
62  }  }
63    
64  void SmartCollection::OnGood(PamLevel2 *event){  int SmartCollection::ApplyCut(PamLevel2 *event) {
65    PamCutCollection::OnGood(event);  
66      _nEv++;
67    
68    for (unsigned int i = 0; i < GetSize(); i++){    // Execute the actions placed before the cuts
69      _actions[i]->OnGood(event);    unsigned int iBeforeCuts = 0;
70      //cout << GetName() << endl;
71      if (_actions.size() > 0) {
72        while (_actionsPositions[iBeforeCuts] == -1) {
73          _actions[iBeforeCuts]->OnGood(event);
74          iBeforeCuts++;
75          if (iBeforeCuts == _actions.size())
76            break;
77        }
78    }    }
 }  
79    
80  void SmartCollection::OnBad(PamLevel2 *event, int selectionResult){    // Apply the cuts
81    PamCutCollection::OnBad(event, selectionResult);    if (_cuts.size() == 0) {
82        _nGood++;
83        OnGood(event);
84        return CUTOK;
85      }
86    
87    for (unsigned int i = 0; i < GetSize(); i++){    unsigned int firstFailed = _cuts.size();
88      _actions[i]->OnBad(event, selectionResult);    unsigned int iAction = iBeforeCuts;
89      for (unsigned int iCut = 0; iCut < _cuts.size(); iCut++) {
90        if (_cuts[iCut]->ApplyCut(event) != CUTOK && firstFailed == _cuts.size()) {
91          firstFailed = iCut;
92          // Apply the bad actions at the end of the bunch
93          if (iAction < _actions.size()) {
94            unsigned int lastPosition = _actionsPositions[iAction];
95            for (; iAction < _actions.size(); iAction++) {
96              if (_actionsPositions[iAction] > (int) lastPosition) // Don't do actions at the end of successive bunches
97                break;
98              _actions[iAction]->OnBad(event, (int) firstFailed);
99    
100            }
101          }
102          break;
103        }
104        else if (iAction < _actions.size()) {
105          // Do the good actions if we are at the end of the bunch
106          while (_actionsPositions[iAction] == (int) iCut) {
107            _actions[iAction]->OnGood(event);
108            iAction++;
109            if (iAction == _actions.size())
110              break;
111          }
112        }
113      }
114    
115      if (firstFailed == _cuts.size()) {
116        _nGood++;
117        OnGood(event);
118        return CUTOK;
119      }
120      else {
121        OnBad(event, firstFailed);
122        return firstFailed;
123    }    }
124  }  }

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.7

  ViewVC Help
Powered by ViewVC 1.1.23