Introduce DCS FXS data into preprocessor (Frederick)
[u/mrichter/AliRoot.git] / TRD / AliTRDPreprocessor.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 /* $Id$ */
17
18 ////////////////////////////////////////////////////////////////////////////
19 //                                                                        //
20 // This class is a first implementation for the TRD.                      //
21 // It takes data from HLT and computes the parameters                     //
22 // and stores both reference data and online calibration                  //
23 // parameters in the CDB                                                  //
24 // It alsotakes DCS data, does spline fits                                //
25 // and stores both reference data and spline fits results                 //
26 // in the CDB                                                             //
27 //                                                                        //
28 // Author:                                                                //
29 //   R. Bailhache (R.Bailhache@gsi.de)                                    //
30 //   W. Monange   (w.monange@gsi.de)                                      //
31 //                                                                        //
32 ////////////////////////////////////////////////////////////////////////////
33
34 #include <TFile.h>
35 #include <TProfile2D.h>
36 #include <TStopwatch.h>
37 #include <TObjString.h>
38 #include <TString.h>
39 #include <TList.h>
40 #include <TCollection.h>
41 #include "TSAXParser.h"
42
43 #include "AliCDBMetaData.h"
44 #include "AliLog.h"
45
46 #include "AliTRDPreprocessor.h"
47 #include "AliTRDSensorArray.h"
48 #include "AliTRDCalibraFit.h"
49 #include "AliTRDCalibraMode.h"
50 #include "AliTRDCalibPadStatus.h"
51 #include "AliTRDSaxHandler.h"
52 #include "Cal/AliTRDCalDet.h"
53 #include "Cal/AliTRDCalPadStatus.h"
54 #include "Cal/AliTRDCalDCS.h"
55
56 ClassImp(AliTRDPreprocessor)
57
58 //______________________________________________________________________________________________
59 AliTRDPreprocessor::AliTRDPreprocessor(AliShuttleInterface *shuttle)
60   :AliPreprocessor("TRD", shuttle)
61   ,fVdriftHLT(0)
62 {
63   //
64   // Constructor
65   //
66
67  AddRunType("PHYSICS");
68  AddRunType("STANDALONE");
69  AddRunType("PEDESTAL");
70
71 }
72
73 //______________________________________________________________________________________________
74 AliTRDPreprocessor::~AliTRDPreprocessor()
75 {
76   //
77   // Destructor
78   //
79
80 }
81
82 //______________________________________________________________________________________________
83 void AliTRDPreprocessor::Initialize(Int_t run, UInt_t startTime, UInt_t endTime)
84 {
85   //
86   // Initialization routine for the TRD preprocessor
87   //
88
89   AliPreprocessor::Initialize(run,startTime,endTime);
90
91 }
92
93 //______________________________________________________________________________________________
94 UInt_t AliTRDPreprocessor::Process(TMap* dcsAliasMap)
95 {
96   //
97   // Process DCS and calibration part for HLT
98   //
99
100   TString runType = GetRunType();
101   Log(Form("runtype %s\n",runType.Data()));
102
103   // always process the configuration data
104   Int_t resultDCSC = ProcessDCSConfigData();
105   // if there was an error, return with its code
106   if (resultDCSC != 0) return resultDCSC;
107
108   if (runType=="PEDESTAL"){
109     if(ExtractPedestals()) return 1;
110     return 0;
111   } 
112
113   if ((runType=="PHYSICS") || (runType=="STANDALONE")){
114     // DCS
115     if(ProcessDCS(dcsAliasMap)) return 1;
116     // HLT if On
117     //TString runPar = GetRunParameter("HLTStatus");
118     //if(runPar=="1") {
119     if(GetHLTStatus()) {
120       if(ExtractHLT()) return 1;
121     } 
122     // DAQ if HLT failed
123     if(!fVdriftHLT) {
124       if(ExtractDriftVelocityDAQ()) return 1;
125     }
126   }
127   
128   return 0;  
129   
130 }
131
132 //______________________________________________________________________________
133 Bool_t AliTRDPreprocessor::ProcessDCS()
134 {
135   //
136   // Default process DCS method
137   //
138
139   TString runType = GetRunType();
140   if ((runType == "PHYSICS") || (runType == "STANDALONE")) {
141     return kTRUE;
142   }
143   return kFALSE;
144
145 }
146
147 //______________________________________________________________________________
148 Bool_t AliTRDPreprocessor::ProcessDCS(TMap *dcsAliasMap)
149 {
150   //
151   // Process DCS method
152   //
153
154   Bool_t error = kFALSE;
155
156   AliCDBMetaData metaData;
157   metaData.SetBeamPeriod(0);
158   metaData.SetResponsible("Wilfried Monange/Raphaelle Bailhache");
159   metaData.SetComment("TRD calib test");
160
161   Log("****** DCS ******\n");
162         
163   TObjArray * list=AliTRDSensorArray::GetList ();
164         
165   if (list == 0x0) {
166     Log ("Error during AliTRDSensorArray::GetList");
167     Log ("DCS will not be processing");
168     return kTRUE;
169   }
170
171   Int_t nEntries = list->GetEntries ();
172   Log (Form ("%d alias loaded", nEntries));
173                 
174   Bool_t * results=new Bool_t [nEntries];
175   Int_t  * nGraph=new Int_t [nEntries];
176                 
177   for (Int_t iAlias = 0; iAlias < nEntries; iAlias++) {
178                         
179     AliTRDSensorArray * oneTRDDCS = (AliTRDSensorArray *)list->At (iAlias);
180                         
181     oneTRDDCS->SetStartTime (TTimeStamp (fStartTime));
182     oneTRDDCS->SetEndTime (TTimeStamp (fEndTime));
183                         
184     Log(Form("Processing DCS : \"%s\"", oneTRDDCS->GetStoreName ().Data ()));
185                         
186     TMap * map;
187
188     map=oneTRDDCS->ExtractDCS (dcsAliasMap);
189                 
190     nGraph [iAlias] = map->GetEntries ();
191                 
192     if (nGraph [iAlias] == 0) {
193       Log("No TGraph for this dcsDatapointAlias : not stored");
194       results [iAlias] = kFALSE;
195       error  = kTRUE;
196       continue;
197     }
198                 
199     oneTRDDCS->SetGraph(map);
200     results[iAlias]=Store("Calib", oneTRDDCS->GetStoreName().Data(), oneTRDDCS, &metaData, 0, kTRUE); 
201     delete map;         
202
203     //results [iAlias] = StoreReferenceData("Calib", oneTRDDCS->GetStoreName ().Data (), oneTRDDCS, &metaData); 
204
205     if (!results[iAlias]) {
206       AliError("Problem during StoreRef DCS");
207       error=kTRUE;
208     }
209
210     //BEGIN TEST (should not be removed ...)
211     /*
212     oneTRDDCS->ClearGraph();
213     oneTRDDCS->ClearFit();
214     oneTRDDCS->SetDiffCut2 (0.1);
215     map=oneTRDDCS->ExtractDCS (dcsAliasMap);
216     oneTRDDCS->SetGraph (map);
217     Store("Calib", ("cut_"+oneTRDDCS->GetStoreName()).Data(), oneTRDDCS, &metaData, 0, kTRUE); 
218     delete map;
219
220
221     if(iAlias==1 || iAlias==19) continue;
222     
223     oneTRDDCS->ClearGraph();
224     oneTRDDCS->ClearFit();
225     oneTRDDCS->SetDiffCut2(0);
226     map=oneTRDDCS->ExtractDCS(dcsAliasMap);
227     oneTRDDCS->MakeSplineFit(map);
228     Store("Calib", ("fit_"+oneTRDDCS->GetStoreName()).Data() , oneTRDDCS, &metaData, 0, kTRUE); 
229     delete map;
230
231      
232     oneTRDDCS->ClearGraph(); 
233     oneTRDDCS->ClearFit();
234     oneTRDDCS->SetDiffCut2 (0.1);
235     map=oneTRDDCS->ExtractDCS (dcsAliasMap);
236     oneTRDDCS->MakeSplineFit(map);
237     Store("Calib", ("cutfit_"+oneTRDDCS->GetStoreName()).Data() , oneTRDDCS, &metaData, 0, kTRUE); 
238     delete map;
239     */    
240     //END TEST
241
242   }
243                 
244   Log ("         Summury of DCS :\n");
245   Log (Form("%30s %10s %10s", "dcsDatapointAlias", "Stored ?", "# graph"));
246   for (Int_t iAlias = 0; iAlias < nEntries; iAlias++) {
247     AliTRDSensorArray * oneTRDDCS = (AliTRDSensorArray *)list->At (iAlias);
248     Log (Form ("%30s %10s %4d", 
249                oneTRDDCS->GetStoreName ().Data (),
250                results[iAlias] ? "ok" : "X",
251                nGraph [iAlias]));
252   }
253   Log ("*********** End of DCS **********");
254   
255   delete results;
256   delete nGraph;
257
258   return error;
259
260 }
261
262 //______________________________________________________________________________________________
263 Bool_t AliTRDPreprocessor::ExtractPedestals()
264 {
265   //
266   // Pedestal running on LDCs at the DAQ
267   //
268  
269   Bool_t error = kFALSE;
270
271   // Init a AliTRDCalibPadStatus
272   AliTRDCalibPadStatus calPedSum = AliTRDCalibPadStatus();
273
274   AliCDBMetaData metaData;
275   metaData.SetBeamPeriod(0);
276   metaData.SetResponsible("Raphaelle Bailhache");
277   metaData.SetComment("TRD calib test");
278   
279   // Sum the contributions of the LDCs
280   TList * listpad = GetFileSources(kDAQ,"PADSTATUS");
281   if (!listpad) {
282     Log("No list found for the PEDESTRAL Run");
283     return kTRUE;
284   }
285   
286   // loop through all files from LDCs  
287   UInt_t index = 0;
288   while (listpad->At(index)!=NULL) {
289     TObjString* fileNameEntry = (TObjString*) listpad->At(index);
290     if (fileNameEntry != NULL)
291       {
292         TString fileName = GetFile(kDAQ, "PADSTATUS",
293                                    fileNameEntry->GetString().Data());
294         if(fileName.Length() ==0){
295           Log(Form("Error by retrieving the file %d for the pedestal",(Int_t)index));
296           delete listpad;
297           return kTRUE;
298         }
299         
300         TFile *f = TFile::Open(fileName);
301         AliTRDCalibPadStatus *calPed;
302         f->GetObject("calibpadstatus",calPed);
303         
304         if(calPed){
305           
306           Int_t sm = -1; 
307
308           // analyse
309           //calPed->AnalyseHisto();
310                   
311           // Add to the calPedSum
312           for (Int_t idet=0; idet<540; idet++) {
313             AliTRDCalROC *rocMean  = calPed->GetCalRocMean(idet, kFALSE);
314             if ( rocMean )  {
315               calPedSum.SetCalRocMean(rocMean,idet);
316               sm = (Int_t) (idet / 30);
317             }
318             AliTRDCalROC *rocRMS = calPed->GetCalRocRMS(idet, kFALSE);
319             if ( rocRMS )  {
320               calPedSum.SetCalRocRMS(rocRMS,idet);
321             }
322             AliTRDCalROC *rocMeand  = calPed->GetCalRocMeand(idet, kFALSE);
323             if ( rocMeand )  {
324               calPedSum.SetCalRocMeand(rocMeand,idet);
325             }
326             AliTRDCalROC *rocRMSd = calPed->GetCalRocRMSd(idet, kFALSE);
327             if ( rocRMSd )  {
328               calPedSum.SetCalRocRMSd(rocRMSd,idet);
329             }
330           }// det loop
331
332           // store as reference data
333           TString name("PadStatus");
334           name += sm;
335           if(!StoreReferenceData("DAQData",(const char *)name,(TObject *) calPed,&metaData)){
336             Log(Form("Error storing AliTRDCalibPadStatus object %d as reference data",(Int_t)index));
337             error = kTRUE;
338           }
339
340         } // calPed
341       } // fileNameEntry
342     ++index;
343   }// while (list)
344
345   Log(Form("%d elements found in the list for the pedestal",(Int_t)index));
346   if(index==0){
347     delete listpad;
348     return kTRUE;
349   }
350
351   //
352   // Store pedestal entry to OCDB
353   //
354     
355   // Create Pad Status
356   AliTRDCalPadStatus *calPadStatus = calPedSum.CreateCalPadStatus();
357   AliCDBMetaData md3; 
358   md3.SetObjectClassName("AliTRDCalPadStatus");
359   md3.SetResponsible("Raphaelle Bailhache");
360   md3.SetBeamPeriod(1);
361   md3.SetComment("TRD calib test");
362   if(!Store("Calib","PadStatus"    ,(TObject *)calPadStatus, &md3, 0, kTRUE)){
363     Log("Error storing the pedestal");
364     delete listpad;
365     return kTRUE;
366   }
367
368   // Create Noise 
369   //Make the AliTRDCalPad
370   AliTRDCalPad *calPad2 = calPedSum.CreateCalPad();
371   AliCDBMetaData md4; 
372   md4.SetObjectClassName("AliTRDCalPad");
373   md4.SetResponsible("Raphaelle Bailhache");
374   md4.SetBeamPeriod(1);
375   md4.SetComment("TRD calib test");
376   if(!Store("Calib","PadNoise"    ,(TObject *)calPad2, &md4, 0, kTRUE)){
377     Log("Error storing the pedestal");
378     delete listpad;
379     return kTRUE;
380   }
381   //Make the AliTRDCalDet correspondant
382   AliTRDCalDet *calDet = calPedSum.CreateCalDet();
383   AliCDBMetaData md5; 
384   md5.SetObjectClassName("AliTRDCalDet");
385   md5.SetResponsible("Raphaelle Bailhache");
386   md5.SetBeamPeriod(1);
387   md5.SetComment("TRD calib test");
388   if(!Store("Calib","DetNoise"    ,(TObject *)calDet, &md5, 0, kTRUE)){
389     Log("Error storing the pedestal");
390     delete listpad;
391     return kTRUE;
392   }  
393
394   delete listpad;
395   return error; 
396
397 }
398
399 //______________________________________________________________________________________________
400 Bool_t AliTRDPreprocessor::ExtractDriftVelocityDAQ()
401 {
402   //
403   // Drift velocity DA running on monitoring servers at the DAQ
404   //
405
406   Bool_t error = kFALSE; 
407
408   // Objects for HLT and DAQ zusammen
409   AliTRDCalibraFit *calibra = AliTRDCalibraFit::Instance();
410   AliCDBMetaData metaData;
411   metaData.SetBeamPeriod(0);
412   metaData.SetResponsible("Raphaelle Bailhache");
413   metaData.SetComment("TRD calib test");
414   // Store the infos for the detector
415   AliCDBMetaData md1; 
416   md1.SetObjectClassName("AliTRDCalDet");
417   md1.SetResponsible("Raphaelle Bailhache");
418   md1.SetBeamPeriod(0);
419   md1.SetComment("TRD calib test");
420   // Store the infos for the pads
421   AliCDBMetaData md2; 
422   md2.SetObjectClassName("AliTRDCalPad");
423   md2.SetResponsible("Raphaelle Bailhache");
424   md2.SetBeamPeriod(0);
425   md2.SetComment("TRD calib test");
426
427   // Take the file from the DAQ file exchange server
428   TList *listdaq = GetFileSources(kDAQ,"VDRIFT");
429   if (!listdaq) {
430     Log("No list found for vdrift (DAQ)");
431     return kTRUE;
432   }
433   
434   if(listdaq->GetSize() !=1){
435     Log(Form("Problem on the size of the list: %d (DAQ)",listdaq->GetSize()));
436     delete listdaq;
437     return kTRUE;
438   }
439   
440   TObjString* fileNameEntry = (TObjString*) listdaq->At(0);
441   if(fileNameEntry != NULL){
442     TString fileName = GetFile(kDAQ, "VDRIFT",
443                                fileNameEntry->GetString().Data());
444     if(fileName.Length() ==0){
445       Log("Error retrieving the file vdrift (DAQ)");
446       delete listdaq;
447       return kTRUE;
448     }
449     TFile *filedaq = TFile::Open(fileName);
450     TProfile2D *histodriftvelocity = (TProfile2D *) filedaq->Get("PH2d");
451     if (histodriftvelocity) {
452       
453       // store as reference data
454       if(!StoreReferenceData("DAQData","VdriftT0",(TObject *) histodriftvelocity,&metaData)){
455         Log("Error storing 2D Profile for vdrift from the DAQ");
456         error = kTRUE;
457       }
458       
459       // analyse
460       
461       Log("Take the PH reference data. Now we will try to fit\n");
462       calibra->SetMinEntries(2000); // If there is less than 2000
463       calibra->AnalysePH(histodriftvelocity);
464       
465       Int_t nbtg = 6*4*18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb0(1))
466         + 6*  18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb2(1));
467       Int_t nbfit        = calibra->GetNumberFit();
468       Int_t nbE        = calibra->GetNumberEnt();
469       
470       // if enough statistics store the results
471       if ((nbtg >                  0) && 
472           (nbfit        >= 0.95*nbE)) {
473         // create the cal objects
474         TObjArray object      = calibra->GetVectorFit();
475         AliTRDCalDet *objdriftvelocitydet = calibra->CreateDetObjectVdrift(&object,kTRUE);
476         TObject *objdriftvelocitypad = calibra->CreatePadObjectVdrift();
477         object              = calibra->GetVectorFit2();
478         AliTRDCalDet *objtime0det         = calibra->CreateDetObjectT0(&object,kTRUE);
479         TObject *objtime0pad         = calibra->CreatePadObjectT0();
480         calibra->ResetVectorFit();
481         // store
482         if(!Store("Calib","ChamberVdrift"    ,(TObject *) objdriftvelocitydet,&md1,0,kTRUE)){
483           Log("Error storing the calibration object for the chamber vdrift (DAQ)");
484           error = kTRUE;
485         }
486         if(!Store("Calib","ChamberT0"        ,(TObject *) objtime0det        ,&md1,0,kTRUE)){
487           Log("Error storing the calibration object for the chamber t0 (DAQ)");
488           error = kTRUE;
489         }
490         if(!Store("Calib","LocalVdrift"      ,(TObject *) objdriftvelocitypad,&md2,0,kTRUE)){
491           Log("Error storing the calibration object for the local drift velocity (DAQ)");
492           error = kTRUE;
493         }
494         if(!Store("Calib","LocalT0"          ,(TObject *) objtime0pad        ,&md2,0,kTRUE)){
495           Log("Error storing the calibration object for the local time0 (DAQ)");
496           error = kTRUE;
497         }
498       }
499       else{
500         Log("Not enough statistics for the average pulse height (DAQ)");
501       }
502     } // histo here
503   }// if fileNameEntry
504   
505   delete listdaq; 
506   return error; 
507   
508 }
509
510 //______________________________________________________________________________________________
511 Bool_t AliTRDPreprocessor::ExtractHLT()
512 {
513   //
514   // Gain, vdrift and PRF calibration running on HLT
515   // return kTRUE if NULL pointer to the list
516   //
517
518   Bool_t error = kFALSE;
519
520   // Objects for HLT and DAQ zusammen
521   AliTRDCalibraFit *calibra = AliTRDCalibraFit::Instance();
522   AliCDBMetaData metaData;
523   metaData.SetBeamPeriod(0);
524   metaData.SetResponsible("Raphaelle Bailhache");
525   metaData.SetComment("TRD calib test");
526   // Store the infos for the detector
527   AliCDBMetaData md1; 
528   md1.SetObjectClassName("AliTRDCalDet");
529   md1.SetResponsible("Raphaelle Bailhache");
530   md1.SetBeamPeriod(0);
531   md1.SetComment("TRD calib test");
532   // Store the infos for the pads
533   AliCDBMetaData md2; 
534   md2.SetObjectClassName("AliTRDCalPad");
535   md2.SetResponsible("Raphaelle Bailhache");
536   md2.SetBeamPeriod(0);
537   md2.SetComment("TRD calib test");
538   
539   // Take the file from the HLT file exchange server
540   TList *listhlt = GetFileSources(kHLT,"GAINDRIFTPRF");
541   if (!listhlt) {
542     Log("No list found for the HLT");
543     return kTRUE;
544   }
545
546   if(listhlt->GetSize() != 1) {
547     Log(Form("Problem on the size of the list: %d (HLT)",listhlt->GetSize()));
548     delete listhlt;
549     return kTRUE;
550   }
551   
552   TObjString* fileNameEntry = (TObjString*) listhlt->At(0);
553   if(fileNameEntry != NULL){
554     TString fileName = GetFile(kHLT, "GAINDRIFTPRF",
555                                fileNameEntry->GetString().Data());
556     if(fileName.Length() ==0){
557       Log("Error retrieving the file (HLT)");
558       delete listhlt;
559       return kTRUE;
560     }
561     // Take the file
562     TFile *filehlt = TFile::Open(fileName);
563     
564     // gain
565     TH2I *histogain = (TH2I *) filehlt->Get("CH2d");
566     histogain->SetDirectory(0);
567     if (histogain) {
568       // store the reference data
569       if(!StoreReferenceData("HLTData","Gain",(TObject *) histogain,&metaData)){
570         Log("Error storing 2D histos for gain");
571         error = kTRUE;
572       }
573       // analyse
574       Log("Take the CH reference data. Now we will try to fit\n");
575       calibra->SetMinEntries(1000); // If there is less than 1000 entries in the histo: no fit
576       calibra->AnalyseCH(histogain);
577       Int_t nbtg = 6*4*18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb0(0))
578         + 6*  18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb2(0));
579       Int_t nbfit       = calibra->GetNumberFit();
580       Int_t nbE         = calibra->GetNumberEnt();
581       // enough statistics
582       if ((nbtg >                  0) && 
583           (nbfit        >= 0.95*nbE)) {
584         // create the cal objects
585         TObjArray object           = calibra->GetVectorFit();
586         AliTRDCalDet *objgaindet   = calibra->CreateDetObjectGain(&object);
587         TObject *objgainpad        = calibra->CreatePadObjectGain();
588         // store them
589         if(!Store("Calib","ChamberGainFactor",(TObject *) objgaindet         ,&md1,0,kTRUE)){
590           Log("Error storing the calibration object for the chamber gain");
591           error = kTRUE;
592         }
593         if(!Store("Calib","LocalGainFactor"  ,(TObject *) objgainpad         ,&md2,0,kTRUE)){
594           Log("Error storing the calibration object for the local gain factor");
595           error = kTRUE;
596         }
597       }
598       calibra->ResetVectorFit();
599     }// if histogain
600     
601     // vdrift
602     fVdriftHLT = kFALSE;
603     TProfile2D *histodriftvelocity = (TProfile2D *) filehlt->Get("PH2d");
604     histodriftvelocity->SetDirectory(0);
605     if (histodriftvelocity) {
606       // store the reference data
607       if(!StoreReferenceData("HLTData","VdriftT0",(TObject *) histodriftvelocity,&metaData)){
608         Log("Error storing 2D Profile for average pulse height (HLT)");
609         error = kTRUE;
610       }
611       // analyse
612       Log("Take the PH reference data. Now we will try to fit\n");
613       calibra->SetMinEntries(1000*20); // If there is less than 20000
614       calibra->AnalysePH(histodriftvelocity);
615       Int_t nbtg = 6*4*18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb0(1))
616         + 6*  18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb2(1));
617       Int_t nbfit        = calibra->GetNumberFit();
618       Int_t nbE          = calibra->GetNumberEnt();
619       // enough statistics
620       if ((nbtg >                  0) && 
621           (nbfit        >= 0.95*nbE)) {
622         // create the cal objects
623         TObjArray object  = calibra->GetVectorFit();
624         AliTRDCalDet *objdriftvelocitydet = calibra->CreateDetObjectVdrift(&object,kTRUE);
625         TObject *objdriftvelocitypad      = calibra->CreatePadObjectVdrift();
626         object              = calibra->GetVectorFit2();
627         AliTRDCalDet *objtime0det  = calibra->CreateDetObjectT0(&object,kTRUE);
628         TObject *objtime0pad       = calibra->CreatePadObjectT0();
629         // store them
630         if(!Store("Calib","ChamberVdrift"    ,(TObject *) objdriftvelocitydet,&md1,0,kTRUE)){
631           Log("Error storing the calibration object for the chamber vdrift (HLT)");
632           error = kTRUE;                
633         }
634         if(!Store("Calib","ChamberT0"        ,(TObject *) objtime0det        ,&md1,0,kTRUE)){
635           Log("Error storing the calibration object for the chamber t0 (HLT)");
636           error = kTRUE;
637         }
638         if(!Store("Calib","LocalVdrift"      ,(TObject *) objdriftvelocitypad,&md2,0,kTRUE)){
639           Log("Error storing the calibration object for the local drift velocity (HLT)");
640           error = kTRUE;
641         }
642         if(!Store("Calib","LocalT0"          ,(TObject *) objtime0pad        ,&md2,0,kTRUE)){
643           Log("Error storing the calibration object for the local time0 (HLT)");
644           error = kTRUE;
645         }
646         fVdriftHLT = kTRUE;
647       }
648       calibra->ResetVectorFit();
649     }// if TProfile2D
650     
651     // prf
652     TProfile2D *histoprf = (TProfile2D *) filehlt->Get("PRF2d");
653     histoprf->SetDirectory(0);
654     if (histoprf) {
655       // store reference data
656       if(!StoreReferenceData("HLTData","PRF",(TObject *) histoprf,&metaData)){
657         Log("Error storing the 2D Profile for Pad Response Function");
658         error = kTRUE;
659       }
660       // analyse
661       Log("Take the PRF reference data. Now we will try to fit\n");
662       calibra->SetMinEntries(600); // If there is less than 20000
663       calibra->AnalysePRFMarianFit(histoprf);
664       Int_t nbtg = 6*4*18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb0(2))
665         + 6*  18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb2(2));
666       Int_t nbfit        = calibra->GetNumberFit();
667       Int_t nbE          = calibra->GetNumberEnt();
668       // enough statistics
669       if ((nbtg >                  0) && 
670           (nbfit        >= 0.95*nbE)) {
671         // create cal pad objects 
672         TObjArray object            = calibra->GetVectorFit();
673         TObject *objPRFpad          = calibra->CreatePadObjectPRF(&object);
674         // store them
675         if(!Store("Calib","PRFWidth"         ,(TObject *) objPRFpad          ,&md2,0,kTRUE)){
676           Log("Error storing the calibration object for the Pad Response Function");
677           error = kTRUE;
678         }
679       }
680       calibra->ResetVectorFit();
681     }// if PRF
682   }// if fileNameEntry
683   
684   delete listhlt;
685   return error;
686   
687 }
688
689 //_____________________________________________________________________________
690 UInt_t AliTRDPreprocessor::ProcessDCSConfigData()
691 {
692   // 
693   // process the configuration of FEE, PTR and GTU
694   // reteive XML file from the DCS FXS
695   // parse it and store TObjArrays in the CDB
696   // return 0 for success, otherwise:
697   // 5: could not get the file from the FXS
698   // 6: ERROR in XML validation: something wrong with the file
699   // 7: ERROR while creating calibration objects in the handler
700   // 8: error while storing data in the CDB
701   //
702
703   Log("Processing the DCS config summary file.");
704
705   // get the XML file
706   const char * nameFile = GetFile(kDCS,"CONFIGSUMMARY","");
707   if (nameFile == NULL) {
708     return 5;
709     Log(Form("File %s not found!",nameFile));
710   }
711
712   // create parser and parse
713   TSAXParser saxParser;
714   AliTRDSaxHandler saxHandler;
715   saxParser.ConnectToHandler("AliTRDSaxHandler", &saxHandler);
716   saxParser.ParseFile(nameFile);
717
718   // report errors if present
719   if (saxParser.GetParseCode() == 0) {
720     Log("XML file validation OK");
721   } else {
722     Log(Form("ERROR in XML file validation. Parsecode: %s", saxParser.GetParseCode()));
723     return 6;
724   }
725   if (saxHandler.GetHandlerStatus() != 0) {
726     Log(Form("ERROR while creating calibration objects. Error code: %s", saxHandler.GetHandlerStatus()));
727     return 7;
728   }
729
730   // get the calibration object storing the data from the handler
731   AliTRDCalDCS* fCalDCSObj = saxHandler.GetCalDCSObj();
732
733   // store the DCS calib data in the CDB
734   AliCDBMetaData metaData1;
735   metaData1.SetBeamPeriod(0);
736   metaData1.SetResponsible("Frederick Kramer");
737   metaData1.SetComment("DCS configuration data in one AliTRDCalDCS object.");
738   if (!Store("Calib", "DCSCONFIG", fCalDCSObj, &metaData1, 0, kTRUE)) {
739     Log("problems while storing DCS config data object");
740     return 8;
741   }
742
743   return 0;
744 }
745