CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
EcalDCCHeaderRuntypeDecoder.cc
Go to the documentation of this file.
4 
5 #include <string>
6 #include <iostream>
7 
10 
11 bool EcalDCCHeaderRuntypeDecoder::Decode( unsigned long TrigType, // global header, bits 56-59
12  unsigned long detTrigType, // dcc header word 2, bits 32-47
13  unsigned long runType, // dcc header word 2, bits 0-31
14  EcalDCCHeaderBlock* EcalDCCHeaderInfos)
15 {
16 
17  // unsigned int DCCNumberMask = 63;//2^6-1
18 
19  unsigned int WhichHalfOffSet= 64;//2^6
20  unsigned int TypeOffSet = 256;//2^8
21  unsigned int SubTypeOffSet = 2048;//2^11
22  unsigned int SettingOffSet = 131072;//2^17;
23  unsigned int GainModeOffSet = 16384;//2^14
24 
25  unsigned int TwoBitsMask = 3;
26  unsigned int ThreeBitsMask = 7;
27  unsigned int ThirdBitMask = 4;
28 
29  EcalDCCHeaderInfos-> setRtHalf( int ((runType / WhichHalfOffSet) & TwoBitsMask) );
30  int type = int ((runType / TypeOffSet) & ThreeBitsMask);
31  int sequence = int ((runType / SubTypeOffSet) & ThreeBitsMask);
32  EcalDCCHeaderInfos->setMgpaGain(int ((runType / GainModeOffSet) & TwoBitsMask) );
33  EcalDCCHeaderInfos->setMemGain( int ((runType / GainModeOffSet) & ThirdBitMask)/ThirdBitMask );
34  // EcalDCCHeaderInfos.Setting = int ( runType / SettingOffSet);
35 
36  if (type ==0 && sequence == 0){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::COSMIC);}
37  // begin: added for XDAQ 3
38  else if (type ==0 && sequence == 1){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::COSMIC);}
39  else if (type ==0 && sequence == 2){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::BEAMH4);}
40  else if (type ==0 && sequence == 3){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::BEAMH2);}
41  else if (type ==0 && sequence == 4){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::MTCC);}
42  // end: added for XDAQ 3
43  else if (type ==1 && sequence == 0){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::LASER_STD);}
44  else if (type ==1 && sequence == 1){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::LASER_POWER_SCAN);}
45  else if (type ==1 && sequence == 2){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::LASER_DELAY_SCAN);}
46  else if (type ==2 && sequence == 0){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::TESTPULSE_SCAN_MEM);}
47  else if (type ==2 && sequence == 1){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::TESTPULSE_MGPA);}
48  else if (type ==3 && sequence == 0){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::PEDESTAL_STD);}
49  else if (type ==3 && sequence == 1){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::PEDESTAL_OFFSET_SCAN);}
50  else if (type ==3 && sequence == 2){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::PEDESTAL_25NS_SCAN);}
51  else if (type ==4 && sequence == 0){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::LED_STD);}
52 
53  else if (type ==5 && sequence == 0){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::PHYSICS_GLOBAL);}
54  else if (type ==5 && sequence == 1){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::COSMICS_GLOBAL);}
55  else if (type ==5 && sequence == 2){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::HALO_GLOBAL);}
56  //
57  // else if (type ==5 && sequence == 3){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::CALIB_GLOBAL);}
58 
59  else if (type ==6 && sequence == 0){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::PHYSICS_LOCAL);}
60  else if (type ==6 && sequence == 1){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::COSMICS_LOCAL);}
61  else if (type ==6 && sequence == 2){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::HALO_LOCAL);}
62  else if (type ==6 && sequence == 3){EcalDCCHeaderInfos->setRunType(EcalDCCHeaderBlock::CALIB_LOCAL);}
63 
64  else {
66  edm::LogError("IncorrectHeader") <<"Unrecognized runtype and sequence: "<<type<<" "<<sequence;
67  }
68  EcalDCCHeaderInfos->setRunType(-1);
69  WasDecodingOk_ = false;
70  return WasDecodingOk_;
71  }
72 
73  // decoding of settings depends on whether run is global or local
74  if (type == 5 || type == 6){ DecodeSettingGlobal ( TrigType, detTrigType, EcalDCCHeaderInfos ); }
75  else { DecodeSetting (int ( runType / SettingOffSet),EcalDCCHeaderInfos); }
76 
77 
78  return WasDecodingOk_;
79 }
80 
81 
82 
83 
84 
85 void EcalDCCHeaderRuntypeDecoder::DecodeSettingGlobal ( unsigned long TrigType, unsigned long detTrigType, EcalDCCHeaderBlock * theHeader ){
86 
87  // TCC commands are decoded both in global (type ==5) and in local (type ==6)
88  // keep an eye on the possible: EcalDCCHeaderBlock::CALIB_GLOBAL
89  bool isLocal = false;
90  if (theHeader->getRunType() == EcalDCCHeaderBlock::CALIB_LOCAL) isLocal = true;
91 
92  // if Trigger_Type is physics, only dccIdInTTCCommand is meaningful
93  if (TrigType == 1){
94  int dccIdInTTCCommand = (detTrigType >> H_DCCID_B) & H_DCCID_MASK;
95  theHeader-> setDccInTTCCommand( dccIdInTTCCommand );
96  return;
97  }
98 
99  // if calibration trigger (gap)
100  else if (TrigType == 2) {
101 
102 
104  CleanEcalDCCSettingsInfo(&theSettings);
105 
106  int dccIdInTTCCommand = (detTrigType >> H_DCCID_B) & H_DCCID_MASK;
107  int halfInTTCCommand = (detTrigType >> H_HALF_B) & H_HALF_MASK;
108  int detailedTriggerTypeInTTCCommand = (detTrigType >> H_TR_TYPE_B) & H_TR_TYPE_MASK;
109  int wavelengthInTTCCommand = (detTrigType >> H_WAVEL_B) & H_WAVEL_MASK;
110 
111 
112  theHeader-> setRtHalf( halfInTTCCommand );
113  theHeader-> setDccInTTCCommand( dccIdInTTCCommand );
114  if (detailedTriggerTypeInTTCCommand == EcalDCCHeaderBlock::TTC_LASER){
115  if(isLocal) theHeader-> setRunType(EcalDCCHeaderBlock::LASER_STD);
116  else theHeader-> setRunType(EcalDCCHeaderBlock::LASER_GAP);
117  theSettings.wavelength = wavelengthInTTCCommand; }
118 
119 
120  else if (detailedTriggerTypeInTTCCommand == EcalDCCHeaderBlock::TTC_LED){
121  if(isLocal) theHeader-> setRunType(EcalDCCHeaderBlock::LED_STD);
122  else theHeader-> setRunType(EcalDCCHeaderBlock::LED_GAP);
123  theSettings.wavelength = wavelengthInTTCCommand; }
124 
125  else if (detailedTriggerTypeInTTCCommand == EcalDCCHeaderBlock::TTC_TESTPULSE){
126  if(isLocal) theHeader-> setRunType(EcalDCCHeaderBlock::TESTPULSE_MGPA);
127  else theHeader-> setRunType(EcalDCCHeaderBlock::TESTPULSE_GAP);
128  }
129 
130  else if (detailedTriggerTypeInTTCCommand == EcalDCCHeaderBlock::TTC_PEDESTAL){
131  if(isLocal) theHeader-> setRunType(EcalDCCHeaderBlock::PEDESTAL_STD);
132  else theHeader-> setRunType(EcalDCCHeaderBlock::PEDESTAL_GAP);
133  }
134 
135  else {
137  edm::LogError("IncorrectHeader") <<"Unrecognized detailedTriggerTypeInTTCCommand: " << detailedTriggerTypeInTTCCommand;
138  }
139  theHeader->setRunType(-1);
140  WasDecodingOk_ = false;
141  }
142 
143  theHeader->setEventSettings(theSettings);
144 
145  }
146 
147  else {
149  edm::LogError("IncorrectHeader") <<"Unrecognized detailed trigger type";
150  }
151  theHeader->setRunType(-1);
152  WasDecodingOk_ = false;
153  }
154 
155 }
156 
157 
158 
160 {
162  CleanEcalDCCSettingsInfo(&theSettings);
163 
164  if( theHeader->getRunType() == EcalDCCHeaderBlock::COSMIC ||
165  theHeader->getRunType() == EcalDCCHeaderBlock::BEAMH2 ||
166  theHeader->getRunType() == EcalDCCHeaderBlock::BEAMH4 ||
167  theHeader->getRunType() == EcalDCCHeaderBlock::MTCC ||
171  {;}
172  //no settings foreseen
173 
174  else if(theHeader->getRunType() == EcalDCCHeaderBlock::LASER_STD)
175  {
176  theSettings.LaserPower = (Setting & 8128)/64;
177  theSettings.LaserFilter = (Setting & 56)/8;
178  theSettings.wavelength = Setting & 7;
179  }
180 
181  else if(theHeader->getRunType() == EcalDCCHeaderBlock::LASER_POWER_SCAN){
182  theSettings.LaserPower = (Setting & 8128)/64;
183  theSettings.LaserFilter = (Setting & 56)/8;
184  theSettings.wavelength = Setting & 7;
185  }
186 
187  else if(theHeader->getRunType() == EcalDCCHeaderBlock::LASER_DELAY_SCAN){
188  theSettings.wavelength = Setting & 7;
189  theSettings.delay = (Setting & 2040)/8;
190  }
191 
192  else if(theHeader->getRunType() == EcalDCCHeaderBlock::TESTPULSE_SCAN_MEM){
193  theSettings.MEMVinj = Setting & 511;
194  }
195 
196  else if(theHeader->getRunType() == EcalDCCHeaderBlock::TESTPULSE_MGPA){
197  theSettings.mgpa_content = Setting & 255;
198  }
199 
200  else if(theHeader->getRunType() == EcalDCCHeaderBlock::PEDESTAL_STD){;}//no settings foreseen
201 
202  else if(theHeader->getRunType() == EcalDCCHeaderBlock::PEDESTAL_OFFSET_SCAN){
203  theSettings.ped_offset = Setting;
204  }
205 
206  else if(theHeader->getRunType() == EcalDCCHeaderBlock::PEDESTAL_25NS_SCAN ){
207  theSettings.delay = (Setting & 255);
208  }
209 
210  else if(theHeader->getRunType() == EcalDCCHeaderBlock::LED_STD){
211  theSettings.wavelength = Setting & 7;
212  }
213  else {
215  edm::LogError("IncorrectHeader") <<"Unrecognized run type: "<<theHeader->getRunType();
216  }
217  WasDecodingOk_ = false;
218  }
219 
220  theHeader->setEventSettings(theSettings);
221 
222 }
223 
224 
225 
227  dummySettings->LaserPower =-1;
228  dummySettings->LaserFilter =-1;
229  dummySettings->wavelength =-1;
230  dummySettings->delay =-1;
231  dummySettings->MEMVinj =-1;
232  dummySettings->mgpa_content =-1;
233  dummySettings->ped_offset =-1;
234 }
type
Definition: HCALResponse.h:22
void DecodeSetting(int settings, EcalDCCHeaderBlock *theHeader)
static bool silentMode_
void DecodeSettingGlobal(unsigned long TrigType, unsigned long detTrigType, EcalDCCHeaderBlock *theHeader)
void setMemGain(const short &memGain)
bool Decode(unsigned long TrTy, unsigned long detTrTy, unsigned long runType, EcalDCCHeaderBlock *theHeader)
void setEventSettings(const EcalDCCEventSettings &EventSettings)
void setMgpaGain(const short &mgpaGain)
void CleanEcalDCCSettingsInfo(EcalDCCHeaderBlock::EcalDCCEventSettings *theEventSettings)
void setRunType(const short &runType)
short getRunType() const