Replace AliTRDCalibra
[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 //                                                                        //
25 // Author:                                                                //
26 //   R. Bailhache (R.Bailhache@gsi.de)                                    //
27 //                                                                        //
28 ////////////////////////////////////////////////////////////////////////////
29
30 #include "AliTRDPreprocessor.h"
31
32 #include <TTimeStamp.h>
33 #include <TFile.h>
34 #include <TProfile2D.h>
35 #include <TH2I.h>
36 #include <TStopwatch.h>
37 #include <TObjString.h>
38 #include <TString.h>
39 #include <TList.h>
40 #include <TCollection.h>
41
42 #include "AliCDBMetaData.h"
43 #include "AliDCSValue.h"
44 #include "AliLog.h"
45
46 #include "AliTRDCalibra.h"
47 #include "Cal/AliTRDCalDet.h"
48
49 ClassImp(AliTRDPreprocessor)
50
51 //______________________________________________________________________________________________
52 AliTRDPreprocessor::AliTRDPreprocessor(AliShuttleInterface *shuttle)
53                    :AliPreprocessor("TRD", shuttle)
54 {
55   //
56   // Constructor
57   //
58
59 }
60
61 //______________________________________________________________________________________________
62 AliTRDPreprocessor::~AliTRDPreprocessor()
63 {
64   //
65   // Destructor
66   //
67
68 }
69
70 //______________________________________________________________________________________________
71 void AliTRDPreprocessor::Initialize(Int_t run, UInt_t startTime, UInt_t endTime)
72 {
73   //
74   // Initialization routine for the TRD preprocessor
75   //
76
77   AliPreprocessor::Initialize(run,startTime,endTime);
78
79 }
80
81 //______________________________________________________________________________________________
82 UInt_t AliTRDPreprocessor::Process(TMap* /*dcsAliasMap*/)
83 {
84   //
85   // Process the calibration data for the HLT part
86   //
87
88   // How long does it take for the HLT part?
89   TStopwatch timer;
90   timer.Start();
91
92   // Metadata for the reference data
93   AliCDBMetaData metaData;
94   metaData.SetBeamPeriod(1);
95   metaData.SetResponsible("Raphaelle Bailhache");
96   metaData.SetComment("This preprocessor fills reference data.");
97
98   // Take the file from the HLT file exchange server
99   TList *filesources = GetFileSources(kHLT,"GAINDRIFTPRF");
100   if (!filesources) {
101     AliError(Form("No sources found for GAINDRIFTPRF for run %d !",fRun));
102     return 0;
103   }
104   if (filesources->GetSize() != 1) {
105     AliError(Form("More than one source found for GAINDRIFTPRF for run %d!",fRun));
106     return 0;
107   }
108
109   // Call a AliTRDCalibra instance for fit
110   AliTRDCalibra *calibra = AliTRDCalibra::Instance();
111
112   // Init some things
113   AliTRDCalDet *objgaindet          = 0x0; // Object for det average gain factor
114   AliTRDCalDet *objdriftvelocitydet = 0x0; // Object for det average drift velocity
115   AliTRDCalDet *objtime0det         = 0x0; // Object for det average time0 
116   TObject      *objgainpad          = 0x0; // Object for pad (relative to the det) gain factor
117   TObject      *objdriftvelocitypad = 0x0; // Object for pad (relative to the det) drift velocity
118   TObject      *objtime0pad         = 0x0; // Object for pad (relative to the det) time0
119   TObject      *objPRFpad           = 0x0; // Object for pad prf width
120   TH2I         *histogain           = 0x0; // Histogram taken from HLT for gain factor
121   TProfile2D   *histodriftvelocity  = 0x0; // Profile taken from HLT for drift velocity and time0
122   TProfile2D   *histoprf            = 0x0; // Profile taken from HLT for prf
123
124   Int_t    numberfit[3]        = { 0,   0,   0   }; // Number of histos fitted for gain, drift velocity and prf
125   Int_t    numberEnt[3]        = { 0,   0,   0   }; // Number of histos with entries
126   Double_t statisticmean[3]    = { 0.0, 0.0, 0.0 }; // Mean values of the number of entries in these histos
127   Int_t    numbertotalgroup[3] = { 0,   0,   0   }; // Total number of groups
128
129   // Loop over the files taken from the HLT
130   TIter iter(filesources);
131   TObjString *source;
132   while ((source = dynamic_cast<TObjString *> (iter.Next()))) {
133     
134     TString filename = GetFile(kHLT,"GAINDRIFTPRF",source->GetName());
135     if (filename.Length() == 0) {
136       AliError(Form("Error retrieving file from source %d failed!", source->GetName()));
137       delete filesources;
138       return 0;
139     }
140
141     // Take the histos
142     TFile *file = TFile::Open(filename);
143     histogain = (TH2I *) file->Get("CH2d");
144     histogain->SetDirectory(0);
145     if (!histogain) {
146       AliError("Error retrieving 2D histos for gain failed!");
147     }
148     histodriftvelocity = (TProfile2D *) file->Get("PH2d");
149     histodriftvelocity->SetDirectory(0);
150     if (!histodriftvelocity) {
151       AliError("Error retrieving 2D Profile for average pulse height failed!");
152     }
153     histoprf = (TProfile2D *) file->Get("PRF2d");
154     histoprf->SetDirectory(0);
155     if (!histoprf) {
156       AliError("Error retrieving 2D Profile for Pad Response Function failed!");
157     }
158     file->Close();
159
160     // Set the mode of calibration from the TObject, store the reference data and try to fit them
161     if (histogain) {
162       calibra->SetModeCalibrationFromTObject((TObject *) histogain,0);
163       StoreReferenceData("HLTData","Gain",(TObject *) histogain,&metaData);
164       AliInfo("Take the CH reference data. Now we will try to fit\n");
165       calibra->SetMinEntries(100); // If there is less than 100 entries in the histo: no fit
166       calibra->FitCHOnline(histogain);
167       numbertotalgroup[0] = 6*4*18*((Int_t) calibra->GetDetChamb0(0))
168                           + 6*  18*((Int_t) calibra->GetDetChamb2(0));
169       numberfit[0]        = calibra->GetNumberFit();
170       statisticmean[0]    = calibra->GetStatisticMean(); 
171       numberEnt[0]        = calibra->GetNumberEnt();
172       objgaindet          = calibra->CreateDetObjectTree(calibra->GetGain(),0);
173       objgainpad          = calibra->CreatePadObjectTree(calibra->GetGain(),0,objgaindet);
174     }
175     
176     if (histodriftvelocity) {
177       calibra->SetModeCalibrationFromTObject((TObject *) histodriftvelocity,1);
178       StoreReferenceData("HLTData","VdriftT0",(TObject *) histodriftvelocity,&metaData);
179       AliInfo("Take the PH reference data. Now we will try to fit\n");
180       calibra->SetMinEntries(100*20); // If there is less than 2000
181       calibra->FitPHOnline(histodriftvelocity);
182       numbertotalgroup[1] = 6*4*18*((Int_t) calibra->GetDetChamb0(1))
183                           + 6*  18*((Int_t) calibra->GetDetChamb2(1));
184       numberfit[1]        = calibra->GetNumberFit();
185       statisticmean[1]    = calibra->GetStatisticMean(); 
186       numberEnt[1]        = calibra->GetNumberEnt();
187       objdriftvelocitydet = calibra->CreateDetObjectTree(calibra->GetVdrift(),1);
188       objdriftvelocitypad = calibra->CreatePadObjectTree(calibra->GetVdrift(),1,objdriftvelocitydet);
189       objtime0det         = calibra->CreateDetObjectTree(calibra->GetT0(),3);
190       objtime0pad         = calibra->CreatePadObjectTree(calibra->GetT0(),3,objtime0det);
191     }
192     
193     if (histoprf) {
194       calibra->SetModeCalibrationFromTObject((TObject *) histoprf,2);
195       StoreReferenceData("HLTData","PRF",(TObject *) histoprf,&metaData);
196       AliInfo("Take the PRF reference data. Now we will try to fit\n");
197       calibra->SetMinEntries(100*20); // If there is less than 2000
198       calibra->SetRangeFitPRF(0.5);
199       calibra->FitPRFOnline(histoprf);
200       numbertotalgroup[2] = 6*4*18*((Int_t) calibra->GetDetChamb0(2))
201                           + 6*  18*((Int_t) calibra->GetDetChamb2(2));
202       numberfit[2]        = calibra->GetNumberFit();
203       statisticmean[2]    = calibra->GetStatisticMean(); 
204       numberEnt[2]        = calibra->GetNumberEnt();
205       objPRFpad           = calibra->CreatePadObjectTree(calibra->GetPRF());
206     }
207
208   }
209   
210   // Bilan of the fit statistic
211   AliInfo(Form("The mean number of entries required for a fit is: %d"
212               ,(Int_t) calibra->GetMinEntries()));
213   AliInfo(Form("FOR THE CH: There is a mean statistic of: %f, with %d fits for %d groups and %d histos with entries"
214               ,statisticmean[0],numberfit[0],numbertotalgroup[0],numberEnt[0]));
215   AliInfo(Form("FOR THE PH: There is a mean statistic of: %f, with %d fits for %d groups and %d histos with entries"
216               ,statisticmean[1],numberfit[1],numbertotalgroup[1],numberEnt[1]));
217   AliInfo(Form("FOR THE PRF: There is a mean statistic of: %f, with %d fits for %d groups and %d histos with entries"
218               ,statisticmean[2],numberfit[2],numbertotalgroup[2],numberEnt[2]));
219   
220
221   //
222   // Store the coefficients in the grid OCDB if enough statistics
223   //
224   
225   // Store the infos for the detector
226   AliCDBMetaData *md1= new AliCDBMetaData(); 
227   md1->SetObjectClassName("AliTRDCalDet");
228   md1->SetResponsible("Raphaelle Bailhache");
229   md1->SetBeamPeriod(1);
230   md1->SetAliRootVersion("01-10-06"); // root version
231   md1->SetComment("The dummy values in this calibration file are for testing only");
232   if ((numbertotalgroup[0] >                  0) && 
233       (numberfit[0]        >= 0.95*numberEnt[0])) {
234     Store("Calib","ChamberGainFactor",(TObject *) objgaindet         ,md1,0,kTRUE);
235   }
236   if ((numbertotalgroup[1] >                  0) && 
237       (numberfit[1]        >= 0.95*numberEnt[1])) {
238     Store("Calib","ChamberVdrift"    ,(TObject *) objdriftvelocitydet,md1,0,kTRUE);
239     Store("Calib","ChamberT0"        ,(TObject *) objtime0det        ,md1,0,kTRUE);
240   }
241   
242   // Store the infos for the pads
243   AliCDBMetaData *md2= new AliCDBMetaData(); 
244   md2->SetObjectClassName("AliTRDCalPad");
245   md2->SetResponsible("Raphaelle Bailhache");
246   md2->SetBeamPeriod(1);
247   md2->SetAliRootVersion("01-10-06"); //root version
248   md2->SetComment("The dummy values in this calibration file are for testing only");
249   if ((numbertotalgroup[0] >                  0) && 
250       (numberfit[0]        >= 0.95*numberEnt[0])) {
251     Store("Calib","LocalGainFactor"  ,(TObject *) objgainpad         ,md2,0,kTRUE);
252   }
253   if ((numbertotalgroup[1] >                  0) && 
254       (numberfit[1]        >= 0.95*numberEnt[1])) {
255     Store("Calib","LocalVdrift"      ,(TObject *) objdriftvelocitypad,md2,0,kTRUE);
256     Store("Calib","LocalT0"          ,(TObject *) objtime0pad        ,md2,0,kTRUE);
257   }
258   if ((numbertotalgroup[2] >                  0) && 
259       (numberfit[2]        >= 0.95*numberEnt[2])) {
260     Store("Calib","PRFWidth"         ,(TObject *) objPRFpad          ,md2,0,kTRUE);
261   }
262   
263   // End
264   delete filesources;
265   timer.Stop();
266   timer.Print();
267   return 1;  
268
269 }