Go to the documentation of this file.00001 #include "FWCore/Framework/interface/EDAnalyzer.h"
00002 #include "Alignment/LaserAlignment/interface/LASGlobalData.h"
00003 #include <DataFormats/Common/interface/DetSetVector.h>
00004 #include <FWCore/Framework/interface/Event.h>
00005
00006
00007 class TFile;
00008 class TTree;
00009
00010 class RawDataConverter : public edm::EDAnalyzer {
00011
00012 public:
00013 explicit RawDataConverter(const edm::ParameterSet&);
00014 ~RawDataConverter();
00015
00016
00017 private:
00018 enum DigiType {ZeroSuppressed, VirginRaw, ProcessedRaw, Unknown};
00019 virtual void beginJob() ;
00020 virtual void beginRun(edm::Run const &, edm::EventSetup const &) ;
00021 virtual void analyze(const edm::Event&, const edm::EventSetup&);
00022 virtual void endJob() ;
00023
00024 void fillDetectorId( void );
00025 void ClearData( void );
00026 DigiType GetValidLabels( const edm::Event& iEvent );
00027
00028 template <class T>
00029 void GetDigis(const edm::Event&);
00030
00031 std::vector<std::string> theDigiModuleLabels;
00032 std::vector<std::string> theProductInstanceLabels;
00033
00034 std::string CurrentModuleLabel;
00035 std::string CurrentInstanceLabel;
00036
00037 TFile* theOutputFile;
00038 TTree* theOutputTree;
00039 LASGlobalData<std::vector<float> > theData;
00040
00041 int latency;
00042 int eventnumber;
00043 int runnumber;
00044 int lumiBlock;
00045 LASGlobalData<int> detectorId;
00046
00047 };
00048
00049
00050
00051
00052
00053 template <class Digitype>
00054 void RawDataConverter::GetDigis( const edm::Event& iEvent)
00055 {
00056 LogDebug("RawDataConverter") << "Fill ZeroSuppressed Digis into the Tree";
00057
00058
00059
00060 edm::Handle< edm::DetSetVector< Digitype > > detSetVector;
00061 iEvent.getByLabel( CurrentModuleLabel , CurrentInstanceLabel , detSetVector );
00062 if( ! detSetVector.isValid() ) throw std::runtime_error("Could not find the Digis");
00063
00064
00065 ClearData();
00066
00067
00068
00069 LASGlobalLoop loop;
00070 int det, ring, beam, disk, pos;
00071
00072
00073 det = 0; ring = 0; beam = 0; disk = 0;
00074 do {
00075
00076 typename edm::DetSetVector< Digitype >::const_iterator theModule = detSetVector->find( detectorId.GetTECEntry( det, ring, beam, disk ) );
00077
00078 if ( theModule != detSetVector->end() ) {
00079
00080 typename edm::DetSet< Digitype >::const_iterator theDigi;
00081 for (theDigi = theModule->data.begin(); theDigi != theModule->data.end(); ++theDigi ) {
00082
00083 if ( theDigi->channel() < 512 ) theData.GetTECEntry( det, ring, beam, disk ).at( theDigi->channel() ) = theDigi->adc();
00084 }
00085 }
00086 } while( loop.TECLoop( det, ring, beam, disk ) );
00087
00088
00089 det = 2; beam = 0; pos = 0;
00090 do {
00091
00092 typename edm::DetSetVector< Digitype >::const_iterator theModule = detSetVector->find( detectorId.GetTIBTOBEntry( det, beam, pos ) );
00093
00094 if ( theModule != detSetVector->end() ) {
00095
00096 typename edm::DetSet< Digitype >::const_iterator theDigi;
00097 for (theDigi = theModule->data.begin(); theDigi != theModule->data.end(); ++theDigi ) {
00098
00099 if ( theDigi->channel() < 512 ) theData.GetTIBTOBEntry( det, beam, pos ).at( theDigi->channel() ) = theDigi->adc();
00100 }
00101 }
00102 } while( loop.TIBTOBLoop( det, beam, pos ) );
00103
00104
00105
00106 det = 0; beam = 0; disk = 0;
00107 do {
00108
00109 typename edm::DetSetVector< Digitype >::const_iterator theModule = detSetVector->find( detectorId.GetTEC2TECEntry( det, beam, disk ) );
00110
00111 if ( theModule != detSetVector->end() ) {
00112
00113 typename edm::DetSet< Digitype >::const_iterator theDigi;
00114 for (theDigi = theModule->data.begin(); theDigi != theModule->data.end(); ++theDigi ) {
00115
00116 if ( theDigi->channel() < 512 ) theData.GetTEC2TECEntry( det, beam, disk ).at( theDigi->channel() ) = theDigi->adc();
00117 }
00118 }
00119 } while( loop.TEC2TECLoop( det, beam, disk ) );
00120 }
00121