Fix for memory leaks in digits TClonesArrays (Matevz)
[u/mrichter/AliRoot.git] / VZERO / VZEROCHANNELDELAYTUNINGda.cxx
1 /*********************************************************************************
2 - Contact:    Brigitte Cheynis     b.cheynis@ipnl.in2p3.fr
3 - Link:       http
4 - Raw data test file : 
5 - Reference run number :              
6 - Run Type:   CHANNEL_DELAY_TUNING
7 - DA Type:    LDC
8 - Number of events needed: 500
9 - Input Files:  argument list
10 - Output Files: local file  V0_ChannelDelayTuning.dat
11                 FXS file    V0_ChannelDelayTuning.dat
12 - Trigger types used: PHYSICS_EVENT
13 **********************************************************************************/
14
15
16 /**********************************************************************************
17 *                                                                                 *
18 * VZERO Detector Algorithm used for tuning FEE parameters                         *
19 *                                                                                 *
20 * This program reads data on the LDC                                              *
21 * It cumulates fBB and fBG flags, populates local "./V0_ChannelDelayTuning.dat"   *            
22 * file, exports it to the FES, and stores it to DAQ DB                            *
23 * We have 128 channels instead of 64 as expected for V0 due to the two sets of    *
24 * charge integrators which are used by the FEE ...                                *
25 * The program reports about its processing progress.                              *
26 *                                                                                 *
27 ***********************************************************************************/
28
29 // DATE
30 #include "event.h"
31 #include "monitor.h"
32 #include "daqDA.h"
33
34 //AliRoot
35 #include <AliVZERORawStream.h>
36 #include <AliRawReaderDate.h>
37 #include <AliRawReader.h>
38 #include <AliDAQ.h>
39
40 // standard
41 #include <stdio.h>
42 #include <stdlib.h>
43
44 //ROOT
45 #include "TROOT.h"
46 #include "TPluginManager.h"
47 #include <TFile.h>
48 #include <TH1F.h>
49 #include <TMath.h>
50
51
52 /* Main routine --- Arguments: list of DATE raw data files */
53       
54 int main(int argc, char **argv) {
55
56 /* magic line from Cvetan */
57   gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo",
58                     "*",
59                     "TStreamerInfo",
60                     "RIO",
61                     "TStreamerInfo()");
62   int status;
63   status = daqDA_DB_getFile("V00da_results","./V0_Pedestals.dat");
64   if (status) {
65       printf("Failed to get Pedestal file (V0_Pedestals.dat) from DAQ DB, status=%d\n", status);
66       return -1;   
67   }
68   
69   Float_t MeanPed[128], SigPed[128], fdump;
70   
71   /* open the pedestal file and retrieve pedestal mean and sigma */
72   FILE *fpPed = fopen("V0_Pedestals.dat","r");
73   for(int i=0;i<128;i++){
74       fscanf(fpPed,"%f %f %f %f \n",&MeanPed[i],&SigPed[i],&fdump,&fdump);
75 //      printf("%.3f %.3f \n",MeanPed[i],SigPed[i]);
76   }
77   fclose(fpPed);
78
79 //______________________________________________________________________________
80 // Get running parameters from V00_ChannelDelayTuning_DA.config file
81
82   Int_t    kNbEventSkipped;   // = 100;   number of events skipped - to be tuned
83   Float_t  kSigmaCut;         // = 3.0;   number of sigmas for threshold cut - to be tuned
84   
85   status = daqDA_DB_getFile("V00_ChannelDelayTuning_DA.config","./V00_ChannelDelayTuning_DA.config");
86   if (status) {
87       printf("Failed to get config file (V00_ChannelDelayTuning_DA.config) from DAQ DB, status=%d\n", status);
88       return -1;   
89   }
90   /* open the config file and retrieve running parameters */
91   FILE *fpConfig = fopen("V00_ChannelDelayTuning_DA.config","r");
92   fscanf(fpConfig,"%f %d",&kSigmaCut,&kNbEventSkipped);
93   fclose(fpConfig);
94   
95   printf("Number of events skipped = %d ; Number of sigmas for threshold cut = %f\n",kNbEventSkipped,kSigmaCut);
96 //______________________________________________________________________________
97
98   Int_t  BBFlag[64];
99   Int_t  BGFlag[64];
100   Int_t  ChargeEoI  = 0;
101   Bool_t Integrator = 0;
102   Int_t NHit[64];
103   for(Int_t i=0; i<64; i++) {
104       BBFlag[i] = 0;
105       BGFlag[i] = 0;
106       NHit[i]   = 0;
107   } 
108       
109   /* log start of process */
110   printf("VZERO DA program started - Channel Delay Tuning \n");  
111
112   /* check that we got some arguments  */
113   if (argc<2)   {
114       printf("Wrong number of arguments\n");
115       return -1;}
116
117   /* open result file to be exported to FES */
118   FILE *fp=NULL;
119   fp=fopen("./V0_ChannelDelayTuning.dat","a");
120   if (fp==NULL) {
121       printf("Failed to open result file\n");
122       return -1;}
123
124   /* open log file to inform user */
125   FILE *flog=NULL;
126   flog=fopen("./V00log.txt","w");
127   if (flog==NULL) {
128       printf("Failed to open log file\n");
129       return -1;  }
130     
131   /* report progress */
132   daqDA_progressReport(10);
133
134   /* init counters on events */
135   int nevents_physics=0;
136   int nevents_total=0;
137   int iteration;
138   sscanf(argv[1],"%d",&iteration);
139   
140   /* read the n data files */
141   for (int n=2; n<argc; n++) {
142   
143   /* read the data  */
144     status=monitorSetDataSource( argv[n] );
145     if (status!=0) {
146         printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(status));
147         return -1; }
148
149   /* report progress */
150     daqDA_progressReport(10+50*n/argc);
151
152   /* read the data file */
153     for(;;) {
154         struct eventHeaderStruct *event;
155         eventTypeType eventT;
156
157         /* get next event */
158         status=monitorGetEventDynamic((void **)&event);
159         if (status==MON_ERR_EOF) break; /* end of monitoring file has been reached */
160         if (status!=0) {
161             printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status));
162             return -1; }
163
164         /* retry if got no event */
165         if (event==NULL) break;
166         
167         /* decode event */
168         eventT=event->eventType;
169         
170         switch (event->eventType){
171       
172         case START_OF_RUN:
173              printf("START Of Run detected\n");
174              break;
175       
176         case END_OF_RUN:
177              printf("END Of Run detected\n");
178              break;
179       
180         case PHYSICS_EVENT:
181              nevents_physics++;
182
183              AliRawReader *rawReader = new AliRawReaderDate((void*)event);
184   
185              AliVZERORawStream* rawStream  = new AliVZERORawStream(rawReader); 
186              rawStream->Next(); 
187              if(nevents_physics > kNbEventSkipped){
188                 for(Int_t i=0; i<64; i++) {
189                     //ChargeEoI= rawStream->GetADC(i); takes EoI as central clock
190                     // Look for the maximum in the LHC clock train instead of central clock 10
191                     ChargeEoI    = 0;
192                     Int_t iClock = 0;
193                     for(size_t iEvent=0; iEvent<21; iEvent++){
194                          if(rawStream->GetPedestal(i,iEvent)>ChargeEoI) 
195                             {ChargeEoI= rawStream->GetPedestal(i,iEvent);
196                             iClock    = iEvent;}
197                     }                       
198                     Integrator = rawStream->GetIntegratorFlag(i,iClock);
199                     Float_t Threshold = MeanPed[i + 64 * Integrator] + kSigmaCut * SigPed[i + 64 * Integrator];
200
201                     if((float)ChargeEoI>Threshold) {
202                         NHit[i]+=1;
203                         if(rawStream->GetBBFlag(i,iClock)) BBFlag[i]+=1;       
204                         if(rawStream->GetBGFlag(i,iClock)) BGFlag[i]+=1; 
205                     }            
206                 }    
207              }
208              delete rawStream;
209              rawStream = 0x0;      
210              delete rawReader;
211              rawReader = 0x0;                                                                    
212         } // end of switch on event type 
213         
214         nevents_total++;
215         /* free resources */
216         free(event);
217
218     }    // end of loop over events
219   }      // end of loop over data files 
220    
221 //________________________________________________________________________
222 //  Computes mean values, dumps them into the output text file
223   Float_t fBB, fBG;     
224   for(Int_t i=0; i<64; i++) {      
225       if(NHit[i] > 0) {
226          fBB = (float)BBFlag[i]/(float)NHit[i];
227          fBG = (float)BGFlag[i]/(float)NHit[i];
228        }else{
229          fBB = fBG = 0.;
230        }
231        fprintf(fp," %d %d %f %f\n",iteration,i,fBB,fBG);
232        fprintf(flog," it %d ch %d BB %f BG %f BBFlag %d BGFlag %d Hit %d\n",iteration,i,fBB,fBG,BBFlag[i],BGFlag[i],NHit[i]);
233   } 
234   
235 //________________________________________________________________________
236    
237   /* write report */
238   fprintf(flog,"Run #%s, received %d physics events out of %d\n",getenv("DATE_RUN_NUMBER"),nevents_physics,nevents_total);
239   printf("Run #%s, received %d physics events out of %d\n",getenv("DATE_RUN_NUMBER"),nevents_physics,nevents_total);
240   
241   /* close result and log files */
242   fclose(fp);
243   fclose(flog); 
244   
245   /* report progress */
246   daqDA_progressReport(90);
247
248   /* export result file to FES */
249   status=daqDA_FES_storeFile("./V0_ChannelDelayTuning.dat","V00da_ChannelDelayTuning");
250   if (status)    {
251       printf("Failed to export file : %d\n",status);
252       return -1; }
253       
254   /* store result file on Online DB */
255 //   status=daqDA_DB_storeFile("./V0_ChannelDelayTuning.dat","V00da_ChannelDelayTuning");
256 //   if (status)    {
257 //       printf("Failed to store file into Online DB: %d\n",status);
258 //       return -1; }
259       
260   /* report progress */
261   daqDA_progressReport(100);
262   
263   return status;
264 }