CMS 3D CMS Logo

PixelGlobalDelay25.cc
Go to the documentation of this file.
1 //
2 // This class stores the information about the global delay25 delay settings
3 // For the time being, the affected delay25 channels are SDA, SCL, and TRG
4 // (as implemented in PixelTKFECSupervisor)
5 //
6 
9 
10 #include <sstream>
11 #include <fstream>
12 #include <map>
13 #include <assert.h>
14 #include <math.h>
15 #include <stdexcept>
16 
17 
18 using namespace pos;
19 using namespace std;
20 
21 PixelGlobalDelay25::PixelGlobalDelay25(vector<vector<string> > &tableMat):PixelConfigBase(" "," "," ")
22 {
23  std::string mthn = "[PixelGlobalDelay25::PixelGlobalDelay25()]\t\t " ;
24  vector<string> ins = tableMat[0];
25  map<string , int > colM;
26  vector<string> colNames;
27 
42  colNames.push_back("CONFIG_KEY" ) ;
43  colNames.push_back("KEY_TYPE" ) ;
44  colNames.push_back("KEY_ALIAS_ID" ) ;
45  colNames.push_back("KEY_ALIAS" ) ;
46  colNames.push_back("VERSION" ) ;
47  colNames.push_back("KIND_OF_COND" ) ;
48  colNames.push_back("GLOBALDELAY25") ;
49  for(unsigned int c = 0 ; c < ins.size() ; c++)
50  {
51  for(unsigned int n=0; n<colNames.size(); n++)
52  {
53  if(tableMat[0][c] == colNames[n]){
54  colM[colNames[n]] = c;
55  break;
56  }
57  }
58  }//end for
59  for(unsigned int n=0; n<colNames.size(); n++)
60  {
61  if(colM.find(colNames[n]) == colM.end())
62  {
63  std::cerr << "[PixelGlobalDelay25::PixelGlobalDelay25()]\tCouldn't find in the database the column with name " << colNames[n] << std::endl;
64  assert(0);
65  }
66  }
67  sscanf(tableMat[1][colM["GLOBALDELAY25"]].c_str(),"%x",&delay_);
68  std::cout << __LINE__ << "]\t" << mthn << "[DB] read global delay 0x" << std::hex << delay_ << std::dec << endl;
69 
70  if (delay_>=50) {
71  std::cout << __LINE__ << "]\t" << mthn << "global delay is out of range (>= 1 Tclk)." << std::endl;
72  std::cout << __LINE__ << "]\t" << mthn << "will not apply any global delays." << std::endl;
73  std::cout << __LINE__ << "]\t" << mthn << "increase the delays in the TPLL if needed." << std::endl;
74  delay_=0;
75  }
76 }
77 
78 
80  PixelConfigBase(" "," "," "){
81 
82  std::string mthn = "[PixelGlobalDelay25::PixelGlobalDelay25()]\t\t\t " ;
83  std::ifstream in(filename.c_str());
84 
85  if (!in.good()){
86  std::cout << __LINE__ << "]\t" << mthn << "Could not open: " << filename << std::endl;
87  throw std::runtime_error("Failed to open file "+filename);
88  }
89  else {
90  std::cout << __LINE__ << "]\t" << mthn << "Opened: " << filename << std::endl;
91  }
92 
93  in >> std::hex >> delay_ >> std::dec;
94  std::cout << __LINE__ << "]\t" << mthn << "read global delay 0x" << std::hex << delay_ << std::dec << endl;
95 
96  in.close();
97 
98  if (delay_>=50) {
99  std::cout << __LINE__ << "]\t" << mthn << "global delay is out of range (>= 1 Tclk)." << std::endl;
100  std::cout << __LINE__ << "]\t" << mthn << "will not apply any global delays." << std::endl;
101  std::cout << __LINE__ << "]\t" << mthn << "increase the delays in the TPLL if needed." << std::endl;
102  delay_=0;
103  }
104 }
105 
106 
108 
109 
110 unsigned int PixelGlobalDelay25::getDelay(unsigned int offset) const{
111  std::string mthn = "[PixelGlobalDelay25::getDelay()]\t\t\t " ;
112  unsigned int ret=offset+delay_;
113  if (ret > 127) {
114  std::cout << __LINE__ << "]\t" << mthn <<"the required total delay "<<ret<<" is out of range." << endl;
115  std::cout << __LINE__ << "]\t" << mthn <<"original setting: "<<offset<<", global delay: "<<delay_ << endl;
116  std::cout << __LINE__ << "]\t" << mthn <<"we will keep the default delay setting..." << endl;
117 
118  ret=offset;
119  }
120 
121  std::cout << __LINE__ << "]\t" << mthn << "getDelay("<<offset<<") returns "<<ret<<endl;
122  return ret;
123 }
124 
125 
126 unsigned int PixelGlobalDelay25::getCyclicDelay(unsigned int offset) const{
127  std::string mthn = "[PixelGlobalDelay25::getCyclicDelay()]\t\t\t " ;
128  unsigned int ret=offset+delay_;
129  if (ret > 120) ret-=50;
130  std::cout<< __LINE__ << "]\t" << mthn << "getCyclicDelay("<<offset<<") returns "<<ret<<endl;
131  return ret;
132 }
133 
134 
135 unsigned int PixelGlobalDelay25::getTTCrxDelay(unsigned int offset) const{
136  // Computes the TTCrx delay settting required to compensate for the global Delay25 shift.
137  //
138  // 'offset' is the current register setting in the TTCrx register
139  //
140  // The unit of delay_ is 0.499 ns (Delay25 granularity) that needs to be converted
141  // to the units of the TTCrx delay generator 103.96 ps
142 
143  std::string mthn = "[PixelGlobalDelay25::getTTCrxDelay()]\t\t\t " ;
144  unsigned int K=(offset/16*16+offset%16*15+30)%240;
145  K+=(unsigned int)floor((delay_*0.499)/0.1039583 + 0.5); // add max 235
146 
147 
148  unsigned int ret;
149  if (K>239) {
150  std::cout << __LINE__ << "]\t" << mthn << "the required TTCrx fine delay "<<K<<" is out of range."<<endl;
151  std::cout << __LINE__ << "]\t" << mthn << "this can happen if the register was initialized to 0"<<endl;
152  std::cout << __LINE__ << "]\t" << mthn << "(i.e. delay of 3.1 ns) and the required delay is >21.7 ns."<<endl;
153  std::cout << __LINE__ << "]\t" << mthn << "we will keep the current delay setting..."<<endl;
154  ret=offset;
155  }else{
156  unsigned int n=K%15;
157  unsigned int m=((K/15)-n+14)%16;
158  ret=16*n+m;
159  }
160 
161  std::cout << __LINE__ << "]\t" << mthn << "getTTCrxDelay("<<offset<<") returns "<<ret<<endl;
162  return ret;
163  //return offset;
164 }
165 
166 
168  // Computes the TTCrx delay settting required to compensate for the global Delay25 shift.
169  //
170  // Assumes that the current register setting in the TTCrx is 0 ns (14)
171  //
172  // The unit of delay_ is 0.499 ns (Delay25 granularity) that needs to be converted
173  // to the units of the TTCrx delay generator 103.96 ps
174 
175  return getTTCrxDelay(14);
176 }
177 
178 
179 
181 
182  std::string mthn = "[PixelGlobalDelay25::writeASCII()]\t\t\t " ;
183  if (dir!="") dir+="/";
184  string filename=dir+"globaldelay25.dat";
185 
186  ofstream out(filename.c_str());
187  if(!out.good()){
188  cout << __LINE__ << "]\t" << mthn << "Could not open file:"<<filename<<endl;
189  assert(0);
190  }
191 
192  out << "0x" << hex << delay_ << dec << endl;
193 
194  out.close();
195 }
196 
197 //=============================================================================================
199  int version,
200  std::string path,
201  std::ofstream *outstream,
202  std::ofstream *out1stream,
203  std::ofstream *out2stream) const
204 {
205  std::stringstream s ; s << __LINE__ << "]\t[[PixelGlobalDelay25::writeXMLHeader()]\t\t\t " ;
206  std::string mthn = s.str() ;
207  std::stringstream fullPath ;
208  fullPath << path << "/Pixel_GlobalDelay25_" << PixelTimeFormatter::getmSecTime() << ".xml" ;
209  cout << mthn << "Writing to: " << fullPath.str() << endl ;
210 
211  outstream->open(fullPath.str().c_str()) ;
212 
213  *outstream << "<?xml version='1.0' encoding='UTF-8' standalone='yes'?>" << std::endl ;
214  *outstream << "<ROOT xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>" << std::endl ;
215  *outstream << "" << std::endl ;
216  *outstream << " <!-- " << mthn << "-->" << std::endl ;
217  *outstream << "" << std::endl ;
218  *outstream << " <HEADER>" << std::endl ;
219  *outstream << " <TYPE>" << std::endl ;
220  *outstream << " <EXTENSION_TABLE_NAME>PIXEL_GLOBAL_DELAY25</EXTENSION_TABLE_NAME>" << std::endl ;
221  *outstream << " <NAME>Pixel Global Delay25</NAME>" << std::endl ;
222  *outstream << " </TYPE>" << std::endl ;
223  *outstream << " <RUN>" << std::endl ;
224  *outstream << " <RUN_TYPE>Pixel Global Delay25</RUN_TYPE>" << std::endl ;
225  *outstream << " <RUN_NUMBER>1</RUN_NUMBER>" << std::endl ;
226  *outstream << " <RUN_BEGIN_TIMESTAMP>" << pos::PixelTimeFormatter::getTime() << "</RUN_BEGIN_TIMESTAMP>" << std::endl ;
227  *outstream << " <LOCATION>CERN P5</LOCATION>" << std::endl ;
228  *outstream << " </RUN>" << std::endl ;
229  *outstream << " </HEADER>" << std::endl ;
230  *outstream << "" << std::endl ;
231  *outstream << " <DATA_SET>" << std::endl ;
232  *outstream << " " << std::endl ;
233  *outstream << " <VERSION>" << version << "</VERSION>" << std::endl ;
234  *outstream << " <COMMENT_DESCRIPTION>" << getComment() << "</COMMENT_DESCRIPTION>" << std::endl ;
235  *outstream << " <CREATED_BY_USER>" << getAuthor() << "</CREATED_BY_USER>" << std::endl ;
236  *outstream << " " << std::endl ;
237  *outstream << " <PART>" << std::endl ;
238  *outstream << " <NAME_LABEL>CMS-PIXEL-ROOT</NAME_LABEL>" << std::endl ;
239  *outstream << " <KIND_OF_PART>Detector ROOT</KIND_OF_PART>" << std::endl ;
240  *outstream << " </PART>" << std::endl ;
241 
242 }
243 
244 //=============================================================================================
245 void PixelGlobalDelay25::writeXML( std::ofstream *outstream,
246  std::ofstream *out1stream,
247  std::ofstream *out2stream) const
248 {
249  std::stringstream s ; s << __LINE__ << "]\t[PixelGlobalDelay25::writeXML()]\t\t\t " ;
250  std::string mthn = s.str() ;
251 
252  *outstream << " <DATA>" << std::endl ;
253  *outstream << " <GLOBALDELAY25>0x" << hex << delay_ << dec << "</GLOBALDELAY25>" << std::endl ;
254  *outstream << " </DATA>" << std::endl ;
255  *outstream << " " << std::endl ;
256 }
257 
258 //=============================================================================================
259 void PixelGlobalDelay25::writeXMLTrailer(std::ofstream *outstream,
260  std::ofstream *out1stream,
261  std::ofstream *out2stream) const
262 {
263  std::stringstream s ; s << __LINE__ << "]\t[PixelGlobalDelay25::writeASCII()]\t\t\t " ;
264  std::string mthn = s.str() ;
265 
266  *outstream << " " << std::endl ;
267  *outstream << " </DATA_SET>" << std::endl ;
268  *outstream << "</ROOT> " << std::endl ;
269 
270  outstream->close() ;
271 }
272 
This file contains the base class for "pixel configuration data" management.
unsigned int getCyclicDelay(unsigned int offset=0) const
ins
Definition: cuy.py:312
static std::string getmSecTime(void)
virtual void writeXML(std::ofstream *out, std::ofstream *out1=NULL, std::ofstream *out2=NULL) const
virtual void writeXMLTrailer(std::ofstream *out, std::ofstream *out1=NULL, std::ofstream *out2=NULL) const
static std::string getTime(void)
PixelGlobalDelay25(std::string filename)
std::string getComment() const
This class provides utility methods to manipulate ASCII formatted timestamps.
std::string getAuthor() const
virtual void writeASCII(std::string dir) const
This class implements..
unsigned int getDelay(unsigned int offset=0) const
virtual void writeXMLHeader(pos::PixelConfigKey key, int version, std::string path, std::ofstream *out, std::ofstream *out1=NULL, std::ofstream *out2=NULL) const
dbl *** dir
Definition: mlp_gen.cc:35
unsigned int getTTCrxDelay() const
This class specifies which delay25 channels are delayed over the entire pixel detector and by how muc...