/[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.7 - (show annotations) (download)
Thu Jul 8 14:00:33 2010 UTC (14 years, 5 months ago) by pam-fi
Branch: MAIN
CVS Tags: MergedFromV8_1, V9, HEAD
Changes since 1.6: +25 -21 lines
Merged from branch V8 (tag MergedToHEAD_1). Tag before the merge: BeforeMergingFromV8_1.

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