Updating calibration constants for channels 27 (light yields+pm gains) and channels...
[u/mrichter/AliRoot.git] / VZERO / AliVZERODataDCS.cxx
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 "AliVZERODataDCS.h"
18
19 #include "AliDCSValue.h"
20 #include "AliLog.h"
21
22 #include <TGraph.h>
23 #include <TAxis.h>
24 #include <TCanvas.h>
25 #include <TTimeStamp.h>
26 #include <TMap.h>
27 #include <TString.h>
28 #include <TObjString.h>
29 #include <TH1F.h>
30
31 class TH2;
32 class AliCDBMetaData;
33 class TDatime;
34
35 // AliVZERODataDCS class
36 // main aim to introduce the aliases for the VZERO DCS
37 // data points to be then
38 // stored in the OCDB, and to process them. 
39 // ProcessData() method called by VZEROPreprocessor
40
41 ClassImp(AliVZERODataDCS)
42
43 //_____________________________________________________________________________
44 AliVZERODataDCS::AliVZERODataDCS():
45         TObject(),
46         fRun(0),
47         fStartTime(0),
48         fEndTime(0),
49         fDaqStartTime(0),
50         fDaqEndTime(0),
51     fGraphs("TGraph",kNGraphs),
52         fFEEParameters(NULL),
53         fIsProcessed(kFALSE)
54
55 {
56   // Default constructor
57         for(int i=0;i<kNHvChannel;i++) {
58                 fDeadChannel[i] = kFALSE;
59                 fMeanHV[i]      = 100.0;
60                 fWidthHV[i]     = 0.0; 
61                 fHv[i]          = NULL;
62         }
63 }
64
65 //_____________________________________________________________________________
66 AliVZERODataDCS::AliVZERODataDCS(Int_t nRun, UInt_t startTime, UInt_t endTime, UInt_t daqStartTime, UInt_t daqEndTime):
67         TObject(),
68         fRun(nRun),
69         fStartTime(startTime),
70         fEndTime(endTime),
71         fDaqStartTime(daqStartTime),
72         fDaqEndTime(daqEndTime),
73         fGraphs("TGraph",kNGraphs),
74         fFEEParameters(new TMap()),
75         fIsProcessed(kFALSE)
76
77 {
78
79   // constructor with arguments
80         for(int i=0;i<kNHvChannel;i++) {
81          fDeadChannel[i] = kFALSE;        
82          fMeanHV[i]      = 100.0;
83      fWidthHV[i]     = 0.0; 
84         }
85         AliInfo(Form("\n\tRun %d \n\tTime Created %s \n\tTime Completed %s \n\tDAQ start %s \n\tDAQ end %s  ", nRun,
86                 TTimeStamp(startTime).AsString(),
87                 TTimeStamp(endTime).AsString(),
88                 TTimeStamp(daqStartTime).AsString(),
89                 TTimeStamp(daqEndTime).AsString()));
90         
91         fFEEParameters->SetOwnerValue();
92         Init();
93
94 }
95
96 //_____________________________________________________________________________
97 AliVZERODataDCS::~AliVZERODataDCS() {
98
99   // destructor
100   fGraphs.Clear("C");
101   delete fFEEParameters;
102
103 }
104
105 //_____________________________________________________________________________
106 Bool_t AliVZERODataDCS::ProcessData(TMap& aliasMap){
107
108   // method to process the data
109   Bool_t success = kTRUE;
110
111   if(!(fAliasNames[0])) Init();
112
113   TObjArray *aliasArr;
114   AliDCSValue* aValue;
115
116   // starting loop on aliases
117   for(int iAlias=0; iAlias<kNAliases; iAlias++){
118
119     aliasArr = (TObjArray*) aliasMap.GetValue(fAliasNames[iAlias].Data());
120     if(!aliasArr){
121       AliError(Form("Alias %s not found!", fAliasNames[iAlias].Data()));
122       success = kFALSE;
123       continue;
124     }
125
126     //Introduce(iAlias, aliasArr);
127     
128     if(aliasArr->GetEntries()<2){
129       AliWarning(Form("Alias %s has just %d entries!",
130                     fAliasNames[iAlias].Data(),aliasArr->GetEntries()));
131     }
132     
133     TIter iterarray(aliasArr);
134         
135     if(iAlias<kNHvChannel){ // Treating HV values
136         Int_t nentries = aliasArr->GetEntries();
137
138         Double_t *times = new Double_t[nentries];
139         Double_t *values = new Double_t[nentries];
140
141         UInt_t iValue=0;
142         Float_t variation = 0.0;
143
144         while((aValue = (AliDCSValue*) iterarray.Next())) {
145                         UInt_t currentTime = aValue->GetTimeStamp();
146                         if(currentTime>fDaqEndTime) break;
147
148                         values[iValue] = aValue->GetFloat();
149                         times[iValue] = (Double_t) (currentTime);
150                         
151                         if(iValue>0) {
152                                 if(values[iValue-1]>0.) variation = TMath::Abs(values[iValue]-values[iValue-1])/values[iValue-1];
153                                 if(variation > 0.01) fDeadChannel[GetOfflineChannel(iAlias)] = kTRUE;
154                         }
155                         fHv[iAlias]->Fill(values[iValue]);
156                         printf("%s %f Dead=%d\n",fAliasNames[iAlias].Data(),values[iValue],fDeadChannel[GetOfflineChannel(iAlias)]);
157                         iValue++;
158         }      
159         CreateGraph(iAlias, aliasArr->GetEntries(), times, values); // fill graphs 
160
161         // calculate mean and rms of the first two histos
162         // and convert index to aliroot channel
163         Int_t iChannel     = GetOfflineChannel(iAlias); 
164         fMeanHV[iChannel]  = fHv[iAlias]->GetMean();
165         fWidthHV[iChannel] = fHv[iAlias]->GetRMS();
166
167         delete[] values;
168         delete[] times; 
169         } else { // Treating FEE Parameters
170                 AliDCSValue * lastVal = NULL;
171                 while((aValue = (AliDCSValue*) iterarray.Next())) lastVal = aValue; // Take only the last value
172                 fFEEParameters->Add(new TObjString(fAliasNames[iAlias].Data()),lastVal);
173         }      
174   }
175   
176   fIsProcessed=kTRUE;
177
178   return success;
179 }
180
181 //_____________________________________________________________________________
182 void AliVZERODataDCS::Init(){
183
184   // initialization of aliases and DCS data
185
186   TString sindex;
187   int iAlias = 0;
188   
189   for(int iSide = 0; iSide<2 ; iSide++){
190         for(int iRing = 0; iRing<4 ; iRing++){
191                 for(int iSector = 0; iSector<8 ; iSector++){
192                         if(iSide == 0) fAliasNames[iAlias] = "V00/HV/V0A/SECTOR";
193                         else fAliasNames[iAlias] = "V00/HV/V0C/SECTOR";
194                         sindex.Form("%d/RING%d",iSector,iRing);
195                         fAliasNames[iAlias] += sindex;
196                         
197                         fHv[iAlias] = new TH1F(fAliasNames[iAlias].Data(),fAliasNames[iAlias].Data(), 3000, kHvMin, kHvMax);
198                         fHv[iAlias]->GetXaxis()->SetTitle("Hv");
199                         iAlias++;
200                 }
201         }
202   }
203
204  // Time Resolution Parameters
205         
206         for(int iCIU = 0; iCIU<8 ; iCIU++){
207                 fAliasNames[iAlias++] = Form("V00/FEE/CIU%d/TimeResolution",iCIU);
208                 fAliasNames[iAlias++] = Form("V00/FEE/CIU%d/WidthResolution",iCIU);
209         }
210
211         // HPTDC parameters
212         for(int iCIU = 0; iCIU<8 ; iCIU++){
213           fAliasNames[iAlias++] = Form("V00/FEE/CIU%d/MatchWindow",iCIU);
214           fAliasNames[iAlias++] = Form("V00/FEE/CIU%d/SearchWindow",iCIU);
215           fAliasNames[iAlias++] = Form("V00/FEE/CIU%d/TriggerCountOffset",iCIU);
216           fAliasNames[iAlias++] = Form("V00/FEE/CIU%d/RollOver",iCIU);
217         }
218
219         for(int iCIU = 0; iCIU<8 ; iCIU++){
220           for(int iCh=1;iCh<=8;iCh++){
221             fAliasNames[iAlias++] = Form("V00/FEE/CIU%d/DelayHit%d",iCIU,iCh);
222           }
223         }
224
225         for(int iCIU = 0; iCIU<8 ; iCIU++){
226           for(int iCh=1;iCh<=8;iCh++){
227             fAliasNames[iAlias++] = Form("V00/FEE/CIU%d/DiscriThr%d",iCIU,iCh);
228           }
229         }
230
231   if(iAlias!=kNAliases) 
232               AliError(Form("Number of DCS Aliases defined not correct"));
233
234 }
235
236 //_____________________________________________________________________________
237 void AliVZERODataDCS::Introduce(UInt_t numAlias, const TObjArray* aliasArr)const
238 {
239
240   // method to introduce new aliases
241
242   int entries=aliasArr->GetEntries();
243   AliInfo(Form("************ Alias: %s **********",fAliasNames[numAlias].Data()));
244   AliInfo(Form("        %d DP values collected",entries));
245
246 }
247
248 //_____________________________________________________________________________
249 void AliVZERODataDCS::CreateGraph(int i, int dim, const Double_t *x, const Double_t *y)
250 {
251
252    // Create graphics
253    
254    TGraph *gr = new(fGraphs[fGraphs.GetEntriesFast()]) TGraph(dim, x, y);
255
256    gr->GetXaxis()->SetTimeDisplay(1);
257    gr->SetTitle(fAliasNames[i].Data());
258
259    AliInfo(Form("Array entries: %d",fGraphs.GetEntriesFast()));
260
261 }
262
263
264 //_____________________________________________________________________________
265 void AliVZERODataDCS::Draw(const Option_t* /*option*/)
266 {
267 // Draw all histos and graphs
268
269   if(!fIsProcessed) return;
270
271   if(fGraphs.GetEntries()==0)  return;
272   
273   TString canvasName;
274   TCanvas *cHV[8];
275   
276   for(int iSide = 0 ;iSide<2;iSide++){
277         for(int iRing=0;iRing<4;iRing++){
278                 if(iSide == 0)  canvasName = "V0A_Ring";
279                 else  canvasName = "V0C_Ring";
280                 canvasName += iRing;
281                 int iCanvas = iSide*4 + iRing;
282                 cHV[iCanvas] = new TCanvas(canvasName,canvasName);
283                 cHV[iCanvas]->Divide(3,3);
284                 for(int iSector=0;iSector<8;iSector++){
285                         cHV[iCanvas]->cd(iSector+1);
286                         int iChannel = iSide*32 + iRing*8 + iSector; 
287                         ((TGraph*) fGraphs.UncheckedAt(iChannel))->SetMarkerStyle(20);
288                         ((TGraph*) fGraphs.UncheckedAt(iChannel))->Draw("ALP");
289
290                 }
291                                 
292         }
293   }
294
295 }
296