1 /*********************************************************************************
2 - Contact: Brigitte Cheynis b.cheynis@ipnl.in2p3.fr
5 - Reference run number :
8 - Number of events needed: >=500
9 - Input Files: argument list
10 - Output Files: local files VZERO_Histos.root, V0_Pedestals.dat (Online mapping)
11 FXS file V0_Ped_Width_Gain.dat (Offline mapping)
12 - Trigger types used: PHYSICS_EVENT
13 **********************************************************************************/
15 /**********************************************************************************
17 * VZERO Detector Algorithm used for extracting calibration parameters *
19 * This program connects to the DAQ data source passed as argument. *
20 * It computes calibration parameters, populates local "./V0_Ped_Width_Gain.dat" *
21 * file, exports it to the FES, and stores it into DAQ DB *
22 * The program exits when being asked to shut down (daqDA_checkshutdown) *
23 * or on End of Run event. *
24 * We have 128 channels instead of 64 as expected for V0 due to the two sets of *
25 * charge integrators which are used by the FEE ... *
27 ***********************************************************************************/
35 #include <AliVZERORawStream.h>
36 #include <AliRawReaderDate.h>
37 #include <AliRawReader.h>
46 #include "TPluginManager.h"
51 Int_t GetOfflineChannel(Int_t channel);
53 /* Main routine --- Arguments: monitoring data source */
55 int main(int argc, char **argv) {
57 /* magic line from Cvetan */
58 gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo",
65 printf("Wrong number of arguments\n");
69 // Online values (using FEE channel numbering),
70 // stored into local V0_Pedestals.dat:
71 Double_t adcMean[128];
72 Double_t adcSigma[128];
73 Double_t pedMean[128];
74 Double_t pedSigma[128];
75 // Offline values(same but ordered as in aliroot for offliners)
76 // stored into V0_Ped_Width_Gain.dat:
77 Double_t adcMeanOff[128];
78 Double_t adcSigmaOff[128];
79 Double_t pedMeanOff[128];
80 Double_t pedSigmaOff[128];
82 //___________________________________________________
83 // Get cuts from V00DA.config file
85 Int_t kClockMin; // = 16; LHC Clock Min for pedestal calculation
86 Int_t kClockMax; // = 19; LHC Clock Max for pedestal calculation
87 Int_t kLowCut; // = 60; low cut on signal distribution - to be tuned
88 Int_t kHighCut; // = 50; high cut on pedestal distribution - to be tuned
89 Int_t kClockMinRef; // = 16; LHC Clock Min for Flag checking
90 Int_t kClockMaxRef; // = 20; LHC Clock Max for Flag checking
91 Float_t kChi2Max; // = 1. Maximum chi2
93 status = daqDA_DB_getFile("V00DA.config","./V00DA.config");
95 printf("Failed to get Config file (V00DA.config) from DAQ DB, status=%d\n", status);
96 printf("Take default values of parameters for pedestal calculation \n");
105 /* open the config file and retrieve cuts */
106 FILE *fpConfig = fopen("V00DA.config","r");
107 int res = fscanf(fpConfig,"%d %d %d %d %d %d %f",&kClockMin,&kClockMax,&kLowCut,&kHighCut,&kClockMinRef,&kClockMaxRef,&kChi2Max);
109 printf("Failed to get values from Config file (V00DA.config): wrong file format - 4 integers are expected - \n");
121 printf("LHC Clock Min for pedestal calculation = %d; LHC Clock Max for pedestal calculation = %d; LowCut on signal = %d ; HighCut on pedestal = %d\n",
122 kClockMin, kClockMax, kLowCut, kHighCut);
124 //___________________________________________________
125 // Book HISTOGRAMS - dynamics of p-p collisions -
133 for (Int_t i=0; i<128; i++) {
134 sprintf(adcName,"hADC%d",i);
135 sprintf(texte,"ADC cell%d",i);
136 hADCname[i] = new TH1F(adcName,texte,1024,-0.5, 1023.5);
137 sprintf(pedName,"hPED%d",i);
138 sprintf(texte,"PED cell%d",i);
139 hPEDname[i] = new TH1F(pedName,texte,1024,-0.5, 1023.5);
141 //___________________________________________________
143 /* open result file to be exported to FES */
145 fpLocal=fopen("./V0_Pedestals.dat","w");
147 printf("Failed to open local result file\n");
150 /* open result file to be exported to FES */
152 fp=fopen("./V0_Ped_Width_Gain.dat","w");
154 printf("Failed to open result file\n");
157 /* define data source : this is argument 1 */
158 status=monitorSetDataSource( argv[1] );
160 printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(status));
164 /* declare monitoring program */
165 status=monitorDeclareMp( __FILE__ );
167 printf("monitorDeclareMp() failed : %s\n",monitorDecodeError(status));
171 /* define wait event timeout - 1s max */
173 monitorSetNoWaitNetworkTimeout(1000);
175 /* init counters on events */
176 int neventsPhysics=0;
179 /* loop on events (infinite) */
181 struct eventHeaderStruct *event;
182 eventTypeType eventT;
184 /* check shutdown condition */
185 if (daqDA_checkShutdown()) {break;}
187 /* get next event (blocking call until timeout) */
188 status=monitorGetEventDynamic((void **)&event);
189 if (status==MON_ERR_EOF) {
190 printf ("End of File detected\n");
191 break; /* end of monitoring file has been reached */
195 printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status));
199 /* retry if got no event */
200 if (event==NULL) continue;
203 eventT=event->eventType;
205 switch (event->eventType){
211 printf("End Of Run detected\n");
217 AliRawReader *rawReader = new AliRawReaderDate((void*)event);
219 AliVZERORawStream* rawStream = new AliVZERORawStream(rawReader);
220 if (rawStream->Next()) {
221 for(Int_t i=0; i<64; i++) {
223 for(Int_t j=kClockMinRef; j <= kClockMaxRef; j++) { // Check flags on clock range used for pedestal calculation
224 if((rawStream->GetBBFlag(i,j)) || (rawStream->GetBGFlag(i,j))) nFlag++;
226 if(nFlag == 0){ // Fill 64*2 pedestal histograms - 2 integrators -
227 Float_t sum[2] = {0.,0.};
228 Float_t sumwi[2] = {0.,0.};
229 for(Int_t j=kClockMin;j <= kClockMax;j++){
230 Int_t integrator = rawStream->GetIntegratorFlag(i,j);
231 Float_t pedestal = (float)(rawStream->GetPedestal(i,j));
232 sum[integrator] += pedestal;
233 sumwi[integrator] += 1.;
235 Float_t mean[2] = {0.,0.};
236 Float_t chi2[2] = {0.,0.};
238 for(int ii=0;ii<2;ii++) if(sumwi[ii]>1.e-6) mean[ii] = sum[ii] / sumwi[ii];
240 for(Int_t j=kClockMin;j <= kClockMax;j++){
241 Int_t integrator = rawStream->GetIntegratorFlag(i,j);
242 Float_t pedestal = (float)(rawStream->GetPedestal(i,j));
243 chi2[integrator] += (mean[integrator] - pedestal) * (mean[integrator] - pedestal);
245 if(chi2[0]<kChi2Max && chi2[1]<kChi2Max) {
246 for(int ii=0;ii<2;ii++){
247 if(mean[ii] >1.e-6) hPEDname[i + 64*ii]->Fill(mean[ii]);
252 if((rawStream->GetBBFlag(i,10)) || (rawStream->GetBGFlag(i,10))){ // Charge
253 Int_t integrator = rawStream->GetIntegratorFlag(i,10);
254 Float_t charge = (float)(rawStream->GetADC(i)); // Fill 64*2 ADCmax histograms
255 hADCname[i + 64 * integrator]->Fill(charge);
257 } // End loop over channels
258 } // End : if rawstream
263 } // end of switch on event type
269 /* exit when last event received, no need to wait for TERM signal */
270 if (eventT==END_OF_RUN) {
271 printf("End Of Run event detected\n");
275 } // loop over events
277 printf("%d physics events processed\n",neventsPhysics);
279 //___________________________________________________________________________
280 // Computes mean values, converts FEE channels into Offline AliRoot channels
281 // and dumps the ordered values into the output text file for SHUTTLE
283 for(Int_t i=0; i<128; i++) {
284 hPEDname[i]->GetXaxis()->SetRange(0,kHighCut);
285 pedMean[i] = hPEDname[i]->GetMean();
286 pedSigma[i] = hPEDname[i]->GetRMS();
287 hADCname[i]->GetXaxis()->SetRange(kLowCut,1024);
288 adcMean[i] = hADCname[i]->GetMean();
289 adcSigma[i] = hADCname[i]->GetRMS();
290 // printf(" i = %d, %.3f %.3f %.3f %.3f\n",i,pedMean[i],pedSigma[i],adcMean[i],adcSigma[i]);
291 fprintf(fpLocal," %.3f %.3f %.3f %.3f\n",pedMean[i],pedSigma[i],
292 adcMean[i],adcSigma[i]);
294 Int_t j = GetOfflineChannel(i);
295 pedMeanOff[j] = pedMean[i];
296 pedSigmaOff[j] = pedSigma[i];
297 adcMeanOff[j] = adcMean[i];
298 adcSigmaOff[j] = adcSigma[i]; }
300 Int_t j = GetOfflineChannel(i-64);
301 pedMeanOff[j+64] = pedMean[i];
302 pedSigmaOff[j+64] = pedSigma[i];
303 adcMeanOff[j+64] = adcMean[i];
304 adcSigmaOff[j+64] = adcSigma[i];
308 for(Int_t j=0; j<128; j++) {
309 // printf(" j = %d, %.3f %.3f %.3f %.3f\n",j,pedMeanOff[j],pedSigmaOff[j],
310 // adcMeanOff[j],adcSigmaOff[j]);
311 fprintf(fp," %.3f %.3f %.3f %.3f\n",pedMeanOff[j],pedSigmaOff[j],
312 adcMeanOff[j],adcSigmaOff[j]);
315 //________________________________________________________________________
316 // Write root file with histos for users further check - just in case -
318 TFile *histoFile = new TFile("VZERO_histos.root","RECREATE");
320 for (Int_t i=0; i<128; i++) {
321 hADCname[i]->GetXaxis()->SetRange(0,1024);
322 hADCname[i]->Write();
323 hPEDname[i]->Write(); }
328 //________________________________________________________________________
330 /* close local result file and FXS result file*/
334 /* export result file to FES */
335 status=daqDA_FES_storeFile("./V0_Ped_Width_Gain.dat","V00da_results");
337 printf("Failed to export file : %d\n",status);
340 /* store result file into Online DB */
341 status=daqDA_DB_storeFile("./V0_Pedestals.dat","V00da_results");
343 printf("Failed to store file into Online DB: %d\n",status);
349 Int_t GetOfflineChannel(Int_t channel) {
351 // Channel mapping Online - Offline:
353 Int_t fOfflineChannel[64] = {39, 38, 37, 36, 35, 34, 33, 32,
354 47, 46, 45, 44, 43, 42, 41, 40,
355 55, 54, 53, 52, 51, 50, 49, 48,
356 63, 62, 61, 60, 59, 58, 57, 56,
357 7, 6, 5, 4, 3, 2, 1, 0,
358 15, 14, 13, 12, 11, 10, 9, 8,
359 23, 22, 21, 20, 19, 18, 17, 16,
360 31, 30, 29, 28, 27, 26, 25, 24};
361 return fOfflineChannel[channel];