Go to the documentation of this file.00001 #ifndef CompositeLogicalTrajectoryFilter_H
00002 #define CompositeLogicalTrajectoryFilter_H
00003
00004 #include "TrackingTools/TrajectoryFiltering/interface/TrajectoryFilter.h"
00005 #include "TrackingTools/TrajectoryFiltering/interface/TrajectoryFilterFactory.h"
00006 #include "TrackingTools/PatternTools/interface/Trajectory.h"
00007 #include "TrackingTools/PatternTools/interface/TempTrajectory.h"
00008
00009 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00010
00011 class CompositeLogicalTrajectoryFilter : public TrajectoryFilter {
00012 public:
00013 enum logic { OR, AND };
00014 explicit CompositeLogicalTrajectoryFilter() {filters.clear();}
00015
00016 explicit CompositeLogicalTrajectoryFilter( const edm::ParameterSet & pset)
00017 {
00018
00019 std::vector<edm::ParameterSet> vpset=pset.getParameter<std::vector<edm::ParameterSet> >("filters");
00020 for (unsigned int i=0;i!= vpset.size();i++)
00021 {
00022 std::string ls = vpset[i].getParameter<std::string>("logic");
00023 logic l=OR;
00024 if (ls == "OR") l=OR;
00025 else if (ls == "AND") l=AND;
00026 else{
00027 edm::LogError("CompositeLogicalTrajectoryFilter")<<"I don't understand the logic: "<<ls
00028 ;
00029 }
00030 filters.push_back(std::make_pair(l,TrajectoryFilterFactory::get()->create(vpset[i].getParameter<std::string>("ComponentName"), vpset[i])));
00031
00032 }
00033 }
00034
00035 ~CompositeLogicalTrajectoryFilter(){
00036 for (unsigned int i=0;i!= filters.size();i++) { delete filters[i].second;} filters.clear();
00037 }
00038
00039
00040
00041 virtual bool qualityFilter( const Trajectory& traj) const { return QF<Trajectory>(traj);}
00042 virtual bool qualityFilter( const TempTrajectory& traj) const { return QF<TempTrajectory>(traj);}
00043
00044 virtual bool toBeContinued( Trajectory& traj) const { return TBC<Trajectory>(traj);}
00045 virtual bool toBeContinued( TempTrajectory& traj) const { return TBC<TempTrajectory>(traj);}
00046
00047 virtual std::string name() const {return "CompositeLogicalTrajectoryFilter";}
00048
00049 protected:
00050 template <class T> bool TBC( T& traj)const{
00051 unsigned int i=0;
00052 unsigned int n=filters.size();
00053 for (;i<n;i++){ if (!filters[i].second->toBeContinued(traj)) return false; }
00054 return true;
00055 }
00056
00057 template <class T> bool QF(const T& traj)const{
00058 bool condition=true;
00059
00060 unsigned int n=filters.size();
00061 if (n==0) { edm::LogError("CompositeLogicalTrajectoryFilter")<<n<<" filters !." ; return false;}
00062 condition=filters[0].second->qualityFilter(traj);
00063
00064 unsigned int i=1;
00065 for (;i<n;i++){
00066 bool lcondition =filters[i].second->qualityFilter(traj);
00067 if (filters[i].first==OR)
00068 condition= condition || lcondition;
00069 else if (filters[i].first==AND)
00070 condition= condition && lcondition;
00071 }
00072 return condition;
00073 }
00074
00075 protected:
00076 std::vector< std::pair< logic, const TrajectoryFilter *> > filters;
00077 };
00078
00079 #endif