CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/TrackingTools/TrajectoryFiltering/interface/CompositeLogicalTrajectoryFilter.h

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   //look for VPSet of filters
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