001 #include "AtlfastAlgs/ElectronMatrixManager.h"
002 #include "PathResolver/PathResolver.h"
003 #include <iostream>
004
005 namespace Atlfast
006 {
007 using std::abs;
008 using std::ifstream;
009
010
011
012
013
014
015
016
017
018
019 ElectronMatrixManager::ElectronMatrixManager( string bremParamFile,
020 string smearParamFile,
021 int randSeed,
022 MsgStream log ) :
023 m_bremParamFile( bremParamFile ),
024 m_smearParamFile( smearParamFile ),
025 m_randSeed( randSeed )
026 {
027 m_log = &log;
028 *m_log << MSG::INFO
029 << "Constructing ElectronMatrixManager with parameter files "
030 << m_bremParamFile
031 << " "
032 << m_smearParamFile
033 << endreq;
034
035 m_smearParamFile = PathResolver::find_file( m_smearParamFile, "DATAPATH" );
036 m_bremMgr = new BremMatrixManager( m_bremParamFile, m_randSeed, *m_log );
037 m_correlatedData = new CorrelatedData( m_randSeed );
038 this->initialise();
039 *m_log << MSG::INFO << "Constructed ElectronMatrixManager" << endreq;
040 }
041
042
043
044
045
046 ElectronMatrixManager::~ElectronMatrixManager()
047 {
048 delete m_bremMgr;
049 delete m_correlatedData;
050 map<BinID, IBinData*>::iterator iter = m_binData.begin();
051 map<BinID, IBinData*>::iterator end = m_binData.end();
052 for ( ; iter != end; ++iter )
053 {
054 delete ( iter->second );
055 }
056 }
057
058
059
060
061 void ElectronMatrixManager::initialise()
062 {
063
064 ifstream input;
065 input.open( m_smearParamFile.c_str() );
066
067 if (input)
068 {
069 *m_log << MSG::INFO << "ElectronMatrixManager: File " << m_smearParamFile << " open." << endreq;
070
071 double pTMin, etaMin, etaMax, rtBoundary;
072
073
074 input >> pTMin;
075 input >> etaMin;
076 input >> etaMax;
077 input >> m_nEtaBins;
078 input >> m_nRTBins;
079
080
081 double etaStep = (etaMax - etaMin) / double(m_nEtaBins);
082 for ( int i = 0; i < m_nEtaBins; i++ )
083 {
084 m_etaBoundaries.push_back( etaMin + etaStep/2. + double(i)*etaStep );
085 }
086
087 for ( int i = 0; i < m_nRTBins + 1; i++ )
088 {
089 input >> rtBoundary;
090 m_rTBoundaries.push_back(rtBoundary);
091 }
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112 int iBin = 0;
113
114 for ( int rt = 0; rt < m_nRTBins; rt++ )
115 {
116
117 vector<double> empty;
118
119 vector< vector<double> > coreC0( m_nEtaBins, empty );
120 vector< vector<double> > coreC1( m_nEtaBins, empty );
121 vector< vector<double> > coreC2( m_nEtaBins, empty );
122 vector< vector<double> > coreC3( m_nEtaBins, empty );
123 vector< vector<double> > coreC4( m_nEtaBins, empty );
124
125 vector< vector<double> > tailsC0( m_nEtaBins, empty );
126 vector< vector<double> > tailsC1( m_nEtaBins, empty );
127 vector< vector<double> > tailsC2( m_nEtaBins, empty );
128 vector< vector<double> > tailsC3( m_nEtaBins, empty );
129 vector< vector<double> > tailsC4( m_nEtaBins, empty );
130
131 vector< vector<double> > fractionsC0( m_nEtaBins, empty );
132 vector< vector<double> > fractionsC1( m_nEtaBins, empty );
133 vector< vector<double> > fractionsC2( m_nEtaBins, empty );
134 vector< vector<double> > fractionsC3( m_nEtaBins, empty );
135 vector< vector<double> > fractionsC4( m_nEtaBins, empty );
136
137 vector< vector<double> > correlationsC0( m_nEtaBins, empty );
138 vector< vector<double> > correlationsC1( m_nEtaBins, empty );
139 vector< vector<double> > correlationsC2( m_nEtaBins, empty );
140 vector< vector<double> > correlationsC3( m_nEtaBins, empty );
141 vector< vector<double> > correlationsC4( m_nEtaBins, empty );
142
143
144
145
146 fillVector( input, coreC0, 5 );
147 fillVector( input, coreC1, 5 );
148 fillVector( input, coreC2, 5 );
149 fillVector( input, coreC3, 5 );
150 fillVector( input, coreC4, 5 );
151
152
153 fillVector( input, tailsC0, 5 );
154 fillVector( input, tailsC1, 5 );
155 fillVector( input, tailsC2, 5 );
156 fillVector( input, tailsC3, 5 );
157 fillVector( input, tailsC4, 5 );
158
159
160 fillVector( input, fractionsC0, 5 );
161 fillVector( input, fractionsC1, 5 );
162 fillVector( input, fractionsC2, 5 );
163 fillVector( input, fractionsC3, 5 );
164 fillVector( input, fractionsC4, 5 );
165
166
167 fillVector( input, correlationsC0, 4 );
168 fillVector( input, correlationsC1, 4 );
169 fillVector( input, correlationsC2, 4 );
170 fillVector( input, correlationsC3, 4 );
171 fillVector( input, correlationsC4, 4 );
172
173
174
175
176 for ( int i = 0; i < m_nEtaBins - 1; ++i )
177 {
178 double etaLow = m_etaBoundaries[i];
179 double etaHigh = m_etaBoundaries[i+1];
180
181
182 BinID rTEtaBin( iBin, m_rTBoundaries[rt], m_rTBoundaries[rt+1], etaLow, etaHigh );
183
184
185 vector<ParameterResolutions*> core;
186 vector<ParameterResolutions*> tails;
187 vector<ParameterResolutions*> fractions;
188 vector<ParameterResolutions*> correlations;
189 for ( int param = 0; param < 5; param++ )
190 {
191 vector<BinID> coreCoeffBins;
192 coreCoeffBins.push_back( BinID( 0, coreC0[i][param], coreC0[i+1][param] ) );
193 coreCoeffBins.push_back( BinID( 0, coreC1[i][param], coreC1[i+1][param] ) );
194 coreCoeffBins.push_back( BinID( 0, coreC2[i][param], coreC2[i+1][param] ) );
195 coreCoeffBins.push_back( BinID( 0, coreC3[i][param], coreC3[i+1][param] ) );
196 coreCoeffBins.push_back( BinID( 0, coreC4[i][param], coreC4[i+1][param] ) );
197 core.push_back( new ParameterResolutions( coreCoeffBins, etaLow, etaHigh ) );
198
199 vector<BinID> tailsCoeffBins;
200 tailsCoeffBins.push_back( BinID( 0, tailsC0[i][param], tailsC0[i+1][param] ) );
201 tailsCoeffBins.push_back( BinID( 0, tailsC1[i][param], tailsC1[i+1][param] ) );
202 tailsCoeffBins.push_back( BinID( 0, tailsC2[i][param], tailsC2[i+1][param] ) );
203 tailsCoeffBins.push_back( BinID( 0, tailsC3[i][param], tailsC3[i+1][param] ) );
204 tailsCoeffBins.push_back( BinID( 0, tailsC4[i][param], tailsC4[i+1][param] ) );
205 tails.push_back( new ParameterResolutions( tailsCoeffBins, etaLow, etaHigh ) );
206
207 vector<BinID> fractionsCoeffBins;
208 fractionsCoeffBins.push_back( BinID( 0, fractionsC0[i][param], fractionsC0[i+1][param] ) );
209 fractionsCoeffBins.push_back( BinID( 0, fractionsC1[i][param], fractionsC1[i+1][param] ) );
210 fractionsCoeffBins.push_back( BinID( 0, fractionsC2[i][param], fractionsC2[i+1][param] ) );
211 fractionsCoeffBins.push_back( BinID( 0, fractionsC3[i][param], fractionsC3[i+1][param] ) );
212 fractionsCoeffBins.push_back( BinID( 0, fractionsC4[i][param], fractionsC4[i+1][param] ) );
213 fractions.push_back( new ParameterResolutions( fractionsCoeffBins, etaLow, etaHigh ) );
214 }
215
216 for ( int param = 0; param < 4; param++ )
217 {
218 vector<BinID> correlationsCoeffBins;
219 correlationsCoeffBins.push_back( BinID( 0, correlationsC0[i][param], correlationsC0[i+1][param] ) );
220 correlationsCoeffBins.push_back( BinID( 0, correlationsC1[i][param], correlationsC1[i+1][param] ) );
221 correlationsCoeffBins.push_back( BinID( 0, correlationsC2[i][param], correlationsC2[i+1][param] ) );
222 correlationsCoeffBins.push_back( BinID( 0, correlationsC3[i][param], correlationsC3[i+1][param] ) );
223 correlationsCoeffBins.push_back( BinID( 0, correlationsC4[i][param], correlationsC4[i+1][param] ) );
224 correlations.push_back( new ParameterResolutions( correlationsCoeffBins, etaLow, etaHigh ) );
225 }
226
227
228
229 ElectronBinData* binData = new ElectronBinData( rTEtaBin, core, tails, fractions, correlations, m_randSeed );
230
231
232 m_binData[rTEtaBin] = binData;
233
234
235 iBin++;
236
237 }
238 }
239
240
241 input.close();
242
243 }
244 else
245 {
246 *m_log << MSG::INFO
247 << "ElectronMatrixManager: no data file ( " << m_smearParamFile << " )!!!!"
248 << endreq;
249 }
250
251 makeHeader();
252
253 }
254
255 void ElectronMatrixManager::makeHeader()
256 {
257 HeaderPrinter hp( "Atlfast ElectronTrack Smearer:", *m_log );
258 hp.add( "Total number of Bins ", m_nRTBins * m_nEtaBins );
259 hp.add( "rT Bin Min ", m_rTBoundaries.front() );
260 hp.add( "rT Bin Max ", m_rTBoundaries.back() );
261 hp.add( "Number of rT Bins ", m_nRTBins );
262 hp.add( "Eta Bin Min ", m_etaBoundaries.front() );
263 hp.add( "Eta Bin Max ", m_etaBoundaries.back() );
264 hp.add( "Number of Eta Bins ", m_nEtaBins );
265 hp.print();
266 }
267
268
269
270
271
272 void ElectronMatrixManager::fillVector( ifstream& input,
273 vector< vector<double> >& myVector,
274 int M = 5 )
275 {
276 double res;
277 for ( int param = 0; param < M; param++ )
278 {
279 vector< vector<double> >::iterator binIter = myVector.begin();
280 for ( ; binIter != myVector.end(); binIter++ )
281 {
282 input >> res;
283 binIter->push_back(res);
284 }
285
286 }
287 }
288
289
290
291
292
293
294 vector<double> ElectronMatrixManager::getVariables( const TrackTrajectory& track,
295 HepSymMatrix& returnSigma ) const
296 {
297 HepSymMatrix sigma;
298 vector<double> variables;
299
300
301 TrackTrajectory bremTrack = m_bremMgr->getBremTrack(track);
302 TrackParameters bremTrkParam = bremTrack.parameters();
303
304
305 IBinData* binData = getBinData(track);
306 sigma = binData->getMatrix(track);
307
308
309 variables = m_correlatedData->generate( m_correlatedData->root(sigma) );
310
311
312 variables[0] += bremTrkParam.impactParameter();
313 variables[2] += bremTrkParam.phi();
314 variables[4] += bremTrkParam.invPtCharge();
315
316
317
318 sigma(1,3) = sigma(1,3) / std::sqrt( sigma(1,1) * sigma(3,3) )
319 * std::abs( variables[0] * variables[2] );
320
321 sigma(1,5) = sigma(1,5) / std::sqrt( sigma(1,1) * sigma(5,5) )
322 * std::abs( variables[0] * variables[4] ) ;
323
324 sigma(3,5) = sigma(3,5) / std::sqrt( sigma(3,3) * sigma(5,5) )
325 * std::abs( variables[2] * variables[4] ) ;
326 sigma(3,1) = sigma(1,3);
327 sigma(5,1) = sigma(1,5);
328 sigma(5,3) = sigma(3,5);
329 sigma(1,1) = std::pow( variables[0], 2 );
330 sigma(3,3) = std::pow( variables[2], 2 );
331 sigma(5,5) = std::pow( variables[4], 2 );
332
333 returnSigma = sigma;
334 return variables;
335 }
336
337
338
339
340
341
342 IBinData* ElectronMatrixManager::getBinData( const TrackTrajectory& traj ) const
343 {
344 TrackParameters track = traj.parameters();
345
346 vector<double> rTEta;
347 double rT = abs( traj.radius() );
348 double eta = abs( track.eta() );
349
350
351 double rTLow = ( (m_binData.begin())->first ).low(0);
352 double rTHigh = ( (m_binData.rbegin())->first ).high(0);
353 double etaLow = ( (m_binData.begin())->first ).low(1);
354 double etaHigh = ( (m_binData.rbegin())->first ).high(1);
355
356 if ( rT < rTLow ) rT = rTLow;
357 if ( rT > rTHigh ) rT = rTHigh;
358 if ( eta < etaLow ) eta = etaLow;
359 if ( eta > etaHigh ) eta = etaHigh;
360
361
362 rTEta.push_back(rT);
363 rTEta.push_back(eta);
364
365 map<BinID, IBinData*>::const_iterator binIter = m_binData.begin();
366 map<BinID, IBinData*>::const_iterator binEnd = m_binData.end();
367
368 for ( ; binIter != binEnd; ++binIter )
369 {
370 if ( binIter->first.isInBin(rTEta) )
371 {
372 return binIter->second;
373 }
374 }
375
376 *m_log << MSG::WARNING
377 << "WARNING: ElectronMatrixManager - No bin; rT " << rT << ", eta " << eta
378 << endreq;
379
380 return ( m_binData.begin() )->second;
381 }
382
383
384 }
385
| Due to the LXR bug, the updates fail sometimes to remove references to deleted files. The Saturday's full rebuilds fix these problems |
|
This page was automatically generated by the
LXR engine.
|
|