00001 #ifndef StiMasterHitLoader_H
00002 #define StiMasterHitLoader_H
00003
00004 #include <stdexcept>
00005 #include <vector>
00006 #include "StiHitLoader.h"
00007 #include "Sti/StiTrackContainer.h"
00008 #include "StEvent.h"
00009 #include "StEventTypes.h"
00010
00029 template<class Source1, class Detector>
00030 class StiMasterHitLoader : public StiHitLoader<Source1, Detector>,
00031 public vector< StiHitLoader<Source1, Detector> *>
00032 {
00033 public:
00034
00035 StiMasterHitLoader();
00036 StiMasterHitLoader(const string& name,
00037 StiHitContainer* hitContainer,
00038 Factory<StiHit>*hitFactory,
00039 Detector*transform);
00040 virtual ~StiMasterHitLoader();
00041 void addLoader(StiHitLoader<Source1, Detector>*loader);
00042 void loadEvent(Source1 *source1,
00043 Filter<StiTrack> * trackFilter,
00044 Filter<StiHit> * hitFilter);
00045 void setHitContainer(StiHitContainer* hitContainer);
00046 void setHitFactory(Factory<StiHit>*hitFactory);
00047 virtual void setDetector(Detector*detector);
00048 protected:
00049 typedef StiHitLoader<Source1,Detector>* HitLoaderKey;
00050 typedef vector< HitLoaderKey > HitLoaderVector;
00051 typedef typename HitLoaderVector::iterator HitLoaderIter;
00052 typedef typename HitLoaderVector::const_iterator HitLoaderConstIter;
00053
00054 };
00055
00056 template<class Source1, class Detector>
00057 StiMasterHitLoader<Source1,Detector>::StiMasterHitLoader()
00058 : StiHitLoader<Source1, Detector>("MasterHitLoader",0,0,0)
00059 {}
00060
00061 template<class Source1,class Detector>
00062 StiMasterHitLoader<Source1,Detector>::StiMasterHitLoader(const string& name,
00063 StiHitContainer* hitContainer,
00064 Factory<StiHit>*hitFactory,
00065 Detector*transform)
00066 : StiHitLoader<Source1, Detector>(name,hitContainer,hitFactory,transform)
00067 {}
00068
00069 template<class Source1,class Detector>
00070 StiMasterHitLoader<Source1, Detector>::~StiMasterHitLoader()
00071 {}
00072
00073 template<class Source1,class Detector>
00074 void StiMasterHitLoader<Source1, Detector>::addLoader(StiHitLoader<Source1, Detector>*loader)
00075 {
00076 push_back(loader);
00077 }
00078
00079 template<class Source1, class Detector>
00080 void StiMasterHitLoader<Source1, Detector>::loadEvent(Source1 *source1,
00081 Filter<StiTrack> * trackFilter,
00082 Filter<StiHit> * hitFilter)
00083 {
00084 if(!this->_hitContainer)
00085 throw runtime_error("StiMasterHitLoader::loadEvent( ) -F- _hitContainer==0");
00086 this->_hitContainer->clear();
00087 HitLoaderConstIter iter;
00088 for (iter=this->begin();iter!=this->end();iter++){
00089 (*iter)->loadHits(source1,trackFilter, hitFilter);}
00090 this->_hitContainer->sortHits();
00091 this->_hitContainer->reset();
00092 }
00093
00094 template<class Source1, class Detector>
00095 void StiMasterHitLoader<Source1, Detector>::setHitContainer(StiHitContainer* hitContainer)
00096 {
00097 this->_hitContainer = hitContainer;
00098 HitLoaderIter iter;
00099 for (iter=this->begin();iter!=this->end();iter++)
00100 (*iter)->setHitContainer(hitContainer);
00101 }
00102
00103
00104 template<class Source1, class Detector>
00105 void StiMasterHitLoader<Source1,Detector>::setHitFactory(Factory<StiHit>*hitFactory)
00106 {
00107 HitLoaderIter iter;
00108 for (iter=this->begin();iter!=this->end();iter++)
00109 (*iter)->setHitFactory(hitFactory);
00110 }
00111
00112 template<class Source1,class Detector>
00113 void StiMasterHitLoader<Source1,Detector>::setDetector(Detector*transform)
00114 {
00115 throw runtime_error("StiMasterHitLoader<Source1,Detector>::setDetector(Detector*) - This call is Forbiden in StiMasterHitLoader");
00116 }
00117
00118
00119 #endif
00120
00121