00001 #include "RecoTBCalo/HcalTBObjectUnpacker/interface/HcalTBTriggerDataUnpacker.h"
00002 #include "TBDataFormats/HcalTBObjects/interface/HcalTBTriggerData.h"
00003 #include "DataFormats/FEDRawData/interface/FEDRawData.h"
00004 #include <iostream>
00005
00006 using namespace std;
00007
00008
00009
00010 struct oldTriggerDataFormat {
00011 uint32_t cdfHeader[4];
00012 uint32_t triggerWord;
00013 uint32_t triggerNumber;
00014 uint32_t triggerTime_usec;
00015 uint32_t triggerTime_base;
00016 uint32_t spillNumber;
00017 uint32_t runNumber;
00018 char runNumberSequenceId[16];
00019 uint32_t orbitNumber;
00020 uint32_t bunchNumber;
00021 uint32_t eventStatus;
00022 uint32_t filler1;
00023 uint32_t cdfTrailer[2];
00024 };
00025
00026
00027
00028
00029
00030 typedef struct StandardTrgMsgBlkStruct {
00031 uint32_t orbitNumber;
00032 uint32_t eventNumber;
00033 uint32_t flags_daq_ttype;
00034 uint32_t algo_bits_3;
00035 uint32_t algo_bits_2;
00036 uint32_t algo_bits_1;
00037 uint32_t algo_bits_0;
00038 uint32_t tech_bits;
00039 uint32_t gps_1234;
00040 uint32_t gps_5678;
00041 } StandardTrgMsgBlk;
00042
00043 typedef struct newExtendedTrgMsgBlkStruct {
00044 StandardTrgMsgBlk stdBlock;
00045 uint32_t triggerWord;
00046 uint32_t triggerTime_usec;
00047 uint32_t triggerTime_base;
00048 uint32_t spillNumber;
00049 uint32_t runNumber;
00050 char runNumberSequenceId[16];
00051 uint32_t eventStatus;
00052 } newExtendedTrgMsgBlk;
00053
00054
00055 namespace hcaltb {
00056
00057 void HcalTBTriggerDataUnpacker::unpack(const FEDRawData& raw, HcalTBTriggerData& htbtd) {
00058
00059
00060
00061 if (raw.size() == 80) {
00062
00063 const oldTriggerDataFormat *oldtrgblk = (const oldTriggerDataFormat *)(raw.data());
00064 htbtd.setStandardData(oldtrgblk->orbitNumber,
00065 oldtrgblk->triggerNumber,
00066 oldtrgblk->bunchNumber,
00067 0,
00068 0, 0, 0, 0,
00069 0,
00070 0, 0
00071 );
00072
00073 htbtd.setExtendedData(oldtrgblk->triggerWord,
00074 oldtrgblk->triggerTime_usec,
00075 oldtrgblk->triggerTime_base,
00076 oldtrgblk->spillNumber,
00077 oldtrgblk->runNumber,
00078 oldtrgblk->runNumberSequenceId);
00079 }
00080 else {
00081
00082 const newExtendedTrgMsgBlk *newtrgblk;
00083
00084 if (raw.size() == 96)
00085
00086 newtrgblk = (const newExtendedTrgMsgBlk *)(raw.data()+8);
00087
00088 else if (raw.size() == 104)
00089
00090 newtrgblk = (const newExtendedTrgMsgBlk *)(raw.data()+16);
00091 else {
00092 cerr << "HcalTBtdUnpacker.unpack: data of unknown size ";
00093 cerr << raw.size() << endl;
00094 return;
00095 }
00096
00097
00098
00099 const uint32_t *cdflow = (const uint32_t *)raw.data();
00100 int bunch_id = (*cdflow)>>20;
00101
00102 htbtd.setStandardData(newtrgblk->stdBlock.orbitNumber,
00103 newtrgblk->stdBlock.eventNumber,
00104 bunch_id,
00105 newtrgblk->stdBlock.flags_daq_ttype,
00106 newtrgblk->stdBlock.algo_bits_3,
00107 newtrgblk->stdBlock.algo_bits_2,
00108 newtrgblk->stdBlock.algo_bits_1,
00109 newtrgblk->stdBlock.algo_bits_0,
00110 newtrgblk->stdBlock.tech_bits,
00111 newtrgblk->stdBlock.gps_1234,
00112 newtrgblk->stdBlock.gps_5678);
00113
00114 htbtd.setExtendedData(newtrgblk->triggerWord,
00115 newtrgblk->triggerTime_usec,
00116 newtrgblk->triggerTime_base,
00117 newtrgblk->spillNumber,
00118 newtrgblk->runNumber,
00119 newtrgblk->runNumberSequenceId);
00120 }
00121
00122 }
00123 }
00124