]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TRD/AliTRDPreprocessor.cxx
New AliTRDSensor classes by Wilfried
[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 "AliTRDPreprocessor.h"
35
36 #include <TFile.h>
37 #include <TProfile2D.h>
38 #include <TStopwatch.h>
39 #include <TObjString.h>
40 #include <TString.h>
41 #include <TList.h>
42 #include <TCollection.h>
43
44 #include "AliCDBMetaData.h"
45 #include "AliLog.h"
46
47 #include "AliTRDCalibraFit.h"
48 #include "AliTRDCalibraMode.h"
49 #include "AliTRDSensorArray.h"
50
51 ClassImp(AliTRDPreprocessor)
52
53 //______________________________________________________________________________________________
54 AliTRDPreprocessor::AliTRDPreprocessor(AliShuttleInterface *shuttle)
55                    :AliPreprocessor("TRD", shuttle)
56 {
57   //
58   // Constructor
59   //
60
61 }
62
63 //______________________________________________________________________________________________
64 AliTRDPreprocessor::~AliTRDPreprocessor()
65 {
66   //
67   // Destructor
68   //
69
70 }
71
72 //______________________________________________________________________________________________
73 void AliTRDPreprocessor::Initialize(Int_t run, UInt_t startTime, UInt_t endTime)
74 {
75   //
76   // Initialization routine for the TRD preprocessor
77   //
78
79   AliPreprocessor::Initialize(run,startTime,endTime);
80
81 }
82
83 //______________________________________________________________________________________________
84 UInt_t AliTRDPreprocessor::Process(TMap* dcsAliasMap)
85 {
86   //
87   // Process DCS and calibration part for HLT
88   //
89
90   UInt_t result = 0;
91
92   //
93   // DCS
94   //
95   
96   AliCDBMetaData metaData;
97   metaData.SetBeamPeriod(0);
98   metaData.SetResponsible("Wilfried Monange/Raphaelle Bailhache");
99   metaData.SetComment("TRD calib test");
100         
101         
102   Log ("****** DCS ******\n");
103         
104   TObjArray * list = AliTRDSensorArray::GetList ();
105         
106   if (list == 0x0) {
107           Log ("Error during AliTRDSensorArray::GetList");
108           Log ("DCS will not be processing");
109   }else { 
110         
111         Int_t nEntries = list->GetEntries ();
112         Log (Form ("%d alias loaded", nEntries));
113                 
114         Bool_t * results = new Bool_t [nEntries];
115         Int_t  * nGraph = new Int_t [nEntries];
116                 
117         for (Int_t iAlias = 0; iAlias < nEntries; iAlias++) {
118                         
119                 AliTRDSensorArray * oneTRDDCS = (AliTRDSensorArray *)list->At (iAlias);
120                         
121                 oneTRDDCS->SetStartTime (TTimeStamp (fStartTime));
122                 oneTRDDCS->SetEndTime (TTimeStamp (fEndTime));
123                         
124                 Log (Form("Processing DCS : \"%s\"", 
125                         oneTRDDCS->GetStoreName ().Data ()));
126                         
127                 TMap * map = oneTRDDCS->ExtractDCS (dcsAliasMap);
128                 
129                 nGraph [iAlias] = map->GetEntries ();
130                 
131                 if (nGraph [iAlias] == 0) {
132                         Log("No TGraph for this dcsDatapointAlias : not stored");
133                         results [iAlias] = kFALSE;
134                         result |= kEStoreRefDCS;
135                         continue;
136                 }
137                 
138                 oneTRDDCS->SetGraph (map);
139
140                 results [iAlias] = Store("Calib", 
141                                                                  oneTRDDCS->GetStoreName ().Data (), 
142                                                                  oneTRDDCS,  
143                                                                  &metaData,
144                                                                  0, 
145                                                                  kTRUE); 
146                 
147                 /*      
148                 results [iAlias] = StoreReferenceData("Calib", 
149                                                                                                 oneTRDDCS->GetStoreName ().Data (), 
150                                                                                                 oneTRDDCS, 
151                                                                                                 &metaData); 
152                 */
153                 if (!results [iAlias]) {
154                         AliError("Problem during StoreRef DCS"); 
155                         result |= kEStoreRefDCS;
156                 }
157                         
158                 delete map;
159                         
160                 /*
161                         //BEGIN TEST
162                 oneTRDDCS->SetDiffCut2 (0.1);
163                 map = oneTRDDCS->ExtractDCS (dcsAliasMap);
164                 oneTRDDCS->SetGraph (map);
165                         
166                 StoreReferenceData("Calib", 
167                                                         (oneTRDDCS->GetStoreName ()+"Cut").Data(), 
168                                                         oneTRDDCS, &metaData); 
169                 delete map;
170                         //END TEST
171                 */
172         }
173                 
174         Log ("         Summury of DCS :\n");
175         Log (Form("%30s %10s %10s", "dcsDatapointAlias", "Stored ?", "# graph"));
176         for (Int_t iAlias = 0; iAlias < nEntries; iAlias++) {
177                 AliTRDSensorArray * oneTRDDCS = (AliTRDSensorArray *)list->At (iAlias);
178                 Log (Form ("%30s %10s %4d", 
179                         oneTRDDCS->GetStoreName ().Data (),
180                         results[iAlias] ? "ok" : "X",
181                         nGraph [iAlias]));
182         }
183         Log ("*********** End of DCS **********");
184         
185         delete results;
186         delete nGraph;
187   }
188
189   //
190   // Process the calibration data for the HLT part
191   //
192
193   // How long does it take for the HLT part?
194   TStopwatch timer;
195   timer.Start();
196
197   //Run type
198   TString runType = GetRunType();
199   Log(Form("Run type for run %d: %s", fRun, runType.Data()));
200   if (strcmp(runType, "PHYSICS") != 0){
201     Log("Nothing to do!");
202     return 0;
203   }
204
205
206   // note that the parameters are returned as character strings!
207   const char* nEvents = GetRunParameter("totalEvents");
208   if (nEvents) {
209     Log(Form("Number of events for run %d: %s",fRun, nEvents));
210   } else {
211     Log(Form("Number of events not put in logbook!"));
212   }
213
214   // Take the file from the HLT file exchange server
215   TList *filesources = GetFileSources(kHLT,"GAINDRIFTPRF");
216   if (!filesources) {
217     Log(Form("No sources found for GAINDRIFTPRF for run %d !",fRun));
218     return 1;
219   }
220   if (filesources->GetSize() != 1) {
221     Log(Form("More than one source found for GAINDRIFTPRF for run %d!",fRun));
222     filesources->Print();
223     delete filesources;
224     return 1;
225   }
226
227   // Call a AliTRDCalibra instance for fit
228   AliTRDCalibraFit *calibra = AliTRDCalibraFit::Instance();
229
230   //Choose the fit methods
231   calibra->SetFitChargeNDB(4); //for the relative gain
232   calibra->SetFitMeanWOn();   //weighted mean
233   calibra->SetFitPHNDB(3);    //for the average pulse height
234   calibra->SetFitLagrPolOn(); //LagrPol
235   calibra->SetFitPRFNDB(0);   //for the PRF
236   calibra->SetFitPRFOn();     //gaussian fit
237
238   //Debug mode
239   //calibra->SetDebug(1);       //Debug
240
241   // Init some things
242   AliTRDCalDet *objgaindet          = 0x0; // Object for det average gain factor
243   AliTRDCalDet *objdriftvelocitydet = 0x0; // Object for det average drift velocity
244   AliTRDCalDet *objtime0det         = 0x0; // Object for det average time0 
245   TObject      *objgainpad          = 0x0; // Object for pad (relative to the det) gain factor
246   TObject      *objdriftvelocitypad = 0x0; // Object for pad (relative to the det) drift velocity
247   TObject      *objtime0pad         = 0x0; // Object for pad (relative to the det) time0
248   TObject      *objPRFpad           = 0x0; // Object for pad prf width
249   TH2I         *histogain           = 0x0; // Histogram taken from HLT for gain factor
250   TProfile2D   *histodriftvelocity  = 0x0; // Profile taken from HLT for drift velocity and time0
251   TProfile2D   *histoprf            = 0x0; // Profile taken from HLT for prf
252
253   Int_t    numberfit[3]        = { 0,   0,   0   }; // Number of histos fitted for gain, drift velocity and prf
254   Int_t    numberEnt[3]        = { 0,   0,   0   }; // Number of histos with entries
255   Double_t statisticmean[3]    = { 0.0, 0.0, 0.0 }; // Mean values of the number of entries in these histos
256   Int_t    numbertotalgroup[3] = { 0,   0,   0   }; // Total number of groups
257
258   // Loop over the files taken from the HLT
259   TIter iter(filesources);
260   TObjString *source;
261   while ((source = dynamic_cast<TObjString *> (iter.Next()))) {
262     
263     TString filename = GetFile(kHLT,"GAINDRIFTPRF",source->GetName());
264     if (filename.Length() == 0) {
265       Log(Form("Error retrieving file from source %d failed!", source->GetName()));
266       delete filesources;
267       return 2;
268     }
269
270     // Take the histos
271     TFile *file = TFile::Open(filename);
272     histogain = (TH2I *) file->Get("CH2d");
273     histogain->SetDirectory(0);
274     if (!histogain) {
275       Log("Error retrieving 2D histos for gain failed!");
276       delete filesources;
277       return 2;
278     }
279     histodriftvelocity = (TProfile2D *) file->Get("PH2d");
280     histodriftvelocity->SetDirectory(0);
281     if (!histodriftvelocity) {
282       Log("Error retrieving 2D Profile for average pulse height failed!");
283       delete filesources;
284       return 2;
285     }
286     histoprf = (TProfile2D *) file->Get("PRF2d");
287     histoprf->SetDirectory(0);
288     if (!histoprf) {
289       Log("Error retrieving 2D Profile for Pad Response Function failed!");
290       delete filesources;
291       return 2;
292     }
293     file->Close();
294
295     // Set the mode of calibration from the TObject, store the reference data and try to fit them
296     if (histogain) {
297       calibra->SetModeCalibrationFromTObject((TObject *) histogain,0);
298       if(!StoreReferenceData("HLTData","Gain",(TObject *) histogain,&metaData)){
299         Log("Error storing 2D histos for gain as reference data");
300         delete filesources;
301         return 3;
302       }
303       Log("Take the CH reference data. Now we will try to fit\n");
304       calibra->SetMinEntries(100); // If there is less than 100 entries in the histo: no fit
305       calibra->FitCHOnline(histogain);
306       numbertotalgroup[0] = 6*4*18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb0(0))
307                           + 6*  18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb2(0));
308       numberfit[0]        = calibra->GetNumberFit();
309       statisticmean[0]    = calibra->GetStatisticMean(); 
310       numberEnt[0]        = calibra->GetNumberEnt();
311       objgaindet          = calibra->CreateDetObjectTree(calibra->GetGain(),0);
312       objgainpad          = calibra->CreatePadObjectTree(calibra->GetGain(),0,objgaindet);
313     }
314     
315     if (histodriftvelocity) {
316       calibra->SetModeCalibrationFromTObject((TObject *) histodriftvelocity,1);
317       if(!StoreReferenceData("HLTData","VdriftT0",(TObject *) histodriftvelocity,&metaData)){
318         Log("Error storing 2D Profile for average pulse height as reference data");
319         delete filesources;
320         return 3;
321       }
322       Log("Take the PH reference data. Now we will try to fit\n");
323       calibra->SetMinEntries(100*20); // If there is less than 2000
324       calibra->FitPHOnline(histodriftvelocity);
325       numbertotalgroup[1] = 6*4*18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb0(1))
326                           + 6*  18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb2(1));
327       numberfit[1]        = calibra->GetNumberFit();
328       statisticmean[1]    = calibra->GetStatisticMean(); 
329       numberEnt[1]        = calibra->GetNumberEnt();
330       objdriftvelocitydet = calibra->CreateDetObjectTree(calibra->GetVdrift(),1);
331       objdriftvelocitypad = calibra->CreatePadObjectTree(calibra->GetVdrift(),1,objdriftvelocitydet);
332       objtime0det         = calibra->CreateDetObjectTree(calibra->GetT0(),3);
333       objtime0pad         = calibra->CreatePadObjectTree(calibra->GetT0(),3,objtime0det);
334     }
335     
336     if (histoprf) {
337       calibra->SetModeCalibrationFromTObject((TObject *) histoprf,2);
338       if(!StoreReferenceData("HLTData","PRF",(TObject *) histoprf,&metaData)){
339         Log("Error storing the 2D Profile for Pad Response Function as reference data");
340         delete filesources;
341         return 3;
342       }
343       Log("Take the PRF reference data. Now we will try to fit\n");
344       calibra->SetMinEntries(100*20); // If there is less than 2000
345       calibra->SetRangeFitPRF(0.5);
346       calibra->FitPRFOnline(histoprf);
347       numbertotalgroup[2] = 6*4*18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb0(2))
348                            + 6*  18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb2(2));
349       numberfit[2]        = calibra->GetNumberFit();
350       statisticmean[2]    = calibra->GetStatisticMean(); 
351       numberEnt[2]        = calibra->GetNumberEnt();
352       objPRFpad           = calibra->CreatePadObjectTree(calibra->GetPRF());
353     }
354
355   }
356   
357   // Bilan of the fit statistic
358   Log(Form("The mean number of entries required for a fit is: %d"
359               ,(Int_t) calibra->GetMinEntries()));
360   Log(Form("FOR THE CH: There is a mean statistic of: %f, with %d fits for %d groups and %d histos with entries"
361               ,statisticmean[0],numberfit[0],numbertotalgroup[0],numberEnt[0]));
362   Log(Form("FOR THE PH: There is a mean statistic of: %f, with %d fits for %d groups and %d histos with entries"
363               ,statisticmean[1],numberfit[1],numbertotalgroup[1],numberEnt[1]));
364   Log(Form("FOR THE PRF: There is a mean statistic of: %f, with %d fits for %d groups and %d histos with entries"
365               ,statisticmean[2],numberfit[2],numbertotalgroup[2],numberEnt[2]));
366   
367   
368   //
369   // Store the coefficients in the grid OCDB if enough statistics
370   //
371   
372   // Store the infos for the detector
373   AliCDBMetaData *md1= new AliCDBMetaData(); 
374   md1->SetObjectClassName("AliTRDCalDet");
375   md1->SetResponsible("Raphaelle Bailhache");
376   md1->SetBeamPeriod(1);
377   md1->SetAliRootVersion("01-10-06"); // root version
378   md1->SetComment("The dummy values in this calibration file are for testing only");
379   // Gain
380   if ((numbertotalgroup[0] >                  0) && 
381       (numberfit[0]        >= 0.95*numberEnt[0])) {
382     if(!Store("Calib","ChamberGainFactor",(TObject *) objgaindet         ,md1,0,kTRUE)){
383       Log("Error storing the calibration object for the chamber gain");
384       delete filesources;
385       return 4;
386     }
387   }
388   else{
389     Log("Not enough statistics for the gain");
390   }
391   // Vdrift and time0
392   if ((numbertotalgroup[1] >                  0) && 
393       (numberfit[1]        >= 0.95*numberEnt[1])) {
394     if(!Store("Calib","ChamberVdrift"    ,(TObject *) objdriftvelocitydet,md1,0,kTRUE)){
395       Log("Error storing the calibration object for the chamber vdrift");
396       delete filesources;
397       return 4;
398     }
399     if(!Store("Calib","ChamberT0"        ,(TObject *) objtime0det        ,md1,0,kTRUE)){
400       Log("Error storing the calibration object for the chamber t0");
401       delete filesources;
402       return 4;
403     }
404   }
405   else{
406     Log("Not enough statistics for the average pulse height");
407   }
408   
409   // Store the infos for the pads
410   AliCDBMetaData *md2= new AliCDBMetaData(); 
411   md2->SetObjectClassName("AliTRDCalPad");
412   md2->SetResponsible("Raphaelle Bailhache");
413   md2->SetBeamPeriod(1);
414   md2->SetAliRootVersion("01-10-06"); //root version
415   md2->SetComment("The dummy values in this calibration file are for testing only");
416   // Gain
417   if ((numbertotalgroup[0] >                  0) && 
418       (numberfit[0]        >= 0.95*numberEnt[0])) {
419     if(!Store("Calib","LocalGainFactor"  ,(TObject *) objgainpad         ,md2,0,kTRUE)){
420       Log("Error storing the calibration object for the local gain factor");
421       delete filesources;
422       return 4;
423     }
424   }
425   // Vdrift and time0
426   if ((numbertotalgroup[1] >                  0) && 
427       (numberfit[1]        >= 0.95*numberEnt[1])) {
428     if(!Store("Calib","LocalVdrift"      ,(TObject *) objdriftvelocitypad,md2,0,kTRUE)){
429       Log("Error storing the calibration object for the local drift velocity");
430       delete filesources;
431       return 4;
432     }
433     if(!Store("Calib","LocalT0"          ,(TObject *) objtime0pad        ,md2,0,kTRUE)){
434       Log("Error storing the calibration object for the local time0");
435       delete filesources;
436       return 4;
437     }
438   }
439   // Pad Response Width
440   if ((numbertotalgroup[2] >                  0) && 
441       (numberfit[2]        >= 0.95*numberEnt[2])) {
442     if(!Store("Calib","PRFWidth"         ,(TObject *) objPRFpad          ,md2,0,kTRUE)){
443       Log("Error storing the calibration object for the Pad Response Function");
444       delete filesources;
445       return 4;
446     }
447   }
448   else{
449     Log("Not enough statistics for the Pad Response Function");
450   }
451   
452   // End
453   delete filesources;
454   timer.Stop();
455   timer.Print();
456   return 0;  
457
458 }