2f398679 |
1 | void AliPHOSCalibDataTest(){ |
2 | |
3 | |
4 | /*************************************************************************************************************** |
5 | Prelude(0): if it doesn't exist, create DB directory: $ALICE_ROOT/DB |
6 | ***************************************************************************************************************/ |
7 | TString DBFolder="PhosCalibDB"; |
8 | gSystem->ExpandPathName(DBFolder); |
9 | |
10 | if(!gSystem->OpenDirectory(DBFolder)){ |
11 | printf("Warning: folder PhosCalibDB does not exist, I will create it!"); |
12 | TString command = "mkdir "+ DBFolder; |
13 | gSystem->Exec(command.Data()); |
14 | } |
15 | |
16 | /*************************************************************************************************************** |
17 | Prelude(1): create a DB object. We'll take AliPHOSCalibData |
18 | (container class for PHOS Calibration data) as an example |
19 | ***************************************************************************************************************/ |
20 | |
21 | AliPHOSCalibData *calibda=new AliPHOSCalibData("PHOS"); |
22 | |
23 | // Fill array of PHOS energy calibration factors (4 float's) with some numbers |
24 | Float_t EnFactorsArray[5][64][56]; |
25 | for(Int_t module=0; module<5; module++) { |
26 | for(Int_t column=0; column<64; column++) { |
27 | for(Int_t row=0; row<56; row++) { |
28 | calibda->SetADCchannelEmc(module,column,row,1.1); |
29 | calibda->SetADCpedestalEmc(module,column,row,0.5); |
30 | } |
31 | } |
32 | } |
33 | |
34 | printf("\nI am in Prelude(1). PHOS Energy calibration factors: \n"); |
35 | calibda->Print("ped gain"); |
36 | |
37 | /*************************************************************************************************************** |
38 | Part 1: Store the calibration object in the database, using |
39 | the "Organized" storage system |
40 | (i.e. a well defined directory structure, defined by the |
41 | object's metadata and set in the DBFodler above specified) |
42 | ***************************************************************************************************************/ |
43 | |
44 | // a. Define the object's metadata (set of information which describes the object) |
45 | // AliObjectMetaData(char* name, int firstRun, int lastRun,int Period,char* ObjectFormat, char* ResponsibleName, char* extraInfo) |
46 | // |
47 | // name: Object's name ("Detector/DBType/DetSpecType") |
48 | // firstRun: first run for which the object is valid |
49 | // lastRun: last run for which the object is valid |
50 | // period: beam period (to be better specified in future) |
51 | // objectFormat: a string which describes the object's format |
52 | // ResponsibleName: name of the person who created and stored the object |
53 | // extraInfo: anything else you may want to know |
54 | |
55 | AliObjectMetaData omd("PHOS/Calib/GainFactors",1,10,1,"AliPHOSCalibData: Pedestals and ADC channels (5x64x56 floats)","Yuri Kharlov", "PHOS calibration test"); |
56 | |
57 | // b. Create the specific AliRunDataStorage instance (AliRunDataOrganizedFile in this case) |
58 | |
59 | AliRunDataOrganizedFile *orgf = new AliRunDataOrganizedFile(DBFolder.Data()); |
60 | |
61 | // c. Put the object in the database. Use Put method: AliRunDataStorage::Put(TObject object, AliObjectMetaData& metaData) |
62 | // |
63 | // the object will be stored in the file DBFolder/PHOS/Calib/GainFactors/Run1-10_v0.root |
64 | // Note that the version is automatically determined. |
65 | |
66 | AliRunDataStorage::Instance()->Put(calibda, omd); // we could also type: orgf->Put(calibda, omd) |
67 | |
68 | // delete the AliRunDataStorage instance and the object (optional) |
69 | AliRunDataStorage::Instance()->Delete(); |
70 | |
71 | |
72 | /*************************************************************************************************************** |
73 | Part 2: Now we want to retrieve the object valid, say, for run 5 from the database folder. |
74 | We will dump it in a local file called "dummyDBTutorail.root", for later usage. |
75 | ***************************************************************************************************************/ |
76 | |
77 | // a. Create the specific AliRunDataStorage instance (AliRunDataOrganizedFile in this case) |
78 | AliRunDataOrganizedFile *orgf = new AliRunDataOrganizedFile(DBFolder.Data()); |
79 | |
80 | // b. Prepare AliRunDataStorage to save the object in the local file |
81 | AliRunDataStorage::Instance()->RecordToFile("dummyPhosCalibDB.root"); |
82 | |
83 | // c. Get the object! |
84 | // TObject *AliRunDataStorage::Get(char* name, int runNumber) |
85 | // if no selection criteria are specified, the highest version found is retrieved. |
86 | |
87 | AliPHOSCalibData *calibda2 = (AliPHOSCalibData*) AliRunDataStorage::Instance()->Get("PHOS/Calib/GainFactors",5); |
88 | |
89 | printf("\nI am in Part2. PHOS Energy calibration factors: \n"); |
90 | calibda2->Print("gain"); |
91 | |
92 | AliRunDataStorage::Instance()->Delete(); |
93 | |
94 | |
95 | /*************************************************************************************************************** |
96 | Part 3: Now we will retrieve the object from the local file. |
97 | We will tune the energy calibration factors and we suppose that the new object is valid from run 1 to run 15. |
98 | Finally we will store the object in DBFolder again with the new run range specified in the object's metadata. |
99 | ***************************************************************************************************************/ |
100 | |
101 | // a. Create the specific AliRunDataStorage instance (AliRunDataFile in this case) |
102 | AliRunDataFile *df = new AliRunDataFile("dummyPhosCalibDB.root"); |
103 | //AliRunDataOrganizedFile *orgf = new AliRunDataOrganizedFile(DBFolder.Data()); |
104 | |
105 | // b. Get the object. |
106 | AliPHOSCalibData *calibda3 = (AliPHOSCalibData*) AliRunDataStorage::Instance()->Get("PHOS/Calib/GainFactors",5); |
107 | |
108 | //AliPHOSCalibData calibda3copy=*calibda3; |
109 | |
110 | // c. Tune the energy calibration factors in the 5th module |
111 | for(Int_t module=4; module<5; module++) { |
112 | for(Int_t column=0; column<64; column++) { |
113 | for(Int_t row=0; row<56; row++) { |
114 | calibda3->SetADCchannelEmc(module,column,row,1.2); |
115 | } |
116 | } |
117 | } |
118 | |
119 | printf("\nI am in Part3. New PHOS Energy calibration factors: \n"); |
120 | calibda3->Print("gain"); |
121 | |
122 | // d. Get the object's metadata, set the new run range |
123 | AliObjectMetaData omd2 = AliRunDataStorage::Instance()->GetObjectMetaData("PHOS/Calib/GainFactors"); |
124 | omd2.SetRunRange(1,15); |
125 | |
126 | // e. Store the object in the "organized" database. |
127 | // the object will be stored in the file DBFolder/PHOS/Calib/GainFactors/Run1-15_v1.root |
128 | // Note that, since there is an "overlap" of the new run range with the one specified |
129 | // in the previous version, the version is automatically increased. |
130 | |
131 | AliRunDataOrganizedFile *orgf = new AliRunDataOrganizedFile(DBFolder.Data()); |
132 | AliRunDataStorage::Instance()->Put(calibda3, omd2); |
133 | |
134 | /*************************************************************************************************************** |
135 | Part 3: Last act. |
136 | We want to retrieve the object from the "organized" database folder again. |
137 | This time, anyway, we don't want the highest version but version 0 instead. |
138 | Therefore we have to specify the version wanted using the "Select" method of AliRunDataStorage |
139 | and the aliSelectionMetaData object. |
140 | ***************************************************************************************************************/ |
141 | |
142 | // a. Create the specific AliRunDataStorage instance (AliRunDataOrganizedFile in this case) |
143 | orgf = new AliRunDataOrganizedFile(DBFolder.Data()); |
144 | |
145 | // b. Specify the selection criterion. We want version 0 for the object valid for run range (1,100) |
146 | // NOTE(1): TRegexp expression are valid! E.g. we could type "PHOS/Calib/*" if we want to specify version |
147 | // for all the "PHOS/Calib" subsamples... |
148 | // Note(2): we could also not specify the run range, if we want version 0 for any retrieved object |
149 | AliSelectionMetaData smd("PHOS/Calib/GainFactors",1,100,0); |
150 | AliRunDataStorage::Instance()->Select(smd); |
151 | |
152 | // c. Get the object |
153 | AliPHOSCalibData *calibda4 = (AliPHOSCalibData*) AliRunDataStorage::Instance()->Get("PHOS/Calib/GainFactors",5); |
154 | printf("\nI am in Part4. I've just got \"PHOS/Calib/GainFactors\" object valid for run 5, version 0.\n"); |
155 | printf("PHOS Energy calibration factors: \n"); |
156 | calibda4->Print("gain"); |
157 | |
158 | printf("\nEnd of tutorial. Bye bye!! \n"); |
159 | |
160 | |
161 | } |