CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
Mille.cc
Go to the documentation of this file.
1 
10 #include "Mille.h"
11 
12 #include <iostream>
13 
14 //___________________________________________________________________________
15 
16 Mille::Mille(const char *outFileName, bool asBinary, bool writeZero) :
17  myOutFile(outFileName, (asBinary ? (std::ios::binary | std::ios::out) : std::ios::out)),
18  myAsBinary(asBinary), myWriteZero(writeZero), myBufferPos(-1), myHasSpecial(false)
19 {
20  // opens outFileName, by default as binary file
21 
22  // Instead myBufferPos(-1), myHasSpecial(false) and the following two lines
23  // we could call newSet() and kill()...
24  myBufferInt[0] = 0;
25  myBufferFloat[0] = 0.;
26 
27  if (!myOutFile.is_open()) {
28  std::cerr << "Mille::Mille: Could not open " << outFileName
29  << " as output file." << std::endl;
30  }
31 }
32 
33 //___________________________________________________________________________
34 
36 {
37  // closes file
38  myOutFile.close();
39 }
40 
41 //___________________________________________________________________________
42 
43 void Mille::mille(int NLC, const float *derLc,
44  int NGL, const float *derGl, const int *label,
45  float rMeas, float sigma)
46 {
47  if (sigma <= 0.) return;
48  if (myBufferPos == -1) this->newSet(); // start, e.g. new track
49  if (!this->checkBufferSize(NLC, NGL)) return;
50 
51  // first store measurement
52  ++myBufferPos;
53  myBufferFloat[myBufferPos] = rMeas;
55 
56  // store local derivatives and local 'lables' 1,...,NLC
57  for (int i = 0; i < NLC; ++i) {
58  if (derLc[i] || myWriteZero) { // by default store only non-zero derivatives
59  ++myBufferPos;
60  myBufferFloat[myBufferPos] = derLc[i]; // local derivatives
61  myBufferInt [myBufferPos] = i+1; // index of local parameter
62  }
63  }
64 
65  // store uncertainty of measurement in between locals and globals
66  ++myBufferPos;
67  myBufferFloat[myBufferPos] = sigma;
69 
70  // store global derivatives and their lables
71  for (int i = 0; i < NGL; ++i) {
72  if (derGl[i] || myWriteZero) { // by default store only non-zero derivatives
73  if ((label[i] > 0 || myWriteZero) && label[i] <= myMaxLabel) { // and for valid labels
74  ++myBufferPos;
75  myBufferFloat[myBufferPos] = derGl[i]; // global derivatives
76  myBufferInt [myBufferPos] = label[i]; // index of global parameter
77  } else {
78  std::cerr << "Mille::mille: Invalid label " << label[i]
79  << " <= 0 or > " << myMaxLabel << std::endl;
80  }
81  }
82  }
83 }
84 
85 //___________________________________________________________________________
86 void Mille::special(int nSpecial, const float *floatings, const int *integers)
87 {
88  if (nSpecial == 0) return;
89  if (myBufferPos == -1) this->newSet(); // start, e.g. new track
90  if (myHasSpecial) {
91  std::cerr << "Mille::special: Special values already stored for this record."
92  << std::endl;
93  return;
94  }
95  if (!this->checkBufferSize(nSpecial, 0)) return;
96  myHasSpecial = true; // after newSet() (Note: MILLSP sets to buffer position...)
97 
98  // myBufferFloat[.] | myBufferInt[.]
99  // ------------------------------------
100  // 0.0 | 0
101  // -float(nSpecial) | 0
102  // The above indicates special data, following are nSpecial floating and nSpecial integer data.
103 
104  ++myBufferPos; // zero pair
106  myBufferInt [myBufferPos] = 0;
107 
108  ++myBufferPos; // nSpecial and zero
109  myBufferFloat[myBufferPos] = -nSpecial; // automatic conversion to float
110  myBufferInt [myBufferPos] = 0;
111 
112  for (int i = 0; i < nSpecial; ++i) {
113  ++myBufferPos;
114  myBufferFloat[myBufferPos] = floatings[i];
115  myBufferInt [myBufferPos] = integers[i];
116  }
117 }
118 
119 //___________________________________________________________________________
120 
122 {
123  // reset buffers, i.e. kill derivatives accumulated for current set
124  myBufferPos = -1;
125 }
126 
127 //___________________________________________________________________________
128 
129 
131  // flush output file
132  myOutFile.flush();
133 }
134 
135 //___________________________________________________________________________
136 
138 {
139  // write set of derivatives with same local parameters to file
140  if (myBufferPos > 0) { // only if anything stored...
141  const int numWordsToWrite = (myBufferPos + 1)*2;
142 
143  if (myAsBinary) {
144  myOutFile.write(reinterpret_cast<const char*>(&numWordsToWrite),
145  sizeof(numWordsToWrite));
146  myOutFile.write(reinterpret_cast<char*>(myBufferFloat),
147  (myBufferPos+1) * sizeof(myBufferFloat[0]));
148  myOutFile.write(reinterpret_cast<char*>(myBufferInt),
149  (myBufferPos+1) * sizeof(myBufferInt[0]));
150  } else {
151  myOutFile << numWordsToWrite << "\n";
152  for (int i = 0; i < myBufferPos+1; ++i) {
153  myOutFile << myBufferFloat[i] << " ";
154  }
155  myOutFile << "\n";
156 
157  for (int i = 0; i < myBufferPos+1; ++i) {
158  myOutFile << myBufferInt[i] << " ";
159  }
160  myOutFile << "\n";
161  }
162  }
163  myBufferPos = -1; // reset buffer for next set of derivatives
164 }
165 
166 //___________________________________________________________________________
167 
169 {
170  // initilise for new set of locals, e.g. new track
171  myBufferPos = 0;
172  myHasSpecial = false;
173  myBufferFloat[0] = 0.0;
174  myBufferInt [0] = 0; // position 0 used as error counter
175 }
176 
177 //___________________________________________________________________________
178 
179 bool Mille::checkBufferSize(int nLocal, int nGlobal)
180 {
181  // enough space for next nLocal + nGlobal derivatives incl. measurement?
182 
183  if (myBufferPos + nLocal + nGlobal + 2 >= myBufferSize) {
184  ++(myBufferInt[0]); // increase error count
185  std::cerr << "Mille::checkBufferSize: Buffer too short ("
186  << myBufferSize << "),"
187  << "\n need space for nLocal (" << nLocal<< ")"
188  << "/nGlobal (" << nGlobal << ") local/global derivatives, "
189  << myBufferPos + 1 << " already stored!"
190  << std::endl;
191  return false;
192  } else {
193  return true;
194  }
195 }
int i
Definition: DBlmapReader.cc:9
void newSet()
Definition: Mille.cc:168
bool myAsBinary
Definition: Mille.h:44
int myBufferInt[myBufferSize]
Definition: Mille.h:48
Mille(const char *outFileName, bool asBinary=true, bool writeZero=false)
Definition: Mille.cc:16
int myBufferPos
Definition: Mille.h:50
std::ofstream myOutFile
Definition: Mille.h:43
void end()
Definition: Mille.cc:137
bool myWriteZero
Definition: Mille.h:45
void mille(int NLC, const float *derLc, int NGL, const float *derGl, const int *label, float rMeas, float sigma)
Definition: Mille.cc:43
void flushOutputFile()
Definition: Mille.cc:130
bool checkBufferSize(int nLocal, int nGlobal)
Definition: Mille.cc:179
float myBufferFloat[myBufferSize]
Definition: Mille.h:49
void kill()
Definition: Mille.cc:121
volatile std::atomic< bool > shutdown_flag false
~Mille()
Definition: Mille.cc:35
void special(int nSpecial, const float *floatings, const int *integers)
Definition: Mille.cc:86
bool myHasSpecial
Definition: Mille.h:51