Go to the documentation of this file.00001 #ifndef PRODUCER_H
00002 #define PRODUCER_H
00003
00004 #include "FWCore/Framework/interface/EDProducer.h"
00005 #include "FWCore/Utilities/interface/InputTag.h"
00006 #include "EventFilter/EcalRawToDigi/interface/MatacqRawEvent.h"
00007 #include "EventFilter/EcalRawToDigi/src/MatacqDataFormatter.h"
00008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00009
00010 #include <string>
00011 #include <inttypes.h>
00012 #include <fstream>
00013 #include <memory>
00014
00015 #include <sys/time.h>
00016
00017 #define USE_STORAGE_MANAGER
00018
00019 #ifdef USE_STORAGE_MANAGER
00020 # include "Utilities/StorageFactory/interface/Storage.h"
00021 # include "Utilities/StorageFactory/interface/StorageFactory.h"
00022 #else //USE_STORAGE_MANAGER not defined
00023 # ifndef _LARGEFILE64_SOURCE
00024 # define _LARGEFILE64_SOURCE
00025 # endif //_LARGEFILE64_SOURCE not defined
00026 # include <stdio.h>
00027 #endif //USE_STORAGE_MANAGER defined
00028
00029 struct NullOut{
00030 NullOut&
00031 operator<<(std::ostream& (*pf)(std::ostream&)){
00032 return *this;
00033 }
00034 template<typename T>
00035 inline NullOut& operator<<(const T& a){
00036 return *this;
00037 }
00038 };
00039
00051 class MatacqProducer : public edm::EDProducer
00052 {
00053 public:
00054 enum calibTrigType_t{
00055 laserType = 4,
00056 ledType = 5,
00057 tpType = 6,
00058 pedType = 7
00059 };
00060 private:
00061 #ifdef USE_STORAGE_MANAGER
00062 typedef IOOffset filepos_t;
00063 typedef std::auto_ptr<Storage> FILE_t;
00064 #else
00065 typedef off_t filepos_t;
00066 typedef FILE* FILE_t;
00067 #endif
00068 struct MatacqEventId{
00069 MatacqEventId(): run(0), orbit(0){}
00070 MatacqEventId(uint32_t r, uint32_t o): run(r), orbit(o){}
00071
00074 uint32_t run;
00075
00078 uint32_t orbit;
00079
00080 bool
00081 operator<(const MatacqEventId& a){
00082 return (this->run < a.run)
00083 || ((this->run == a.run) && (this->orbit < a.orbit));
00084 }
00085
00086 bool
00087 operator>(const MatacqEventId& a){
00088 return (this->run > a.run)
00089 || ((this->run == a.run) && (this->orbit > a.orbit));
00090 }
00091
00092 bool
00093 operator==(const MatacqEventId& a){
00094 return !((*this) < a || (*this) > a);
00095 }
00096 };
00097
00098
00105 class PosEstimator{
00106
00107
00108
00109 public:
00110 PosEstimator():eventLength_(0), orbitStepMean_(0), firstOrbit_(0),
00111 invalid_(true), verbosity_(0) { }
00112 void init(MatacqProducer* mp);
00113 bool invalid() const { return invalid_; }
00114 int64_t pos(int orb) const;
00115 int eventLength() const { return eventLength_; }
00116 int firstOrbit() const { return firstOrbit_; }
00117 void verbosity(int verb) { verbosity_ = verb; }
00118 private:
00119 int eventLength_;
00120 int orbitStepMean_;
00121 int firstOrbit_;
00122 bool invalid_;
00123 int verbosity_;
00124 };
00125
00126 public:
00130 explicit
00131 MatacqProducer(const edm::ParameterSet& params);
00132
00135 ~MatacqProducer();
00136
00141 virtual void
00142 produce(edm::Event& event, const edm::EventSetup& eventSetup);
00143
00144 private:
00149 void
00150 addMatacqData(edm::Event& event);
00151
00159 bool
00160 getMatacqFile(uint32_t runNumber, uint32_t orbitId, bool* fileChange =0);
00161
00162 bool
00163 getMatacqEvent(uint32_t runNumber, int32_t orbitId,
00164 bool fileChange);
00165
00166
00167 uint32_t getRunNumber(edm::Event& ev) const;
00168 uint32_t getOrbitId(edm::Event& ev) const;
00169 int getCalibTriggerType(edm::Event& ev) const;
00170
00173 void loadOrbitOffset();
00174
00181 bool mseek(filepos_t offset, int whence = SEEK_SET, const char* mess = 0);
00182
00183 bool mtell(filepos_t& pos);
00184
00193 bool mread(char* buf, size_t n, const char* mess = 0, bool peek = false);
00194
00195 bool mcheck(const std::string& name);
00196
00197 bool mopen(const std::string& name);
00198
00199 void mclose();
00200
00201 bool misOpened();
00202
00203 bool meof();
00204
00205 bool mrewind();
00206
00207 bool msize(filepos_t& s);
00208
00209 static std::string runSubDir(uint32_t runNumber);
00210
00211 private:
00212 std::vector<std::string> fileNames_;
00213
00216 std::string digiInstanceName_;
00217
00220 std::string rawInstanceName_;
00221
00224 bool timing_;
00225
00228 bool disabled_;
00229
00232 int verbosity_;
00233
00236 bool produceDigis_;
00237
00240 bool produceRaw_;
00241
00245 edm::InputTag inputRawCollection_;
00246
00250 bool mergeRaw_;
00251
00254 bool ignoreTriggerType_;
00255
00256 MatacqRawEvent matacq_;
00257
00260 FILE_t inFile_;
00261
00262 static const int bufferSize = 30000;
00263
00264 std::vector<unsigned char> data_;
00265 MatacqDataFormatter formatter_;
00266 static int orbitTolerance_;
00267 uint32_t openedFileRunNumber_;
00268 int32_t lastOrb_;
00269 int fastRetrievalThresh_;
00270
00271 PosEstimator posEstim_;
00272
00273 timeval startTime_;
00274
00279 std::string orbitOffsetFile_;
00280
00283 std::map<uint32_t,uint32_t> orbitOffset_;
00284
00287 bool doOrbitOffset_;
00288
00291 std::string inFileName_;
00292
00293 static const int matacqFedId_ = 655;
00294
00295 struct stats_t {
00296 double nEvents;
00297 double nLaserEventsWithMatacq;
00298 double nNonLaserEventsWithMatacq;
00299 } stats_;
00300
00301 static stats_t stats_init;
00304 std::string logFileName_;
00305
00308 std::ofstream logFile_;
00309 };
00310
00311 #endif