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

Contents of /PamCut/Collections/SmartCollection/SmartCollection.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.6.2.1 - (show annotations) (download)
Mon Jun 7 11:16:03 2010 UTC (14 years, 5 months ago) by pam-fi
Branch: V8
CVS Tags: MergedToHEAD_1, nuclei_reproc
Changes since 1.6: +25 -21 lines
Actions are now executed at the position they are inserted in (previously they were executed after all the cuts). This new implementation is consistent if there are cuts which modify the PamLevel2 object.

1 /*
2 * SmartCollection.cpp
3 *
4 * Created on: 14-mag-2009
5 * Author: Nicola Mori
6 */
7
8 /*! @file SmartCollection.cpp The SmartCollection class implementation file */
9
10 #include "SmartCollection.h"
11
12 SmartCollection::~SmartCollection() {
13 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) {
28 if (_actions.size() == 0)
29 return NULL;
30 if (iAction < 0 || iAction > _actions.size() - 1)
31 return NULL;
32 else
33 return _actions[iAction];
34 }
35
36 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);
49 //cout << GetName() << endl;
50
51 for (unsigned int i = 0; i < _actions.size(); i++) {
52 _actions[i]->Setup(events);
53 }
54 }
55
56 void SmartCollection::Finalize() {
57 PamCutCollection::Finalize();
58
59 for (unsigned int i = 0; i < _actions.size(); i++) {
60 _actions[i]->Finalize();
61 }
62 }
63
64 int SmartCollection::ApplyCut(PamLevel2 *event) {
65
66 _nEv++;
67
68 // Execute the actions placed before the cuts
69 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 // Apply the cuts
81 if (_cuts.size() == 0) {
82 _nGood++;
83 OnGood(event);
84 return CUTOK;
85 }
86
87 unsigned int firstFailed = _cuts.size();
88 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 }

  ViewVC Help
Powered by ViewVC 1.1.23