]>
Commit | Line | Data |
---|---|---|
0bbeb14b | 1 | /* |
2 | contact: Boris.Polishchuk@cern.ch | |
3 | link: http://aliceinfo.cern.ch/static/phpBB3/viewtopic.php?f=4&t=17 | |
c526b05d | 4 | reference run: /alice/data/2009/LHC09c_PHOS/000098979/raw |
6ab90476 | 5 | run type: LED |
0bbeb14b | 6 | DA type: MON |
7 | number of events needed: 1000 | |
6ab90476 | 8 | number of events needed: 1000 |
9 | input files: Mod0RCU0.data Mod0RCU1.data Mod0RCU2.data Mod0RCU3.data Mod1RCU0.data Mod1RCU1.data Mod1RCU2.data Mod1RCU3.data Mod2RCU0.data Mod2RCU1.data Mod2RCU2.data Mod2RCU3.data Mod3RCU0.data Mod3RCU1.data Mod3RCU2.data Mod3RCU3.data Mod4RCU0.data Mod4RCU1.data Mod4RCU2.data Mod4RCU3.data | |
c526b05d | 10 | Output files: PHOS_BCM.root |
6ab90476 | 11 | Trigger types used: CALIBRATION_EVENT |
0bbeb14b | 12 | */ |
13 | ||
14 | ||
15 | #include "event.h" | |
16 | #include "monitor.h" | |
17 | extern "C" { | |
18 | #include "daqDA.h" | |
19 | } | |
20 | ||
21 | #include <stdio.h> | |
22 | #include <stdlib.h> | |
23 | ||
24 | #include <TSystem.h> | |
25 | #include <TROOT.h> | |
26 | #include <TPluginManager.h> | |
c526b05d | 27 | #include <TH1.h> |
28 | #include <TH2.h> | |
0bbeb14b | 29 | |
30 | #include "AliRawReader.h" | |
31 | #include "AliRawReaderDate.h" | |
32 | #include "AliPHOSDA2.h" | |
c526b05d | 33 | #include "AliPHOSRawFitterv3.h" |
0bbeb14b | 34 | #include "AliCaloAltroMapping.h" |
8083e819 | 35 | #include "AliCaloRawStreamV3.h" |
6ab90476 | 36 | #include "AliLog.h" |
0bbeb14b | 37 | |
38 | ||
39 | /* Main routine | |
40 | Arguments: | |
41 | 1- monitoring data source | |
42 | */ | |
43 | int main(int argc, char **argv) { | |
44 | ||
45 | gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo", | |
46 | "*", | |
47 | "TStreamerInfo", | |
48 | "RIO", | |
49 | "TStreamerInfo()"); | |
50 | ||
6ab90476 | 51 | AliLog::SetGlobalDebugLevel(0) ; |
52 | AliLog::SetGlobalLogLevel(AliLog::kFatal); | |
53 | ||
0bbeb14b | 54 | int status; |
55 | ||
56 | if (argc!=2) { | |
57 | printf("Wrong number of arguments\n"); | |
58 | return -1; | |
59 | } | |
60 | ||
c526b05d | 61 | short offset=-1; |
62 | short threshold=-1; | |
63 | ||
0bbeb14b | 64 | /* Retrieve mapping files from DAQ DB */ |
6ab90476 | 65 | const char* mapFiles[20] = { |
66 | "Mod0RCU0.data", | |
67 | "Mod0RCU1.data", | |
68 | "Mod0RCU2.data", | |
69 | "Mod0RCU3.data", | |
70 | "Mod1RCU0.data", | |
71 | "Mod1RCU1.data", | |
72 | "Mod1RCU2.data", | |
73 | "Mod1RCU3.data", | |
74 | "Mod2RCU0.data", | |
75 | "Mod2RCU1.data", | |
76 | "Mod2RCU2.data", | |
77 | "Mod2RCU3.data", | |
78 | "Mod3RCU0.data", | |
79 | "Mod3RCU1.data", | |
80 | "Mod3RCU2.data", | |
81 | "Mod3RCU3.data", | |
82 | "Mod4RCU0.data", | |
83 | "Mod4RCU1.data", | |
84 | "Mod4RCU2.data", | |
85 | "Mod4RCU3.data" | |
86 | }; | |
87 | ||
88 | for(Int_t iFile=0; iFile<20; iFile++) { | |
0bbeb14b | 89 | int failed = daqDA_DB_getFile(mapFiles[iFile], mapFiles[iFile]); |
6ab90476 | 90 | if(failed) { |
0bbeb14b | 91 | printf("Cannot retrieve file %s from DAQ DB. Exit.\n",mapFiles[iFile]); |
92 | return -1; | |
93 | } | |
94 | } | |
95 | ||
96 | /* Open mapping files */ | |
6ab90476 | 97 | AliAltroMapping *mapping[20]; |
0bbeb14b | 98 | TString path = "./"; |
6ab90476 | 99 | |
100 | path += "Mod"; | |
0bbeb14b | 101 | TString path2; |
6ab90476 | 102 | TString path3; |
103 | Int_t iMap = 0; | |
104 | ||
105 | for(Int_t iMod = 0; iMod < 5; iMod++) { | |
0bbeb14b | 106 | path2 = path; |
6ab90476 | 107 | path2 += iMod; |
108 | path2 += "RCU"; | |
109 | ||
110 | for(Int_t iRCU=0; iRCU<4; iRCU++) { | |
111 | path3 = path2; | |
112 | path3 += iRCU; | |
113 | path3 += ".data"; | |
114 | mapping[iMap] = new AliCaloAltroMapping(path3.Data()); | |
115 | iMap++; | |
116 | } | |
117 | } | |
0bbeb14b | 118 | |
119 | /* define data source : this is argument 1 */ | |
120 | status=monitorSetDataSource( argv[1] ); | |
121 | if (status!=0) { | |
122 | printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(status)); | |
123 | return -1; | |
124 | } | |
125 | ||
126 | ||
127 | /* declare monitoring program */ | |
128 | status=monitorDeclareMp( __FILE__ ); | |
129 | if (status!=0) { | |
130 | printf("monitorDeclareMp() failed : %s\n",monitorDecodeError(status)); | |
131 | return -1; | |
132 | } | |
133 | ||
134 | ||
135 | /* define wait event timeout - 1s max */ | |
136 | monitorSetNowait(); | |
137 | monitorSetNoWaitNetworkTimeout(1000); | |
138 | ||
139 | ||
140 | /* log start of process */ | |
141 | printf("DA2 (bad channels search) started.\n"); | |
142 | ||
143 | ||
144 | /* init some counters */ | |
145 | int nevents_physics=0; | |
146 | int nevents_total=0; | |
147 | ||
148 | AliRawReader *rawReader = NULL; | |
c526b05d | 149 | AliPHOSDA2* dAs[5]; |
0bbeb14b | 150 | |
c526b05d | 151 | for(Int_t iMod=0; iMod<5; iMod++) { |
152 | dAs[iMod] = 0; | |
153 | } | |
0bbeb14b | 154 | |
c526b05d | 155 | Float_t q[64][56][2]; |
156 | ||
8083e819 | 157 | Int_t cellX = -1; |
158 | Int_t cellZ = -1; | |
159 | Int_t nBunches = 0; | |
160 | Int_t nFired = -1; | |
161 | Int_t sigStart, sigLength; | |
6ab90476 | 162 | Int_t caloFlag; |
0bbeb14b | 163 | |
164 | /* main loop (infinite) */ | |
165 | for(;;) { | |
166 | struct eventHeaderStruct *event; | |
167 | eventTypeType eventT; | |
168 | ||
169 | /* check shutdown condition */ | |
170 | if (daqDA_checkShutdown()) {break;} | |
171 | ||
172 | /* get next event (blocking call until timeout) */ | |
173 | status=monitorGetEventDynamic((void **)&event); | |
174 | if (status==MON_ERR_EOF) { | |
175 | printf ("End of File detected\n"); | |
176 | break; /* end of monitoring file has been reached */ | |
177 | } | |
178 | ||
179 | if (status!=0) { | |
180 | printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status)); | |
181 | break; | |
182 | } | |
183 | ||
184 | /* retry if got no event */ | |
185 | if (event==NULL) { | |
186 | continue; | |
187 | } | |
188 | ||
189 | ||
190 | /* use event - here, just write event id to result file */ | |
191 | eventT=event->eventType; | |
192 | ||
193 | if (eventT==PHYSICS_EVENT || eventT==CALIBRATION_EVENT) { | |
194 | ||
195 | for(Int_t iX=0; iX<64; iX++) { | |
196 | for(Int_t iZ=0; iZ<56; iZ++) { | |
197 | for(Int_t iGain=0; iGain<2; iGain++) { | |
198 | q[iX][iZ][iGain] = 0.; | |
199 | } | |
200 | } | |
201 | } | |
202 | ||
7708b003 | 203 | nFired = 0; |
204 | ||
0bbeb14b | 205 | rawReader = new AliRawReaderDate((void*)event); |
8083e819 | 206 | AliCaloRawStreamV3 stream(rawReader,"PHOS",mapping); |
c526b05d | 207 | AliPHOSRawFitterv3 fitter; |
8083e819 | 208 | fitter.SubtractPedestals(kTRUE); // assume that data is non-ZS |
0bbeb14b | 209 | |
8083e819 | 210 | while (stream.NextDDL()) { |
211 | while (stream.NextChannel()) { | |
212 | ||
6ab90476 | 213 | /* Retrieve ZS parameters from data*/ |
214 | short value = stream.GetAltroCFG1(); | |
215 | bool ZeroSuppressionEnabled = (value >> 15) & 0x1; | |
216 | bool AutomaticBaselineSubtraction = (value >> 14) & 0x1; | |
217 | if(ZeroSuppressionEnabled) { | |
218 | offset = (value >> 10) & 0xf; | |
219 | threshold = value & 0x3ff; | |
220 | fitter.SubtractPedestals(kFALSE); | |
221 | fitter.SetAmpOffset(offset); | |
222 | fitter.SetAmpThreshold(threshold); | |
223 | } | |
224 | ||
8083e819 | 225 | cellX = stream.GetCellX(); |
226 | cellZ = stream.GetCellZ(); | |
227 | caloFlag = stream.GetCaloFlag(); // 0=LG, 1=HG, 2=TRU | |
6ab90476 | 228 | |
229 | if(caloFlag!=0 && caloFlag!=1) continue; //TRU data! | |
230 | ||
8083e819 | 231 | // In case of oscillating signals with ZS, a channel can have several bunches |
232 | nBunches = 0; | |
233 | while (stream.NextBunch()) { | |
234 | nBunches++; | |
6ab90476 | 235 | sigStart = stream.GetStartTimeBin(); |
236 | sigLength = stream.GetBunchLength(); | |
237 | fitter.SetChannelGeo(stream.GetModule(),cellX,cellZ,caloFlag); | |
238 | fitter.Eval(stream.GetSignals(),sigStart,sigLength); | |
239 | q[cellX][cellZ][caloFlag] = fitter.GetSignalQuality(); | |
8083e819 | 240 | } // End of NextBunch() |
241 | ||
6ab90476 | 242 | if(caloFlag==1 && fitter.GetEnergy()>40) |
8083e819 | 243 | nFired++; |
244 | } | |
0bbeb14b | 245 | } |
6ab90476 | 246 | |
c526b05d | 247 | if(stream.GetModule()<0 || stream.GetModule()>4) continue; |
248 | ||
249 | if(dAs[stream.GetModule()]) { | |
250 | dAs[stream.GetModule()]->FillQualityHistograms(q); | |
251 | dAs[stream.GetModule()]->FillFiredCellsHistogram(nFired); | |
252 | } | |
253 | else { | |
254 | dAs[stream.GetModule()] = new AliPHOSDA2(stream.GetModule(),0); | |
255 | dAs[stream.GetModule()]->FillQualityHistograms(q); | |
256 | dAs[stream.GetModule()]->FillFiredCellsHistogram(nFired); | |
257 | } | |
258 | ||
0bbeb14b | 259 | delete rawReader; |
260 | nevents_physics++; | |
261 | } | |
262 | ||
263 | nevents_total++; | |
264 | ||
265 | /* free resources */ | |
266 | free(event); | |
267 | ||
268 | /* exit when last event received, no need to wait for TERM signal */ | |
269 | if (eventT==END_OF_RUN) { | |
270 | printf("EOR event detected\n"); | |
271 | break; | |
272 | } | |
273 | } | |
274 | ||
6ab90476 | 275 | for(Int_t i = 0; i < 20; i++) delete mapping[i]; |
7708b003 | 276 | |
277 | /* Be sure that all histograms are saved */ | |
c526b05d | 278 | |
279 | char lnam[128]; | |
280 | char ltitl[128]; | |
281 | ||
282 | char hnam[128]; | |
283 | char htitl[128]; | |
284 | ||
285 | const TH1F* hist1=0; | |
286 | TH2F* maps[2]; | |
287 | ||
288 | TFile* f = new TFile("PHOS_BCM.root","recreate"); | |
289 | ||
290 | for(Int_t iMod=0; iMod<5; iMod++) { | |
291 | if(!dAs[iMod]) continue; | |
0bbeb14b | 292 | |
c526b05d | 293 | printf("DA2 for module %d detected.\n",iMod); |
294 | ||
295 | sprintf(lnam,"gmaplow%d",iMod); | |
296 | sprintf(ltitl,"Quality map for Low gain in Module %d",iMod); | |
0bbeb14b | 297 | |
c526b05d | 298 | sprintf(hnam,"gmaphigh%d",iMod); |
299 | sprintf(htitl,"Quality map for High gain in Module %d",iMod); | |
300 | ||
301 | maps[0] = new TH2F(lnam, ltitl, 64,0.,64.,56,0.,56.); | |
302 | maps[1] = new TH2F(hnam, htitl, 64,0.,64.,56,0.,56.); | |
303 | ||
304 | for(Int_t iX=0; iX<64; iX++) { | |
305 | for(Int_t iZ=0; iZ<56; iZ++) { | |
306 | ||
307 | for(Int_t iGain=0; iGain<2; iGain++) { | |
308 | hist1 = dAs[iMod]->GetQualityHistogram(iX,iZ,iGain); | |
309 | if(hist1) { | |
310 | hist1->Write(); | |
311 | Double_t mean = hist1->GetMean(); | |
312 | maps[iGain]->SetBinContent(iX+1,iZ+1,mean); | |
313 | } | |
314 | } | |
315 | } | |
316 | } | |
317 | ||
318 | maps[0]->Write(); delete maps[0]; | |
319 | maps[1]->Write(); delete maps[1]; | |
320 | ||
321 | } | |
322 | ||
323 | f->Close(); | |
324 | ||
325 | if(offset>0 && threshold>0) | |
326 | printf("ZS parameters: offset %d, threshold %d.\n",offset,threshold); | |
327 | ||
328 | /* Store output files to the File Exchange Server */ | |
329 | daqDA_FES_storeFile("PHOS_BCM.root","BAD_CHANNELS"); | |
330 | ||
0bbeb14b | 331 | return status; |
332 | } |