Now the TPC preprocessor has been updated to read pedestal entries from the DAQ FXS...
[u/mrichter/AliRoot.git] / TPC / AliTPCPreprocessor.cxx
1 /**************************************************************************
2  * Copyright(c) 2007, 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 "AliTPCPreprocessor.h"
18 #include "AliShuttleInterface.h"
19
20 #include "AliCDBMetaData.h"
21 #include "AliDCSValue.h"
22 #include "AliLog.h"
23 #include "AliTPCSensorTempArray.h"
24 #include "AliTPCDBPressure.h"
25 #include "AliTPCROC.h"
26 #include "AliTPCCalROC.h"
27 #include "AliTPCCalPad.h"
28 #include "AliTPCCalibPedestal.h"
29
30 #include <TTimeStamp.h>
31
32 const Int_t kValCutTemp = 100;               // discard temperatures > 100 degrees
33 const Int_t kDiffCutTemp = 5;                // discard temperature differences > 5 degrees
34 const TString kPedestalRunType = "PEDESTAL_RUN";  // pedestal run identifier
35
36 //
37 // This class is the SHUTTLE preprocessor for the TPC detector.
38 // It contains several components, this far the part containing
39 // temperatures is implemented
40 //
41
42 ClassImp(AliTPCPreprocessor)
43
44 //______________________________________________________________________________________________
45 AliTPCPreprocessor::AliTPCPreprocessor(AliShuttleInterface* shuttle) :
46   AliPreprocessor("TPC",shuttle),
47   fTemp(0), fPressure(0), fConfigOK(kTRUE), fROC(0)
48 {
49   // constructor
50   fROC = AliTPCROC::Instance();
51 }
52 //______________________________________________________________________________________________
53 // AliTPCPreprocessor::AliTPCPreprocessor(const AliTPCPreprocessor& org) :
54 //   AliPreprocessor(org),
55 //   fTemp(0), fPressure(0), fConfigOK(kTRUE)
56 // {
57 //   // copy constructor not implemented
58 //   //   -- missing underlying copy constructor in AliPreprocessor
59 //
60 //   Fatal("AliTPCPreprocessor", "copy constructor not implemented");
61 //
62 // //  fTemp = new AliTPCSensorTempArray(*(org.fTemp));
63 // }
64
65 //______________________________________________________________________________________________
66 AliTPCPreprocessor::~AliTPCPreprocessor()
67 {
68   // destructor
69
70   delete fTemp;
71   delete fPressure;
72 }
73 //______________________________________________________________________________________________
74 AliTPCPreprocessor& AliTPCPreprocessor::operator = (const AliTPCPreprocessor& )
75 {
76   Fatal("operator =", "assignment operator not implemented");
77   return *this;
78 }
79
80
81 //______________________________________________________________________________________________
82 void AliTPCPreprocessor::Initialize(Int_t run, UInt_t startTime,
83         UInt_t endTime)
84 {
85   // Creates AliTestDataDCS object
86
87   AliPreprocessor::Initialize(run, startTime, endTime);
88
89         AliInfo(Form("\n\tRun %d \n\tStartTime %s \n\tEndTime %s", run,
90                 TTimeStamp(startTime).AsString(),
91                 TTimeStamp(endTime).AsString()));
92
93   // Temperature sensors
94
95         TTree *confTree = 0;
96         AliCDBEntry* entry = GetFromOCDB("Config", "Temperature");
97         if (entry) confTree = (TTree*) entry->GetObject();
98         if ( confTree==0 ) {
99            AliError(Form("Temperature Config OCDB entry missing.\n"));
100            Log("AliTPCPreprocsessor: Temperature Config OCDB entry missing.\n");
101            fConfigOK = kFALSE;
102            return;
103         }
104         fTemp = new AliTPCSensorTempArray(fStartTime, fEndTime, confTree);
105         fTemp->SetValCut(kValCutTemp);
106         fTemp->SetDiffCut(kDiffCutTemp);
107
108   // Pressure sensors
109
110         confTree=0;
111         entry=0;
112         entry = GetFromOCDB("Config", "Pressure");
113         if (entry) confTree = (TTree*) entry->GetObject();
114         if ( confTree==0 ) {
115            AliError(Form("Pressure Config OCDB entry missing.\n"));
116            Log("AliTPCPreprocsessor: Pressure Config OCDB entry missing.\n");
117            fConfigOK = kFALSE;
118            return;
119         }
120         fPressure = new AliDCSSensorArray(fStartTime, fEndTime, confTree);
121
122 }
123
124 //______________________________________________________________________________________________
125 UInt_t AliTPCPreprocessor::Process(TMap* dcsAliasMap)
126 {
127   // Fills data into TPC calibrations objects
128
129   // Amanda servers provide information directly through dcsAliasMap
130
131   if (!dcsAliasMap) return 9;
132   if (!fConfigOK) return 9;
133
134   TString runType = GetRunType();
135
136   // Temperature sensors are processed by AliTPCCalTemp
137
138
139   UInt_t tempResult = MapTemperature(dcsAliasMap);
140   UInt_t result=tempResult;
141
142   // Pressure sensors
143
144   UInt_t pressureResult = MapPressure(dcsAliasMap);
145   result += pressureResult;
146
147   // Other calibration information will be retrieved through FXS files
148   //  examples:
149   //    TList* fileSourcesDAQ = GetFile(AliShuttleInterface::kDAQ, "pedestals");
150   //    const char* fileNamePed = GetFile(AliShuttleInterface::kDAQ, "pedestals", "LDC1");
151   //
152   //    TList* fileSourcesHLT = GetFile(AliShuttleInterface::kHLT, "calib");
153   //    const char* fileNameHLT = GetFile(AliShuttleInterface::kHLT, "calib", "LDC1");
154
155
156   if(runType == kPedestalRunType) {
157     UInt_t pedestalResult = ExtractPedestals();
158     result += pedestalResult;
159   }
160
161
162   return result;
163 }
164 //______________________________________________________________________________________________
165 UInt_t AliTPCPreprocessor::MapTemperature(TMap* dcsAliasMap)
166 {
167
168    // extract DCS temperature maps. Perform fits to save space
169
170   UInt_t result=0;
171   TMap *map = fTemp->ExtractDCS(dcsAliasMap);
172   if (map) {
173     fTemp->MakeSplineFit(map);
174     AliInfo(Form("Temperature values extracted, fits performed.\n"));
175   } else {
176     AliError(Form("No temperature map extracted.\n"));
177     Log("AliTPCPreprocsessor: no temperature map extracted. \n");
178     result=9;
179   }
180   delete map;
181   // Now store the final CDB file
182
183   if ( result == 0 ) {
184         AliCDBMetaData metaData;
185         metaData.SetBeamPeriod(0);
186         metaData.SetResponsible("Haavard Helstrup");
187         metaData.SetComment("Preprocessor AliTPC data base entries.");
188
189         Bool_t storeOK = Store("Calib", "Temperature", fTemp, &metaData, 0, kFALSE);
190         if ( !storeOK )  result=1;
191
192    }
193
194    return result;
195 }
196 //______________________________________________________________________________________________
197 UInt_t AliTPCPreprocessor::MapPressure(TMap* dcsAliasMap)
198 {
199
200    // extract DCS temperature maps. Perform fits to save space
201
202   UInt_t result=0;
203   TMap *map = fPressure->ExtractDCS(dcsAliasMap);
204   if (map) {
205     fPressure->MakeSplineFit(map);
206     AliInfo(Form("Pressure values extracted, fits performed.\n"));
207   } else {
208     AliError(Form("No atmospheric pressure map extracted.\n"));
209     Log("AliTPCPreprocsessor: no atmospheric pressure map extracted. \n");
210     result=9;
211   }
212   delete map;
213   // Now store the final CDB file
214
215   if ( result == 0 ) {
216         AliCDBMetaData metaData;
217         metaData.SetBeamPeriod(0);
218         metaData.SetResponsible("Haavard Helstrup");
219         metaData.SetComment("Preprocessor AliTPC data base entries.");
220
221         Bool_t storeOK = Store("Calib", "Pressure", fPressure, &metaData, 0, 0);
222         if ( !storeOK ) result=1;
223
224    }
225
226    return result;
227 }
228 //______________________________________________________________________________________________
229 UInt_t AliTPCPreprocessor::ExtractPedestals()
230 {
231  //
232  //  Read pedestal file from file exchage server
233  //  Keep original entry from OCDB in case no new pedestals are available
234  //
235  AliTPCCalPad *calPadPed=0;
236  AliCDBEntry* entry = GetFromOCDB("Calib", "Pedestals");
237  if (entry) calPadPed = (AliTPCCalPad*)entry->GetObject();
238  if ( calPadPed==NULL ) {
239      AliWarning(Form("No previous TPC pedestal entry available.\n"));
240      Log("AliTPCPreprocsessor: No previous TPC pedestal entry available.\n");
241      calPadPed = new AliTPCCalPad();
242  }
243
244  UInt_t result=0;
245
246  Int_t nSectors = fROC->GetNSectors();
247  TList* list = GetFileSources(AliShuttleInterface::kDAQ,"pedestals");
248  if (list) {
249
250 //  loop through all files from LDCs
251
252     UInt_t index = 0;
253     while (list->At(index)!=NULL) {
254      TObjString* fileNameEntry = (TObjString*) list->At(index);
255      if (fileNameEntry!=NULL) {
256         TString fileName = GetFile(AliShuttleInterface::kDAQ, "pedestals",
257                                          fileNameEntry->GetString().Data());
258         TFile *f = TFile::Open(fileName);
259         AliTPCCalibPedestal *calPed;
260         f->GetObject("AliTPCCalibPedestal",calPed);
261
262         //  replace entries for the sectors available in the present file
263
264         for (Int_t sector=0; sector<=nSectors; sector++) {
265            AliTPCCalROC *roc=calPed->GetCalRocPedestal(sector, kFALSE);
266            if ( roc )  calPadPed->SetCalROC(roc,sector);
267         }
268       }
269      ++index;
270     }  // while(list)
271 //
272 //  Store updated pedestal entry to OCDB
273 //
274     AliCDBMetaData metaData;
275     metaData.SetBeamPeriod(0);
276     metaData.SetResponsible("Haavard Helstrup");
277     metaData.SetComment("Preprocessor AliTPC data base entries.");
278
279     Bool_t storeOK = Store("Calib", "Pedestals", calPadPed, &metaData, 0, kTRUE);
280     if ( !storeOK ) result=1;
281
282   }  // if(list)
283   return result;
284 }