Line data Source code
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 :
17 : #include "AliADDataDCS.h"
18 :
19 : #include "AliDCSValue.h"
20 : #include "AliLog.h"
21 : #include "AliADConst.h"
22 :
23 : #include <TGraph.h>
24 : #include <TAxis.h>
25 : #include <TCanvas.h>
26 : #include <TTimeStamp.h>
27 : #include <TMap.h>
28 : #include <TString.h>
29 : #include <TObjString.h>
30 : #include <TH1F.h>
31 :
32 : class TH2;
33 : class AliCDBMetaData;
34 : class TDatime;
35 :
36 : // AliADDataDCS class
37 : // main aim to introduce the aliases for the AD DCS
38 : // data points to be then
39 : // stored in the OCDB, and to process them.
40 : // ProcessData() method called by ADPreprocessor
41 :
42 16 : ClassImp(AliADDataDCS)
43 :
44 : //_____________________________________________________________________________
45 0 : AliADDataDCS::AliADDataDCS():
46 0 : TObject(),
47 0 : fRun(0),
48 0 : fStartTime(0),
49 0 : fEndTime(0),
50 0 : fDaqStartTime(0),
51 0 : fDaqEndTime(0),
52 0 : fCtpStartTime(0),
53 0 : fCtpEndTime(0),
54 0 : fGraphs(NULL),
55 0 : fFEEParameters(NULL),
56 0 : fIsProcessed(kFALSE)
57 :
58 0 : {
59 : // Default constructor
60 0 : for(int i=0;i<kNHvChannel;i++) {
61 0 : fDeadChannel[i] = kFALSE;
62 0 : fMeanHV[i] = 100.0;
63 0 : fWidthHV[i] = 0.0;
64 0 : fHv[i] = NULL;
65 : }
66 0 : }
67 :
68 : //_____________________________________________________________________________
69 0 : AliADDataDCS::AliADDataDCS(Int_t nRun, UInt_t startTime, UInt_t endTime, UInt_t daqStartTime, UInt_t daqEndTime, UInt_t ctpStartTime, UInt_t ctpEndTime):
70 0 : TObject(),
71 0 : fRun(nRun),
72 0 : fStartTime(startTime),
73 0 : fEndTime(endTime),
74 0 : fDaqStartTime(daqStartTime),
75 0 : fDaqEndTime(daqEndTime),
76 0 : fCtpStartTime(ctpStartTime),
77 0 : fCtpEndTime(ctpEndTime),
78 0 : fGraphs(new TClonesArray("TGraph",kNGraphs)),
79 0 : fFEEParameters(new TMap()),
80 0 : fIsProcessed(kFALSE)
81 :
82 0 : {
83 :
84 : // constructor with arguments
85 0 : for(int i=0;i<kNHvChannel;i++) {
86 0 : fDeadChannel[i] = kFALSE;
87 0 : fMeanHV[i] = 100.0;
88 0 : fWidthHV[i] = 0.0;
89 : }
90 0 : AliInfo(Form("\n\tRun %d \n\tTime Created %s \n\tTime Completed %s \n\tDAQ start %s \n\tDAQ end %s \n\tCTP start %s \n\tCTP end %s ", nRun,
91 : TTimeStamp(startTime).AsString(),
92 : TTimeStamp(endTime).AsString(),
93 : TTimeStamp(daqStartTime).AsString(),
94 : TTimeStamp(daqEndTime).AsString(),
95 : TTimeStamp(ctpStartTime).AsString(),
96 : TTimeStamp(ctpEndTime).AsString()
97 : ));
98 :
99 0 : fFEEParameters->SetOwnerValue();
100 0 : Init();
101 :
102 0 : }
103 :
104 : //_____________________________________________________________________________
105 0 : AliADDataDCS::~AliADDataDCS() {
106 :
107 : // destructor
108 0 : fGraphs->Clear("C");
109 0 : delete fFEEParameters;
110 :
111 0 : }
112 :
113 : //_____________________________________________________________________________
114 : Bool_t AliADDataDCS::ProcessData(TMap& aliasMap){
115 :
116 : // method to process the data
117 : Bool_t success = kTRUE;
118 :
119 0 : if(!(fAliasNames[0])) Init();
120 :
121 : TObjArray *aliasArr;
122 : AliDCSValue* aValue;
123 :
124 : // starting loop on aliases
125 0 : for(int iAlias=0; iAlias<kNAliases; iAlias++){
126 :
127 0 : aliasArr = (TObjArray*) aliasMap.GetValue(fAliasNames[iAlias].Data());
128 0 : if(!aliasArr){
129 0 : AliError(Form("Missing data points for alias %s!", fAliasNames[iAlias].Data()));
130 : success = kFALSE;
131 0 : continue;
132 : }
133 :
134 : //Introduce(iAlias, aliasArr);
135 :
136 0 : if(aliasArr->GetEntries()<2){
137 0 : AliWarning(Form("Alias %s has just %d data points!",
138 : fAliasNames[iAlias].Data(),aliasArr->GetEntries()));
139 0 : }
140 :
141 0 : TIter iterarray(aliasArr);
142 :
143 0 : if(iAlias<kNHvChannel){ // Treating HV values
144 0 : Int_t nentries = aliasArr->GetEntries();
145 :
146 0 : Double_t *times = new Double_t[nentries];
147 0 : Double_t *values = new Double_t[nentries];
148 :
149 : UInt_t iValue=0;
150 : Float_t variation = 0.0;
151 :
152 0 : while((aValue = (AliDCSValue*) iterarray.Next())) {
153 0 : UInt_t currentTime = aValue->GetTimeStamp();
154 0 : if(currentTime>fCtpEndTime) break;
155 :
156 0 : values[iValue] = aValue->GetFloat();
157 0 : times[iValue] = (Double_t) (currentTime);
158 :
159 0 : if(iValue>0) {
160 0 : if(values[iValue-1]>0.) variation = TMath::Abs(values[iValue]-values[iValue-1])/values[iValue-1];
161 0 : if(variation > 0.05) fDeadChannel[iAlias] = kTRUE;
162 : }
163 0 : fHv[iAlias]->Fill(values[iValue]);
164 0 : iValue++;
165 0 : }
166 0 : CreateGraph(iAlias, iValue, times, values); // fill graphs
167 :
168 : // calculate mean and rms of the first two histos
169 : Int_t iChannel = iAlias;
170 0 : fMeanHV[iAlias] = fHv[iAlias]->GetMean();
171 0 : fWidthHV[iAlias] = fHv[iAlias]->GetRMS();
172 :
173 0 : delete[] values;
174 0 : delete[] times;
175 0 : }
176 0 : else if(iAlias >= kNHvChannel && iAlias<2*kNHvChannel){
177 0 : Int_t nentries = aliasArr->GetEntries();
178 :
179 0 : Double_t *times = new Double_t[nentries];
180 0 : Double_t *values = new Double_t[nentries];
181 : UInt_t iValue=0;
182 :
183 0 : while((aValue = (AliDCSValue*) iterarray.Next())) {
184 0 : UInt_t currentTime = aValue->GetTimeStamp();
185 0 : if(currentTime>fCtpEndTime) break;
186 :
187 0 : values[iValue] = aValue->GetFloat();
188 0 : times[iValue] = (Double_t) (currentTime);
189 0 : iValue++;
190 0 : }
191 0 : CreateGraph(iAlias, iValue, times, values); // fill graphs
192 0 : }
193 : else { // Treating FEE Parameters
194 : AliDCSValue * lastVal = NULL;
195 0 : while((aValue = (AliDCSValue*) iterarray.Next())) lastVal = aValue; // Take only the last value
196 0 : fFEEParameters->Add(new TObjString(fAliasNames[iAlias].Data()),lastVal);
197 : }
198 0 : }
199 :
200 0 : fIsProcessed=kTRUE;
201 :
202 0 : return success;
203 0 : }
204 :
205 : //_____________________________________________________________________________
206 : void AliADDataDCS::Init(){
207 :
208 : // initialization of aliases and DCS data
209 :
210 0 : TString sindex;
211 : int iAlias = 0;
212 :
213 0 : for(int iPM = 0; iPM<16 ; iPM++){
214 0 : fAliasNames[iAlias] = Form("AD0/HV/PM%d",iPM);
215 :
216 0 : fHv[iAlias] = new TH1F(fAliasNames[iAlias].Data(),fAliasNames[iAlias].Data(), 3000, kHvMin, kHvMax);
217 0 : fHv[iAlias]->GetXaxis()->SetTitle("Hv");
218 0 : iAlias++;
219 : }
220 :
221 0 : for(int iPM = 0; iPM<16 ; iPM++) fAliasNames[iAlias++] = Form("AD0/HV/Imon%d",iPM);
222 :
223 : // CCIU Parameters
224 :
225 0 : fAliasNames[iAlias++] = "AD0/FEE/CCIU/BBAThreshold";
226 0 : fAliasNames[iAlias++] = "AD0/FEE/CCIU/BBCThreshold";
227 0 : fAliasNames[iAlias++] = "AD0/FEE/CCIU/BGAThreshold";
228 0 : fAliasNames[iAlias++] = "AD0/FEE/CCIU/BGCThreshold";
229 0 : fAliasNames[iAlias++] = "AD0/FEE/CCIU/BBAForBGThreshold";
230 0 : fAliasNames[iAlias++] = "AD0/FEE/CCIU/BBCForBGThreshold";
231 0 : fAliasNames[iAlias++] = "AD0/FEE/CCIU/MultADAThrLow";
232 0 : fAliasNames[iAlias++] = "AD0/FEE/CCIU/MultADAThrHigh";
233 0 : fAliasNames[iAlias++] = "AD0/FEE/CCIU/MultADCThrLow";
234 0 : fAliasNames[iAlias++] = "AD0/FEE/CCIU/MultADCThrHigh";
235 0 : for(int i=1;i<=5;i++) {
236 0 : fAliasNames[iAlias] = "AD0/FEE/CCIU/TriggerSelect";
237 0 : fAliasNames[iAlias++] += Form("%d",i);
238 : }
239 : //Trigger parameters
240 0 : for(int iCIU = 0; iCIU<2 ; iCIU++){
241 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/Clk1Win1",iCIU);
242 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/Clk1Win2",iCIU);
243 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/Clk2Win1",iCIU);
244 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/Clk2Win2",iCIU);
245 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/DelayClk1Win1",iCIU);
246 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/DelayClk1Win2",iCIU);
247 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/DelayClk2Win1",iCIU);
248 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/DelayClk2Win2",iCIU);
249 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/LatchWin1",iCIU);
250 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/LatchWin2",iCIU);
251 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/ResetWin1",iCIU);
252 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/ResetWin2",iCIU);
253 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/PedestalSubtraction",iCIU);
254 : }
255 0 : for(int iCIU = 0; iCIU<2 ; iCIU++){
256 0 : for(int iCh=1;iCh<=8;iCh++){
257 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/EnableCharge%d",iCIU,iCh);
258 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/EnableTiming%d",iCIU,iCh);
259 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/PedEven%d",iCIU,iCh);
260 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/PedOdd%d",iCIU,iCh);
261 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/PedCutEven%d",iCIU,iCh);
262 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/PedCutOdd%d",iCIU,iCh);
263 : }
264 : }
265 : // Time Resolution Parameters
266 0 : for(int iCIU = 0; iCIU<2 ; iCIU++){
267 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/TimeResolution",iCIU);
268 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/WidthResolution",iCIU);
269 : }
270 : // HPTDC parameters
271 0 : for(int iCIU = 0; iCIU<2 ; iCIU++){
272 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/MatchWindow",iCIU);
273 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/SearchWindow",iCIU);
274 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/TriggerCountOffset",iCIU);
275 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/RollOver",iCIU);
276 : }
277 :
278 0 : for(int iCIU = 0; iCIU<2 ; iCIU++){
279 0 : for(int iCh=1;iCh<=8;iCh++){
280 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/DelayHit%d",iCIU,iCh);
281 : }
282 : }
283 :
284 0 : for(int iCIU = 0; iCIU<2 ; iCIU++){
285 0 : for(int iCh=1;iCh<=8;iCh++){
286 0 : fAliasNames[iAlias++] = Form("AD0/FEE/CIU%d/DiscriThr%d",iCIU,iCh);
287 : }
288 : }
289 :
290 0 : if(iAlias!=kNAliases)
291 0 : AliError(Form("Number of DCS Aliases defined not correct"));
292 :
293 0 : }
294 :
295 : //_____________________________________________________________________________
296 : void AliADDataDCS::Introduce(UInt_t numAlias, const TObjArray* aliasArr)const
297 : {
298 :
299 : // method to introduce new aliases
300 :
301 0 : int entries=aliasArr->GetEntries();
302 0 : AliInfo(Form("************ Alias: %s **********",fAliasNames[numAlias].Data()));
303 0 : AliInfo(Form(" %d DP values collected",entries));
304 :
305 0 : }
306 :
307 : //_____________________________________________________________________________
308 : void AliADDataDCS::CreateGraph(int i, int dim, const Double_t *x, const Double_t *y)
309 : {
310 :
311 : // Create graphics
312 :
313 0 : TGraph *gr = new((*fGraphs)[fGraphs->GetEntriesFast()]) TGraph(dim, x, y);
314 :
315 0 : gr->GetXaxis()->SetTimeDisplay(1);
316 0 : gr->SetTitle(fAliasNames[i].Data());
317 :
318 0 : }
319 :
320 :
321 : //_____________________________________________________________________________
322 : void AliADDataDCS::Draw(const Option_t* /*option*/)
323 : {
324 : // Draw all histos and graphs
325 :
326 0 : if(!fIsProcessed) return;
327 :
328 0 : if(fGraphs->GetEntries()==0) return;
329 :
330 0 : TCanvas *cHV = new TCanvas("AD0_HV","AD0_HV");
331 0 : cHV->Divide(4,4);
332 :
333 0 : for(int iPM = 0; iPM<16 ; iPM++){
334 0 : cHV->cd(iPM+1);
335 0 : ((TGraph*) fGraphs->UncheckedAt(iPM))->SetMarkerStyle(20);
336 0 : ((TGraph*) fGraphs->UncheckedAt(iPM))->Draw("ALP");
337 : }
338 0 : }
339 :
|