/* * SmartCollection.cpp * * Created on: 14-mag-2009 * Author: Nicola Mori */ /*! @file SmartCollection.cpp The SmartCollection class implementation file */ #include "SmartCollection.h" void SmartCollection::AddAction(CollectionAction& action) { _actions.push_back(&action); _actionsPositions.push_back(GetSize() - 1); } CollectionAction *SmartCollection::GetAction(unsigned int iAction) { if (_actions.size() == 0) return NULL; if (iAction < 0 || iAction > _actions.size() - 1) return NULL; else return _actions[iAction]; } void SmartCollection::Setup(PamLevel2 *events) { PamCutCollection::Setup(events); for (unsigned int i = 0; i < _actions.size(); i++) { _actions[i]->Setup(events); } } void SmartCollection::Finalize() { PamCutCollection::Finalize(); for (unsigned int i = 0; i < _actions.size(); i++) { _actions[i]->Finalize(); } } int SmartCollection::ApplyCut(PamLevel2 *event) { _nEv++; // Apply the cuts if (_cuts.size() == 0) { _nGood++; OnGood(event); return CUTOK; } unsigned int firstFailed = _cuts.size(); for (unsigned int icut = 0; icut < _cuts.size(); icut++) { if (_cuts[icut]->ApplyCut(event) != CUTOK && firstFailed == _cuts.size()) { firstFailed = icut; break; } } //Do actions if (_actions.size() > 0) { unsigned int lastPosition = _cuts.size(); for (unsigned int i = 0; i < _actions.size(); i++) { if (_actionsPositions[i] < firstFailed) _actions[i]->OnGood(event); else { // A cut has failed if (lastPosition == _cuts.size()) // Record the position of the end of the bunch lastPosition = _actionsPositions[i]; if (_actionsPositions[i] > lastPosition) // Don't do actions at the end of successive bunches break; _actions[i]->OnBad(event, firstFailed); } } } if (firstFailed == _cuts.size()) { _nGood++; OnGood(event); return CUTOK; } else { OnBad(event, firstFailed); return firstFailed; } }