00001 #ifndef CROSSING_FRAME_H
00002 #define CROSSING_FRAME_H
00003
00016 #include "SimDataFormats/Track/interface/SimTrackContainer.h"
00017 #include "SimDataFormats/TrackingHit/interface/PSimHitContainer.h"
00018 #include "SimDataFormats/CaloHit/interface/PCaloHitContainer.h"
00019 #include "SimDataFormats/Vertex/interface/SimVertexContainer.h"
00020 #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h"
00021
00022 #include "DataFormats/Provenance/interface/EventID.h"
00023 #include "DataFormats/Common/interface/Wrapper.h"
00024 #include "SimDataFormats/EncodedEventId/interface/EncodedEventId.h"
00025 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00026
00027 template <class T>
00028 class PCrossingFrame;
00029
00030 #include "boost/shared_ptr.hpp"
00031 #include <vector>
00032 #include <string>
00033 #include <iostream>
00034 #include <utility>
00035 #include <algorithm>
00036
00037
00038 template <class T>
00039 class CrossingFrame
00040 {
00041
00042 public:
00043
00044
00045 CrossingFrame(): firstCrossing_(0), lastCrossing_(0), bunchSpace_(75),subdet_(""),maxNbSources_(0) {
00046 }
00047 CrossingFrame(int minb, int maxb, int bunchsp, std::string subdet ,unsigned int maxNbSources);
00048
00049 ~CrossingFrame() {;}
00050
00051 void swap(CrossingFrame& other);
00052
00053 CrossingFrame& operator=(CrossingFrame const& rhs);
00054
00055
00056 void addSignals(const std::vector<T> * vec,edm::EventID id);
00057
00058 void addSignals(const T * vec,edm::EventID id);
00059
00060
00061 void addPileups(const int bcr, std::vector<T> * vec, unsigned int evtId,int vertexoffset=0);
00062
00063 void addPileups(const int bcr, T * product, unsigned int evtId,int vertexoffset=0);
00064
00065 void setTof( );
00066
00067
00068
00069
00070
00071 void setPileupPtr(boost::shared_ptr<edm::Wrapper<std::vector<T> > const> shPtr) {shPtrPileups_.push_back( shPtr );}
00072 void setPileupPtr(boost::shared_ptr<edm::Wrapper<T> const> shPtr) {shPtrPileups2_.push_back( shPtr );}
00073
00074 void setPileupPtr(boost::shared_ptr<edm::Wrapper<PCrossingFrame<T> > const> shPtr);
00075
00076 void print(int level=0) const ;
00077
00078 void setBcrOffset() {
00079 pileupOffsetsBcr_.push_back(pileups_.size());
00080 }
00081
00082 void setSourceOffset(const unsigned int s) {
00083 pileupOffsetsSource_[s].push_back(pileups_.size());
00084 }
00085
00086
00087 edm::EventID getEventID() const {return id_;}
00088 std::pair<int,int> getBunchRange() const {return std::pair<int,int>(firstCrossing_,lastCrossing_);}
00089 int getBunchSpace() const {return bunchSpace_;}
00090 unsigned int getMaxNbSources() const {return maxNbSources_; }
00091 std::string getSubDet() const { return subdet_;}
00092 unsigned int getPileupFileNr() const {return pileupFileNr_;}
00093 edm::EventID getIdFirstPileup() const {return idFirstPileup_;}
00094 std::vector<unsigned int> getPileupOffsetsBcr() const {return pileupOffsetsBcr_;}
00095 std::vector< std::vector<unsigned int> > getPileupOffsetsSource() const {return pileupOffsetsSource_;}
00096 std::vector<const T *> getPileups() const {return pileups_;}
00097 std::vector<const T *> getSignal() const {return signals_;}
00098
00099
00100 void getSignal(typename std::vector<const T *>::const_iterator &first,typename std::vector<const T*>::const_iterator &last) const {
00101 first=signals_.begin();
00102 last=signals_.end();
00103 }
00104 void getPileups(typename std::vector<const T*>::const_iterator &first, typename std::vector<const T*>::const_iterator &last) const;
00105 unsigned int getNrSignals() const {return signals_.size();}
00106 unsigned int getNrPileups() const {return pileups_.size();}
00107 unsigned int getNrPileups(int bcr) const {
00108 return bcr==lastCrossing_ ? pileups_.size()-pileupOffsetsBcr_[lastCrossing_-firstCrossing_] :pileupOffsetsBcr_[bcr-firstCrossing_+1]- pileupOffsetsBcr_[bcr-firstCrossing_];}
00109
00110
00111 int getBunchCrossing(unsigned int ip) const;
00112
00113 int getSourceType(unsigned int ip) const;
00114
00115
00116
00117 const T & getObject(unsigned int ip) const {
00118
00119 if (ip>getNrSignals()+getNrPileups()) throw cms::Exception("BadIndex")<<"CrossingFrame::getObject called with an invalid index- index was "<<ip<<"!";
00120 if (ip<getNrSignals()) {
00121 return *(signals_[ip]);
00122 }
00123 else {
00124 return *(pileups_[ip-getNrSignals()]);
00125 }
00126 }
00127
00128
00129
00130 void setEventID(edm::EventID evId) { id_ = evId; }
00131 void setPileups(std::vector<const T *> p) { pileups_ = p; }
00132 void setBunchSpace(int bSpace) { bunchSpace_ = bSpace; }
00133 void setMaxNbSources(unsigned int mNbS) { maxNbSources_ = mNbS; }
00134 void setSubDet(std::string det) { subdet_ = det; }
00135 void setPileupFileNr(unsigned int pFileNr) { pileupFileNr_ = pFileNr;}
00136 void setIdFirstPileup(edm::EventID idFP) {idFirstPileup_ = idFP;}
00137 void setPileupOffsetsBcr(std::vector<unsigned int> pOffsetsBcr) { pileupOffsetsBcr_ = pOffsetsBcr;}
00138 void setPileupOffsetsSource(std::vector< std::vector<unsigned int> > pOffsetsS) { pileupOffsetsSource_ = pOffsetsS;}
00139 void setBunchRange(std::pair<int,int> bunchRange) { firstCrossing_ = bunchRange.first;
00140 lastCrossing_ = bunchRange.second;}
00141
00142 private:
00143
00144
00145 int firstCrossing_;
00146 int lastCrossing_;
00147 int bunchSpace_;
00148 std::string subdet_;
00149 edm::EventID id_;
00150
00151
00152 edm::EventID idFirstPileup_;
00153 unsigned int pileupFileNr_;
00154
00155 unsigned int maxNbSources_;
00156
00157
00158 std::vector<const T * > signals_;
00159
00160
00161 std::vector<const T *> pileups_;
00162 std::vector< boost::shared_ptr<edm::Wrapper<std::vector<T> > const> > shPtrPileups_;
00163 std::vector< boost::shared_ptr<edm::Wrapper<T> const> > shPtrPileups2_;
00164
00165
00166 boost::shared_ptr<edm::Wrapper<PCrossingFrame<T> > const> shPtrPileupsPCF_;
00167
00168
00169
00170
00171 std::vector<unsigned int> pileupOffsetsBcr_;
00172 std::vector< std::vector<unsigned int> > pileupOffsetsSource_;
00173
00174 };
00175
00176
00177
00178
00179
00180 template <class T>
00181 CrossingFrame<T>::CrossingFrame(int minb, int maxb, int bunchsp, std::string subdet ,unsigned int
00182 maxNbSources):firstCrossing_(minb), lastCrossing_(maxb),
00183 bunchSpace_(bunchsp),subdet_(subdet),maxNbSources_(maxNbSources) {
00184 pileupOffsetsSource_.resize(maxNbSources_);
00185 for (unsigned int i=0;i<maxNbSources_;++i)
00186 pileupOffsetsSource_[i].reserve(-firstCrossing_+lastCrossing_+1);
00187
00188
00189 pileupOffsetsBcr_.reserve(-firstCrossing_+lastCrossing_+1);
00190 }
00191
00192 template <typename T>
00193 inline
00194 void
00195 CrossingFrame<T>::swap(CrossingFrame<T>& other) {
00196 std::swap(firstCrossing_, other.firstCrossing_);
00197 std::swap(lastCrossing_, other.lastCrossing_);
00198 std::swap(bunchSpace_, other.bunchSpace_);
00199 subdet_.swap(other.subdet_);
00200 std::swap(id_, other.id_);
00201 std::swap(idFirstPileup_, other.idFirstPileup_);
00202 std::swap(pileupFileNr_, other.pileupFileNr_);
00203 std::swap(maxNbSources_, other.maxNbSources_);
00204 signals_.swap(other.signals_);
00205 pileups_.swap(other.pileups_);
00206 shPtrPileups_.swap(other.shPtrPileups_);
00207 shPtrPileups2_.swap(other.shPtrPileups2_);
00208 shPtrPileupsPCF_.swap(other.shPtrPileupsPCF_);
00209 pileupOffsetsBcr_.swap(other.pileupOffsetsBcr_);
00210 pileupOffsetsSource_.resize(maxNbSources_);
00211 for (unsigned int i=0;i<pileupOffsetsSource_.size();++i) {
00212 pileupOffsetsSource_[i].swap(other.pileupOffsetsSource_[i]);
00213 }
00214 }
00215
00216 template <typename T>
00217 inline
00218 CrossingFrame<T>&
00219 CrossingFrame<T>::operator=(CrossingFrame<T> const& rhs) {
00220 CrossingFrame<T> temp(rhs);
00221 this->swap(temp);
00222 return *this;
00223 }
00224
00225
00226 template <class T>
00227 void CrossingFrame<T>::getPileups(typename std::vector<const T *>::const_iterator &first,typename std::vector<const T *>::const_iterator &last) const {
00228 first=pileups_.begin();
00229 last=pileups_.end();
00230 }
00231
00232 template <class T>
00233 void CrossingFrame<T>::print(int level) const {
00234 }
00235
00236 template <class T>
00237 int CrossingFrame<T>::getSourceType(unsigned int ip) const {
00238
00239
00240
00241 unsigned int bcr= getBunchCrossing(ip)-firstCrossing_;
00242 for (unsigned int i=0;i<pileupOffsetsSource_.size()-1;++i) {
00243 if (ip>=(pileupOffsetsSource_[i])[bcr] && ip <(pileupOffsetsSource_[i+1])[bcr]) return i;
00244 }
00245 return pileupOffsetsSource_.size()-1;
00246 }
00247
00248 template <class T>
00249 int CrossingFrame<T>::getBunchCrossing(unsigned int ip) const {
00250
00251 for (unsigned int ii=1;ii<pileupOffsetsBcr_.size();ii++){
00252 if (ip>=pileupOffsetsBcr_[ii-1] && ip<pileupOffsetsBcr_[ii]) return ii+firstCrossing_-1;
00253 }
00254 if (ip<pileups_.size()) return lastCrossing_;
00255 else return 999;
00256 }
00257
00258
00259 template <typename T>
00260 inline
00261 void
00262 swap(CrossingFrame<T>& lhs, CrossingFrame<T>& rhs) {
00263 lhs.swap(rhs);
00264 }
00265
00266 #include<iosfwd>
00267 #include<iostream>
00268
00269 template <class T>
00270 std::ostream &operator<<(std::ostream& o, const CrossingFrame<T>& cf)
00271 {
00272 std::pair<int,int> range=cf.getBunchRange();
00273 o <<"\nCrossingFrame for subdet "<<cf.getEventID()<<", bunchrange = "<<range.first<<","<<range.second
00274 <<", bunchSpace "<<cf.getBunchSpace();
00275
00276 return o;
00277 }
00278
00279 #include "SimDataFormats/CrossingFrame/interface/PCrossingFrame.h"
00280 template <class T>
00281 void CrossingFrame<T>::setPileupPtr(boost::shared_ptr<edm::Wrapper<PCrossingFrame<T> > const> shPtr) {shPtrPileupsPCF_=shPtr;}
00282
00283
00284
00285 template <class T>
00286 void CrossingFrame<T>::addPileups(const int bcr, T * product, unsigned int evtId,int vertexoffset) {
00287
00288 pileups_.push_back(product);
00289 }
00290
00291 template <class T>
00292 void CrossingFrame<T>::addPileups(const int bcr, std::vector<T> * product, unsigned int evtId,int vertexoffset){
00293
00294
00295
00296 }
00297
00298 template <>
00299 void CrossingFrame<SimTrack>::addPileups(const int bcr, std::vector<SimTrack> *, unsigned int evtId,int vertexoffset);
00300
00301 template <>
00302 void CrossingFrame<SimVertex>::addPileups(const int bcr, std::vector<SimVertex> *, unsigned int evtId,int vertexoffset);
00303
00304 template <>
00305 void CrossingFrame<PSimHit>::addPileups(const int bcr, std::vector<PSimHit> *, unsigned int evtId,int vertexoffset);
00306
00307 template <>
00308 void CrossingFrame<PCaloHit>::addPileups(const int bcr, std::vector<PCaloHit> *, unsigned int evtId,int vertexoffset);
00309
00310 template <class T>
00311 void CrossingFrame<T>::addSignals(const std::vector<T> * vec,edm::EventID id){
00312
00313 id_=id;
00314 for (unsigned int i=0;i<vec->size();++i) {
00315 signals_.push_back(&((*vec)[i]));
00316 }
00317 }
00318
00319 template <class T>
00320 void CrossingFrame<T>::addSignals(const T * product,edm::EventID id){
00321
00322 id_=id;
00323 signals_.push_back(product);
00324 }
00325
00326 template <class T>
00327 void CrossingFrame<T>::setTof() {;}
00328
00329 #endif