]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - ITS/AliITSDCSAnalyzerSDD.cxx
PWGPP-69 - initialize additional dEdx information diring tracking itteration 0 -...
[u/mrichter/AliRoot.git] / ITS / AliITSDCSAnalyzerSDD.cxx
... / ...
CommitLineData
1/**************************************************************************
2 * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16/* $Id$ */
17
18///////////////////////////////////////////////////////////////////
19// Implementation of the class for SDD DCS data analysis //
20// Origin: F.Prino, Torino, prino@to.infn.it //
21// V.Pospisil, CTU Prague, gdermog@seznam.cz //
22///////////////////////////////////////////////////////////////////
23
24
25#include "AliITSDCSAnalyzerSDD.h"
26#include "AliDCSValue.h"
27#include "AliLog.h"
28#include "AliITSgeomTGeo.h"
29
30ClassImp(AliITSDCSAnalyzerSDD)
31
32//---------------------------------------------------------------
33 AliITSDCSAnalyzerSDD::AliITSDCSAnalyzerSDD(): TObject(),
34fHVDelay(0),fMVDelay(0),fTLDelay(0),fTRDelay(0),fStTLDelay(0),fStTRDelay(0),fOKDelay(0),
35fHVThresholdFrac(0), fMVThresholdFrac(0), fTLThresholdFrac(0), fTRThresholdFrac(0)
36{
37// Default constructor
38 Init();
39 SetHVThreshold();
40 SetMVThreshold();
41 SetTLThreshold();
42 SetTRThreshold();
43 for( Int_t moduleLoop = 0; moduleLoop < kNmodules; moduleLoop++ ) fDCSData[moduleLoop] = NULL;
44} /*AliITSDCSAnalyzerSDD::AliITSDCSAnalyzerSDD*/
45
46//---------------------------------------------------------------
47
48AliITSDCSAnalyzerSDD::AliITSDCSAnalyzerSDD(const AliITSDCSAnalyzerSDD& /* dcsa */): TObject(),
49fHVDelay(0),fMVDelay(0),fTLDelay(0),fTRDelay(0),fStTLDelay(0),fStTRDelay(0),fOKDelay(0),
50fHVThresholdFrac(0), fMVThresholdFrac(0), fTLThresholdFrac(0), fTRThresholdFrac(0)
51{
52// Copy constructor
53// Copies are not allowed. The method is protected to avoid misuse.
54 AliError("Copy constructor not allowed");
55} /*AliITSDCSAnalyzerSDD::AliITSDCSAnalyzerSDD*/
56
57//---------------------------------------------------------------
58
59AliITSDCSAnalyzerSDD& AliITSDCSAnalyzerSDD::operator=(const AliITSDCSAnalyzerSDD& /* dcsa */)
60{
61// Assigment operator
62// Assignment is not allowed. The method is protected to avoid misuse.
63 AliError("Assignment operator not allowed");
64 return *this;
65}/*AliITSDCSAnalyzerSDD::operator=*/
66
67//---------------------------------------------------------------
68
69AliITSDCSAnalyzerSDD::~AliITSDCSAnalyzerSDD()
70{
71// Destructor
72 for(int j=0; j<kNmodules; j++)
73 {
74 if( fDCSData[j] ) delete fDCSData[j];
75 } /*for( j )*/
76} /*AliITSDCSAnalyzerSDD::~AliITSDCSAnalyzerSDD*/
77
78//---------------------------------------------------------------
79
80void AliITSDCSAnalyzerSDD::AnalyzeData(TMap* dcsMap)
81{
82// Data processing. Takes DCS points from alias map and sorts them into AliITSDCSDataSDD objects.
83
84 Int_t counter = 0; // Counter of stored DCS records
85
86 Float_t lastTLValUpper;
87 Float_t lastTLValLower;
88 Float_t lastTRValUpper;
89 Float_t lastTRValLower;
90 Float_t lastHVValUpper;
91 Float_t lastHVValLower;
92 Float_t lastMVValUpper;
93 Float_t lastMVValLower;
94 // Thresholds for float DCS variables
95
96 Int_t nEntries=0; // Number of entries in each TObjArray, that contains DCS variable values
97 AliDCSValue *valToProcess;
98 // Pointer to currently processed DCS variable value
99 Float_t valToProcessFloat;
100 // Value of currently processed DCS variable
101
102
103 for( Int_t iLay = 3; iLay < 5; iLay++ )
104 {
105
106 Int_t maxLad = ( iLay == 3) ? kNladders3 : kNladders4;
107 Int_t maxMod = ( iLay == 3) ? kNmodLad3 : kNmodLad4;
108
109 for(Int_t iLad = 0; iLad < maxLad; iLad++)
110 {
111 for(Int_t iMod = 0; iMod < maxMod; iMod++)
112 {
113 // Loads arrays of DCS variables from map. Variables are
114 // searched by names (for ex. SDD_LAYER3_LADDER5_MODULE4_HV)
115
116 Int_t moduleLoop = AliITSgeomTGeo::GetModuleIndex( iLay, iLad + 1, iMod + 1 ) - 240;
117
118 fDCSData[moduleLoop] = new AliITSDCSDataSDD();
119 // DCS data for specific SDD module will be stored in this class
120
121 TObjArray* arrHV = (TObjArray*) dcsMap->GetValue( fHVDPNames[moduleLoop].Data() );
122 if(!arrHV) AliWarning( Form("DCS HV alias %s not found!\n", fHVDPNames[moduleLoop].Data()) );
123
124 TObjArray* arrMV = (TObjArray*) dcsMap->GetValue( fMVDPNames[moduleLoop].Data() );
125 if(!arrMV) AliWarning( Form("DCS MV alias %s not found!\n", fMVDPNames[moduleLoop].Data()));
126
127 TObjArray* arrOK = (TObjArray*) dcsMap->GetValue( fOKDPNames[moduleLoop].Data() );
128 if(!arrOK) AliWarning( Form("DCS MOD_OK alias %s not found!\n", fOKDPNames[moduleLoop].Data()));
129
130 TObjArray* arrTL = (TObjArray*) dcsMap->GetValue( fTLDPNames[moduleLoop].Data() );
131 if(!arrTL) AliWarning( Form("DCS TEMP_L alias %s not found!\n", fTLDPNames[moduleLoop].Data()));
132
133 TObjArray* arrTR = (TObjArray*) dcsMap->GetValue( fTRDPNames[moduleLoop].Data() );
134 if(!arrTR) AliWarning( Form("DCS TEMP_R alias %s not found!\n", fTRDPNames[moduleLoop].Data()));
135
136 TObjArray* arrStTL = (TObjArray*) dcsMap->GetValue( fTLStDPNames[moduleLoop].Data() );
137 if(!arrStTL) AliWarning( Form("DCS TEMP_L_STATE alias %s not found!\n", fTLStDPNames[moduleLoop].Data()));
138
139 TObjArray* arrStTR = (TObjArray*) dcsMap->GetValue( fTRStDPNames[moduleLoop].Data() );
140 if(!arrStTR) AliWarning( Form("DCS TEMP_R_STATE alias %s not found!\n", fTRStDPNames[moduleLoop].Data()));
141
142 lastTLValUpper = -1e-10;
143 lastTLValLower = +1e+10;
144 lastTRValUpper = -1e-10;
145 lastTRValLower = +1e+10;
146 lastHVValUpper = -1e-10;
147 lastHVValLower = +1e+10;
148 lastMVValUpper = -1e-10;
149 lastMVValLower = +1e+10;
150 // First value of any DCS variable must be written
151
152
153 if( arrTL )
154 {
155 nEntries = arrTL->GetEntries();
156 fDCSData[moduleLoop]->SetNPointsTempLeft( nEntries );
157 // Left temperature array size is set
158
159 for( Int_t tlLoop = 0; tlLoop < nEntries; tlLoop++ )
160 { // Left temerature values are copied into the AliITSDCSDataSDD TempLeft array
161 valToProcess = (AliDCSValue *)(arrTL->At(tlLoop));
162 valToProcessFloat = valToProcess->GetFloat();
163 // Value is readed from the input array
164
165 if( lastTLValLower <= valToProcessFloat && valToProcessFloat <= lastTLValUpper ) continue;
166 // Value did not cross the treshold (upper neither lower),
167 // it is not necessary to store it.
168 fDCSData[moduleLoop]->SetValueTempLeft( valToProcess->GetTimeStamp() - fTLDelay, valToProcessFloat );
169 // Value is stored
170 lastTLValLower = valToProcessFloat * ( 1.0 - fTLThresholdFrac );
171 lastTLValUpper = valToProcessFloat * ( 1.0 + fTLThresholdFrac );
172 // New tresholds are set
173 counter ++;
174 } /*for( tlLoop )*/
175 } /*if*/
176
177
178 if( arrTR )
179 {
180 nEntries = arrTR->GetEntries();
181 fDCSData[moduleLoop]->SetNPointsTempRight( nEntries );
182 // Right temperature array size is set
183
184 for( Int_t trLoop = 0; trLoop < nEntries; trLoop++ )
185 { // Right temerature values are copied into the AliITSDCSDataSDD TempRight array
186 valToProcess = (AliDCSValue *)(arrTR->At(trLoop));
187 valToProcessFloat = valToProcess->GetFloat();
188 // Value is readed from the input array
189
190 if( lastTRValLower <= valToProcessFloat && valToProcessFloat <= lastTRValUpper ) continue;
191 // Value did not cross the treshold (upper neither lower),
192 // it is not necessary to store it.
193 fDCSData[moduleLoop]->SetValueTempRight( valToProcess->GetTimeStamp() - fTRDelay, valToProcessFloat );
194 // Value is stored
195 lastTRValLower = valToProcessFloat * ( 1.0 - fTRThresholdFrac );
196 lastTRValUpper = valToProcessFloat * ( 1.0 + fTRThresholdFrac );
197 // New tresholds are set
198 counter ++;
199 } /*for( trLoop )*/
200 } /*if*/
201
202
203 if( arrHV )
204 {
205 nEntries = arrHV->GetEntries();
206 fDCSData[moduleLoop]->SetNPointsHV( nEntries );
207 // HV array size is set
208
209 for( Int_t hvLoop = 0; hvLoop < nEntries; hvLoop++ )
210 { // HV values are copied into the AliITSDCSDataSDD HV array
211 valToProcess = (AliDCSValue *)(arrHV->At(hvLoop));
212 valToProcessFloat = valToProcess->GetFloat();
213 // Value is readed from the input array
214 if( lastHVValLower <= valToProcessFloat && valToProcessFloat <= lastHVValUpper ) continue;
215 // Value did not cross the treshold (upper neither lower),
216 // it is not necessary to store it.
217 fDCSData[moduleLoop]->SetValueHV( valToProcess->GetTimeStamp() - fHVDelay, valToProcessFloat );
218 // Value is stored
219 lastHVValLower = valToProcessFloat * ( 1.0 - fHVThresholdFrac );
220 lastHVValUpper = valToProcessFloat * ( 1.0 + fHVThresholdFrac );
221 // New tresholds are set
222 counter ++;
223 } /*for( hvLoop )*/
224
225 } /*if*/
226
227
228
229 if( arrMV )
230 {
231 nEntries = arrMV->GetEntries();
232 fDCSData[moduleLoop]->SetNPointsMV( nEntries );
233 // MV array size is set
234
235 for( Int_t mvLoop = 0; mvLoop < nEntries; mvLoop++ )
236 { // MV values are copied into the AliITSDCSDataSDD MV array
237 valToProcess = (AliDCSValue *)(arrMV->At(mvLoop));
238 valToProcessFloat = valToProcess->GetFloat();
239 // Value is readed from the input array
240 if( lastMVValLower <= valToProcessFloat && valToProcessFloat <= lastMVValUpper ) continue;
241 // Value did not cross the treshold (upper neither lower),
242 // it is not necessary to store it.
243 fDCSData[moduleLoop]->SetValueMV( valToProcess->GetTimeStamp() - fMVDelay, valToProcessFloat );
244 // Value is stored
245 lastMVValLower = valToProcessFloat * ( 1.0 - fMVThresholdFrac );
246 lastMVValUpper = valToProcessFloat * ( 1.0 + fMVThresholdFrac );
247 // New treshold is ser
248 counter ++;
249 } /*for( mvLoop )*/
250
251 } /*if*/
252
253
254/* Following part of the code is responsibile for the condensing of all status information given by DCS
255 into one array of Char_t. Each record of this array is in principle a bit map :
256
257 0. bit ... _OK
258 1. bit ... _TEMP_L_STATE
259 2. bit ... _TEMP_R_STATE
260
261 Each record have its own time stamp. Because there are three inputs with independent time stamp,
262 some algorithm which assigns new time stamp to bitmap according to three input time stamps is
263 necessary.
264
265 Let's vizualize time stamps of the three input arrays. There is time on x-axis :
266
267 +------------+---------------------+------
268 | | | _OK
269 +-----++------+----+--------+------------+------
270 | | | | | _TEMP_L_STATE
271 +--+------+---+--+-------+-----+--------+---+------
272 | | | | | | _TEMP_R_STATE
273 +-------------+----------+-----+--------+---+------
274
275 | | | | | | | | | | |
276 V V V V V V V V V V V
277
278 +---+----+-+--+---+---+--+-----+--------+---+------
279 | | | | | | | | | | | Status bitmap
280 +---+----+-+--+---+---+--+-----+--------+---+------
281
282
283 Principle of combining three status records into one is visible from the picture.
284 If there are two sequent records with the same status bitmap, they are joined into
285 one (with the time stamp of the earliest one).
286
287*/
288 Int_t nStTLEntries = 0;
289 Int_t nStTREntries = 0;
290 Int_t nOKEntries = 0;
291
292 bool arrStTLcreated = false;
293 bool arrStTRcreated = false;
294 bool arrOKcreated = false;
295
296 if( arrStTL )
297 nStTLEntries = arrStTL->GetEntries();
298 else
299 { arrStTL = new TObjArray; arrStTLcreated = true; }
300
301 if( arrStTR )
302 nStTREntries = arrStTR->GetEntries();
303 else
304 { arrStTR = new TObjArray; arrStTRcreated = true; }
305
306 if( arrOK )
307 nOKEntries = arrOK->GetEntries();
308 else
309 { arrOK = new TObjArray; arrOKcreated = true; }
310 // Gets number of _STAT_L, _STAT_R and _OK values stored in dcsMap. If any array does
311 // not exist, it must be created (and it will be filled by 0 status later)
312
313 if( nStTLEntries < 1 )
314 { // TObjArray arrStTL is empty. This would cause segmentation violation during
315 // the condensing, so this case must be handled before algorithm starts
316 AliWarning( Form( "%s contains no data!\n", fTLStDPNames[moduleLoop].Data() ) );
317 nStTLEntries = 1;
318 arrStTL->Add( new AliDCSValue( (Int_t)0, 0x7FFFFFFF ) );
319 // 0x7FFFFFFF = 2147483647, maximal signed Int_t number. Left temperature
320 // sensor will be regarded as switched-off during whole run.
321 } /*if*/
322
323 if( nStTREntries < 1 )
324 { // TObjArray arrStTR is empty. This would cause segmentation violation during
325 // the condensing, so this case must be handled before algorithm starts
326 AliWarning( Form( "%s contains no data!\n", fTRStDPNames[moduleLoop].Data() ) );
327 nStTREntries = 1;
328 arrStTR->Add( new AliDCSValue( (Int_t)0, 0x7FFFFFFF ) );
329 // 0x7FFFFFFF = 2147483647, maximal signed Int_t number. Right temperature
330 // sensor will be regarded as switched-off during whole run.
331 } /*if*/
332
333 if( nOKEntries < 1 )
334 { // TObjArray arrOK is empty. This would cause segmentation violation during
335 // the condensing, so this case must be handled before algorithm starts
336 AliWarning( Form( "%s contains no data!\n", fOKDPNames[moduleLoop].Data() ) );
337 nOKEntries = 1;
338 arrOK->Add( new AliDCSValue( (Bool_t)0, 0x7FFFFFFF ) );
339 // 0x7FFFFFFF = 2147483647, maximal signed Int_t number.
340 // Module will be regarded as switched-off during whole run.
341 } /*if*/
342
343 arrStTL->Sort();
344 arrStTR->Sort();
345 arrOK->Sort();
346 // Condensing would work properly only in the case that
347 // the input arrays are sorted by time
348
349 Int_t nEntriesMax = nStTLEntries + nStTREntries + nOKEntries;
350 fDCSData[moduleLoop]->SetNPointsStatus( nEntriesMax );
351 // Determines necessary length of new array and sets its size
352 // Lot of space in such defined array will be probably
353 // vacant after the analysis, but this will be corrected
354 // by Compress() method
355
356 Int_t idxStTL = 0;
357 Int_t idxStTR = 0;
358 Int_t idxOK = 0;
359 // Input arrays indexes
360
361 Int_t tsStTL, tsStTR, tsOK;
362 // Time stamps ofinput arrays
363 Int_t tsNew;// New time stamp (output array)
364
365 Char_t bitStatus;
366 // New status record :
367 // 0. bit ... _OK
368 // 1. bit ... _TEMP_L_STATE
369 // 2. bit ... _TEMP_R_STATE
370 Char_t lastBitStatus = 100;
371
372 AliDCSValue *valStTL, *valStTR, *valOK;
373 // Pointers to input arrays records (input arrays are TObjArrays
374 // containing objects of type AliDCSValue
375
376 tsStTR = ( (AliDCSValue *)arrStTR->At(0) )->GetTimeStamp() - fStTLDelay;
377 tsStTL = ( (AliDCSValue *)arrStTL->At(0) )->GetTimeStamp() - fStTRDelay;
378 tsOK = ( (AliDCSValue *)arrOK->At(0) )->GetTimeStamp() - fOKDelay;
379 // Time stamps of first records in input filea are readed (and delays are substracted)
380
381 tsNew = (tsStTR < tsStTL) ? tsStTR : tsStTL;
382 if( tsNew > tsOK ) tsNew = tsOK;
383 // Time intervals are "prolonged" to the very eaarliest of time stamps.
384 // It means that first output time stamp will be the same as the one
385 // which is first in input arrays. Values of other DCS variables are
386 // not defined in this time yet, but they will be treated as equal to
387 // values in first records of input arrays.
388
389 nStTLEntries--; nStTREntries--; nOKEntries--;
390 // Indexes in the input array must not exceed last records.
391
392 while( (idxStTL < nStTLEntries) || (idxStTR < nStTREntries) || (idxOK < nOKEntries) )
393 { // Loop goes throug all three input files
394
395 valStTL = (AliDCSValue *)( arrStTL->At(idxStTL) );
396 valStTR = (AliDCSValue *)( arrStTR->At(idxStTR) );
397 valOK = (AliDCSValue *)( arrOK->At(idxOK) );
398 // Values are readed from input arrays
399
400 bitStatus = 0;
401 if( valOK->GetBool() ) bitStatus += 1; // 0. bit - _OK
402 if( valStTL->GetInt() == 4 ) bitStatus += 2; // 1. bit - _TEMP_L_STATE
403 if( valStTR->GetInt() == 4 ) bitStatus += 4; // 2. bit - _TEMP_R_STATE
404 // Bit map is created. *TEMP_*_STATE == 4 means "Thermometer is OK"
405
406 if( lastBitStatus != bitStatus )
407 { // If the status bitmap is the same as last one, it would not be stored.
408 // It will save much space.
409 fDCSData[moduleLoop]->SetValueStatus( tsNew, bitStatus );
410 // Bit map is written into the output array (if different from last value )
411 lastBitStatus = bitStatus;
412 counter += nEntries;
413 } /*if*/
414
415 if( idxStTL == nStTLEntries )
416 tsStTL = 0x7FFFFFFF; // = 2147483647, maximal signed Int_t number
417 else
418 tsStTL = ( (AliDCSValue *)arrStTL->At(idxStTL + 1) )->GetTimeStamp() - fStTLDelay;
419
420 if( idxStTR == nStTREntries )
421 tsStTR = 0x7FFFFFFF; // = 2147483647, maximal signed Int_t number
422 else
423 tsStTR = ( (AliDCSValue *)arrStTR->At(idxStTR + 1) )->GetTimeStamp() - fStTRDelay;
424
425 if( idxOK == nOKEntries )
426 tsOK = 0x7FFFFFFF; // = 2147483647, maximal signed Int_t number
427 else
428 tsOK = ( (AliDCSValue *)arrOK->At(idxOK + 1) )->GetTimeStamp() - fOKDelay;
429 // Reads time stamps of folowing records in the input arrays (and substracts delays).
430 // Validity of the last records in the input arrays are prolonged
431 // to "infinity"
432
433 if( tsStTL == tsOK && tsStTR == tsOK ) { tsNew = tsStTL; idxStTL++; idxStTR++; idxOK++; continue; }
434 if( tsStTL == tsStTR && tsStTR < tsOK ) { tsNew = tsStTL; idxStTL++; idxStTR++; continue; }
435 if( tsStTL == tsOK && tsOK < tsStTR ) { tsNew = tsStTL; idxStTL++; idxOK++; continue; }
436 if( tsStTR == tsOK && tsOK < tsStTL ) { tsNew = tsStTR; idxStTR++; idxOK++; continue; }
437 if( tsOK < tsStTL && tsOK < tsStTR ) { tsNew = tsOK; idxOK++; continue; }
438 if( tsStTL < tsOK && tsStTL < tsStTR ) { tsNew = tsStTL; idxStTL++; continue; }
439 /*Last possibile case*/ { tsNew = tsStTR; idxStTR++; }
440
441 // Index of array, whose following record have time stamp closest to just written one,
442 // is increased. If there are more records with identical time stamps meeting this condition,
443 // all correspondent indexes are increased.
444
445 } /*while*/
446
447 fDCSData[moduleLoop]->Compress();
448 // Size taken by data in AliITSDCSDataSDD object is minimalized
449
450 if( arrStTRcreated ) delete arrStTR;
451 if( arrStTLcreated ) delete arrStTL;
452 if( arrOKcreated ) delete arrOK;
453
454 } /*for( iMod )*/
455 } /*for( iLad )*/
456 } /*for( iLay )*/
457
458
459} /*AliITSDCSAnalyzerSDD::AnalyzeData*/
460
461
462//---------------------------------------------------------------
463
464
465void AliITSDCSAnalyzerSDD::Init()
466{
467// Initialization of DCS DP names
468 TString modName;
469
470 for( Int_t iLay = 3; iLay < 5; iLay++ ){
471 Int_t maxLad = ( iLay == 3) ? kNladders3 : kNladders4;
472 Int_t maxMod = ( iLay == 3) ? kNmodLad3 : kNmodLad4;
473
474 for(Int_t iLad=0; iLad<maxLad; iLad++){
475 for(Int_t iMod=0; iMod<maxMod;iMod++){
476 modName.Form("SDD_LAYER%i_LADDER%02d_MODULE%d", iLay, iLad, iMod);
477 Int_t id = AliITSgeomTGeo::GetModuleIndex( iLay, iLad + 1, iMod + 1 ) - 240;
478
479 fHVDPNames[id].Form("%s_HV",modName.Data());
480 fMVDPNames[id].Form("%s_MV",modName.Data());
481 fOKDPNames[id].Form("%s_OK",modName.Data());
482 fTLDPNames[id].Form("%s_TEMP_L",modName.Data());
483 fTRDPNames[id].Form("%s_TEMP_R",modName.Data());
484 fTLStDPNames[id].Form("%s_TEMP_L_STATE",modName.Data());
485 fTRStDPNames[id].Form("%s_TEMP_R_STATE",modName.Data());
486
487 } /*for( iMod )*/
488 } /*for( iLad )*/
489
490 } /*for( iLay )*/
491
492
493} /*AliITSDCSAnalyzerSDD::Init*/
494
495//---------------------------------------------------------------
496void AliITSDCSAnalyzerSDD::PrintDCSDPNames( FILE *output )
497{
498// Prints constructed names of DCS variables into specified file (may be even stdout or stderr)
499 for( Int_t j = 0; j < kNmodules; j++ )
500 {
501 fprintf( output, "Module %d %s %s %s %s\n",j,fHVDPNames[j].Data(),
502 fMVDPNames[j].Data(),fTLDPNames[j].Data(),fTRDPNames[j].Data());
503 } /*for( j )*/
504} /*AliITSDCSAnalyzerSDD::PrintDCSDPNames*/
505
506//---------------------------------------------------------------
507
508void AliITSDCSAnalyzerSDD::Export( char *outputDCSFileName )
509{
510// Exports all stored AliITSDCSDataSDD type object into specified root file. Objects are named as
511//
512// DCSDataSDD_module<number>
513//
514// where <number> is in range 0..256 and it is obtained by calling
515//
516// AliITSgeomTGeo::GetModuleIndex( layer, ladder, moduleInLadder ) - 240
517
518 TFile * newFile = new TFile( outputDCSFileName, "RECREATE" );
519 if( newFile == NULL )
520 { // Creates .root file with specified name. if it is not possible,
521 // warning is displayed and exporting aborted.
522 AliWarning( Form( "Cannot create %s - export aborted ", outputDCSFileName ) );
523 return;
524 } /*if*/
525
526 newFile->cd();
527
528 char buffer[100];
529
530 for( Int_t moduleLoop = 0; moduleLoop < kNmodules; moduleLoop++ )
531 { // loops through all modules and writes appropriate object into the file
532 snprintf( buffer, 99 , "DCSDataSDD_module%i", moduleLoop );
533 if( fDCSData[moduleLoop] ) fDCSData[moduleLoop]->Write( buffer, TObject::kSingleKey );
534 } /*for( moduleLoop )*/
535
536 newFile->Close();
537 delete newFile;
538
539} /*AliITSDCSAnalyzerSDD::Export*/