]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - TRD/AliTRDDataDCS.cxx
Correct filling histogram
[u/mrichter/AliRoot.git] / TRD / AliTRDDataDCS.cxx
... / ...
CommitLineData
1/**************************************************************************
2 * Copyright(c) 1998-1999, 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// //
20// This class collects the DCS information and does an AliSplineFit //
21// //
22// Typical use : //
23// //
24// AliTRDDataDCS dataDcs; //
25// dataDcs.ExtractDCS(dcs); //
26// ->call a storeRef function //
27// dataDcs.PerformFit(); //
28// dataDcs.ClearGraphs(); //
29// ->call a store function //
30// dataDcs.ClearFits(); //
31// //
32// Author: //
33// W. Monange (wilfried.monange@free.fr) //
34// //
35////////////////////////////////////////////////////////////////////////////
36
37#include <TGraph.h>
38#include <TObjArray.h>
39#include <TMap.h>
40
41#include "AliDCSValue.h"
42#include "AliDCSValue.h"
43#include "AliLog.h"
44#include "AliSplineFit.h"
45
46#include "AliTRDDataDCS.h"
47
48ClassImp(AliTRDDataDCS)
49
50//_____________________________________________________________________________
51AliTRDDataDCS::AliTRDDataDCS()
52 :TNamed()
53 ,fGraphsAreIni(kFALSE)
54 ,fFitsAreIni(kFALSE)
55 ,fNAlias(22)
56{
57 //
58 // Default constructor
59 //
60
61 Init ();
62
63}
64
65//_____________________________________________________________________________
66AliTRDDataDCS::~AliTRDDataDCS()
67{
68 //
69 // Destructor
70 //
71
72 ClearFits();
73 ClearGraphs();
74
75}
76
77//_____________________________________________________________________________
78void AliTRDDataDCS::Init()
79{
80 //
81 // Initialization
82 //
83
84 SetConf(kChamberByteStatus, "trd_chamberByteStatus%03d",'c', 540, kTRUE,kFALSE, 10,10,0,2);
85 SetConf(kPreTrigger, "trd_preTrigger", 'c', 1, kTRUE, kTRUE, 10,10,0,2);
86 SetConf(kGoofyHv, "trd_goofyHv", 'f', 1, kTRUE, kTRUE, 10,10,0,2);
87 SetConf(kGoofyPeakPos, "trd_goofyPeakPos%02d", 'f', 2, kTRUE, kTRUE, 10,10,0,2);
88 SetConf(kGoofyPeakArea, "trd_goofyPeakArea%02d", 'f', 2, kTRUE, kTRUE, 10,10,0,2);
89 SetConf(kGoofyTemp, "trd_goofyTemp%02d", 'f', 2, kTRUE, kTRUE, 10,10,0,2);
90 SetConf(kGoofyPressure, "trd_goofyPressure", 'f', 1, kTRUE, kTRUE, 10,10,0,2);
91 SetConf(kGoofyVelocity, "trd_goofyVelocity", 'f', 1, kTRUE, kTRUE, 10,10,0,2);
92 SetConf(kGoofyGain, "trd_goofyGain%02d", 'f', 2, kTRUE, kTRUE, 10,10,0,2);
93 SetConf(kGoofyCO2, "trd_goofyCO2", 'f', 1, kTRUE, kTRUE, 10,10,0,2);
94 SetConf(kGoofyN2, "trd_goofyN2", 'f', 1, kTRUE, kTRUE, 10,10,0,2);
95 SetConf(kGasO2, "trd_gasO2", 'f', 1, kTRUE, kTRUE, 10,10,0,2);
96 SetConf(kGasOverpressure, "trd_gasOverpressure", 'f', 1, kTRUE, kTRUE, 10,10,0,2);
97 SetConf(kEnvTemp, "trd_envTemp%03d", 'f', 540, kTRUE, kTRUE, 10,10,0,2);
98 SetConf(kHvAnodeImon, "trd_hvAnodeImon%03d", 'f', 540, kTRUE, kTRUE, 10,10,0,2);
99 SetConf(kHvDriftImon, "trd_hvDriftImon%03d", 'f', 540, kTRUE, kTRUE, 10,10,0,2);
100 SetConf(kHvAnodeUmon, "trd_hvAnodeUmon%03d", 'f', 540, kTRUE, kTRUE, 10,10,0,2);
101 SetConf(kHvDriftUmon, "trd_hvDriftUmon%03d", 'f', 540, kTRUE, kTRUE, 10,10,0,2);
102 SetConf(kAdcClkPhase, "trd_adcClkPhase", 'f', 1, kTRUE, kTRUE, 10,10,0,2);
103 SetConf(kAtmPressure, "trd_atmPressure", 'f', 1, kTRUE, kTRUE, 10,10,0,2);
104 SetConf(kLuminosity, "trd_luminosity", 'f', 1, kTRUE, kTRUE, 10,10,0,2);
105 SetConf(kMagneticField, "trd_magneticField", 'f', 1, kTRUE, kTRUE, 10,10,0,2);
106
107 for (UInt_t iAlias = 0; iAlias < fNAlias; iAlias++) {
108 fDatas[iAlias].GetGraph().SetOwner(1);
109 fDatas[iAlias].GetFit().SetOwner(1);
110 }
111
112}
113
114//_____________________________________________________________________________
115void AliTRDDataDCS::SetConf(UInt_t iAlias, const char *amanda,
116 char dataType, UInt_t nChannel,
117 Bool_t enableGraph, Bool_t enableFit, Int_t minPoints,
118 Int_t iter, Double_t maxDelta, Int_t fitReq)
119{
120 //
121 // Configure a DCS alias
122 //
123
124 if (iAlias >= fNAlias) {
125 AliWarning (Form("Alias %d is not correct", iAlias));
126 return;
127 }
128
129 fConfs[iAlias].SetAmanda(amanda);
130 fConfs[iAlias].SetDataType(dataType);
131 fConfs[iAlias].SetNChannel(nChannel);
132 fConfs[iAlias].SetEnableGraph(enableGraph);
133 fConfs[iAlias].SetEnableFit(enableFit);
134 fConfs[iAlias].SetMinPoints(minPoints);
135 fConfs[iAlias].SetIter(iter);
136 fConfs[iAlias].SetMaxDelta(maxDelta);
137 fConfs[iAlias].SetFitReq(fitReq);
138
139}
140
141//_____________________________________________________________________________
142void AliTRDDataDCS::InitFits()
143{
144 //
145 // Initialize the fits
146 //
147
148 if (fFitsAreIni)
149 return;
150
151 UInt_t nChannel;
152 for (UInt_t iAlias = 0; iAlias < fNAlias; iAlias++) {
153 nChannel = fConfs[iAlias].GetEnableFit() ? fConfs[iAlias].GetNChannel() : 0;
154 fDatas[iAlias].GetFit().Expand(nChannel);
155 }
156
157 fFitsAreIni = kTRUE;
158}
159
160//_____________________________________________________________________________
161void AliTRDDataDCS::InitGraphs()
162{
163 //
164 // Initialize the graphs
165 //
166
167 if (fGraphsAreIni)
168 return;
169
170 UInt_t nChannel;
171 for (UInt_t iAlias = 0; iAlias < fNAlias; iAlias++) {
172 nChannel = fConfs[iAlias].GetEnableGraph() ? fConfs[iAlias].GetNChannel() : 0;
173 fDatas[iAlias].GetGraph().Expand(nChannel);
174 }
175
176 fGraphsAreIni = kTRUE;
177}
178
179//_____________________________________________________________________________
180void AliTRDDataDCS::ClearFits()
181{
182 //
183 // Clear the fits
184 //
185
186 for (UInt_t iAlias = 0; iAlias < fNAlias; iAlias++) {
187 fDatas[iAlias].GetFit().Clear();
188 fDatas[iAlias].GetFit().Expand(0);
189 }
190
191 fFitsAreIni = kFALSE;
192}
193
194//_____________________________________________________________________________
195void AliTRDDataDCS::ClearGraphs()
196{
197 //
198 // Clear the grpahs
199 //
200
201 for (UInt_t iAlias = 0; iAlias < fNAlias; iAlias++) {
202 fDatas[iAlias].GetGraph().Clear();
203 fDatas[iAlias].GetGraph().Expand(0);
204 }
205
206 fGraphsAreIni = kFALSE;
207}
208
209//_____________________________________________________________________________
210Bool_t AliTRDDataDCS::ExtractDCS (TMap *dcsAlias)
211{
212 //
213 // Extract the DCS information
214 //
215
216 if (dcsAlias == 0x0) {
217 AliWarning ("No DCS Map");
218 return kFALSE;
219 }
220
221 ClearGraphs();
222 InitGraphs();
223
224 TGraph *graphTemp;
225 UInt_t nChannel;
226
227 for (UInt_t iAlias = 0; iAlias < fNAlias; iAlias++){
228
229 // extract dcs only when it is needed
230 nChannel = fDatas[iAlias].GetGraph().GetSize();
231
232 for (UInt_t iSensor=0; iSensor < nChannel; iSensor++) {
233
234 graphTemp = FindAndMakeGraph(dcsAlias,
235 Form(fConfs[iAlias].GetAmanda().Data(), iSensor),
236 fConfs[iAlias].GetDataType());
237
238 fDatas[iAlias].GetGraph().AddAt(graphTemp, iSensor);
239 }
240 }
241
242 return kTRUE;
243}
244
245//_____________________________________________________________________________
246TGraph *AliTRDDataDCS::FindAndMakeGraph (TMap * const dcsMap
247 , const char *amandaStr
248 , char dataType)
249{
250 //
251 // Create the graphs
252 //
253
254 TGraph *graph;
255
256 TPair *pair = (TPair *) dcsMap->FindObject(amandaStr);
257 if (pair == 0x0) {
258 AliWarning (Form("Can't find %s in dcsMap", amandaStr));
259 return 0x0;
260 }
261
262 TObjArray *valueSet = (TObjArray *) pair->Value();
263
264 //
265 // Make graph of values read from DCS map
266 // (spline fit parameters will subsequently be obtained from this graph)
267 //
268
269 Int_t nEntries = valueSet->GetEntriesFast();
270 if (nEntries == 0) {
271 AliWarning (Form("Entry %s in dcsMap contain no datas", amandaStr));
272 return 0x0;
273 }
274
275 Float_t * x = new Float_t[nEntries];
276 Float_t * y = new Float_t[nEntries];
277
278 Bool_t ok = kTRUE;
279 Int_t time0 = 0;
280 Int_t iEntries;
281 for (iEntries = 0; iEntries< nEntries; iEntries++) {
282
283 AliDCSValue *val = (AliDCSValue *) valueSet->At(iEntries);
284
285 if (val == 0x0) {
286 ok = false;
287 AliError(Form("Entry %s at %d contain no datas", amandaStr, iEntries));
288 break;
289 }
290
291 if (time0 == 0)
292 time0 = val->GetTimeStamp();
293
294
295 x[iEntries] = (val->GetTimeStamp() - time0)/3600.0; // give times in fractions of hours
296
297 switch (dataType) {
298 case 'f' :
299 y[iEntries] = val->GetFloat();
300 break;
301
302 case 'c' :
303 y[iEntries] = (Float_t) val->GetChar();
304 break;
305
306 default :
307 ok = false;
308 AliError(Form("Bad type for entry %s", amandaStr));
309 break;
310 }
311 }
312
313 if (ok)
314 graph = new TGraph(iEntries, x, y);
315 else
316 graph = 0x0;
317
318 delete [] x;
319 delete [] y;
320
321 return graph;
322}
323
324//_____________________________________________________________________________
325Bool_t AliTRDDataDCS::PerformFit()
326{
327 //
328 // Do the fit
329 //
330
331 AliSplineFit *fitTemp;
332
333 ClearFits();
334 InitFits();
335
336 UInt_t nChannel;
337
338 for (UInt_t iAlias = 0; iAlias < fNAlias; iAlias++){
339
340 // perform fit only when it is needed
341 nChannel = fDatas[iAlias].GetFit().GetSize();
342
343 for (UInt_t iSensor=0; iSensor < nChannel; iSensor++) {
344
345 fitTemp = Fit((TGraph*)fDatas[iAlias].GetGraph(iSensor),
346 fConfs[iAlias].GetMinPoints(),
347 fConfs[iAlias].GetIter(),
348 fConfs[iAlias].GetMaxDelta(),
349 fConfs[iAlias].GetFitReq());
350
351 if (fitTemp == 0x0)
352 AliInfo(Form("Can't fit %s", Form(fConfs[iAlias].GetAmanda().Data(), iSensor)));
353
354 fDatas[iAlias].GetFit().AddAt(fitTemp, iSensor);
355 }
356 }
357
358 return kTRUE;
359
360}
361
362//_____________________________________________________________________________
363AliSplineFit *AliTRDDataDCS::Fit(const TGraph * const graph,
364 Int_t minPoints, Int_t iter,
365 Double_t maxDelta, Int_t fitReq)
366{
367 //
368 // Do the spline fit
369 //
370
371 if (graph == 0x0) {
372 AliError("No graph for fit");
373 return 0x0;
374 }
375
376 AliSplineFit *spline = new AliSplineFit();
377 spline->InitKnots(new TGraph (*graph), minPoints, iter, maxDelta);
378 spline->SplineFit(fitReq);
379 spline->Cleanup(); // delete also new TGraph (*graph)
380
381 return spline;
382}
383
384//_____________________________________________________________________________
385void AliTRDDataDCS::Print(const Option_t * const option) const
386{
387 //
388 // Print function
389 //
390
391 if (option[0]=='g' || option[0]=='\0'){
392
393 if (fGraphsAreIni){
394
395 for (UInt_t iAlias = 0; iAlias < fNAlias; iAlias++){
396
397 for (Int_t iSensor = 0; iSensor < fDatas[iAlias].GetGraph().GetSize(); iSensor++) {
398
399 if (fDatas[iAlias].GetGraph(iSensor) != 0x0)
400 AliInfo(Form("Graph %s contain %d point(s)",
401 Form(fConfs[iAlias].GetAmanda(), iSensor),
402 ((TGraph*)(fDatas[iAlias].GetGraph(iSensor)))->GetN()));
403 }
404 }
405 }
406 else{
407 AliInfo("Graphs don't exist");
408 }
409 }
410
411
412 if (option[0] == 'f' || option[0]=='\0'){
413
414 AliInfo("no print for fit");
415
416 }
417
418}
419
420//_____________________________________________________________________________
421TGraph *AliTRDDataDCS::GetGraph(UInt_t iAlias, UInt_t iChannel) const
422{
423 //
424 // Get a graph
425 //
426
427 if (iAlias >= fNAlias) {
428 AliWarning(Form("Alias %d is not correct", iAlias));
429 return 0x0;
430 }
431
432 if (iChannel >= (UInt_t) fDatas[iAlias].GetGraph().GetSize()) {
433 AliWarning(Form("Alias %s is not correct",
434 Form(fConfs[iAlias].GetAmanda().Data(), iChannel)));
435 return 0x0;
436 }
437
438 return (TGraph *)fDatas[iAlias].GetGraph(iChannel);
439}
440
441//_____________________________________________________________________________
442AliSplineFit *AliTRDDataDCS::GetFit(UInt_t iAlias, UInt_t iChannel) const
443{
444 //
445 // Get the spline fit
446 //
447
448 if (iAlias >= fNAlias) {
449 AliWarning (Form("Alias %d is not correct", iAlias));
450 return 0x0;
451 }
452
453 if (iChannel >= (UInt_t) fDatas[iAlias].GetFit().GetSize()) {
454 AliWarning(Form("Alias %s is not correct",
455 Form(fConfs[iAlias].GetAmanda().Data(), iChannel)));
456 return 0x0;
457 }
458
459 return (AliSplineFit *) fDatas[iAlias].GetFit(iChannel);
460}
461
462//_____________________________________________________________________________
463TString AliTRDDataDCS::GetAmandaStr (UInt_t iAlias) const
464{
465 //
466 // Return the AMANDA string
467 //
468
469 if (iAlias < fNAlias)
470 return fConfs[iAlias].GetAmanda();
471 else return TString ();
472}
473
474//_____________________________________________________________________________
475UInt_t AliTRDDataDCS::GetNChannel (UInt_t iAlias) const
476{
477 //
478 // Get the channel number
479 //
480
481 if (iAlias < fNAlias)
482 return fConfs[iAlias].GetNChannel();
483 else return 0;
484}