In the calculation of the jacobian use the transposed matrix instead of its inverse...
[u/mrichter/AliRoot.git] / HMPID / HMPIDda.cxx
1 /*
2
3 HMPID DA for online calibration
4
5 Contact: Levente.Molnar@ba.infn.it, Giacomo.Volpe@ba.infn.it
6 Link: http://richpc1.ba.infn.it/~levente/Files4Public/ValidateHmpidDA/
7 Run Type: PEDESTAL -- but we select on the PHYSICS_EVENTS in th HMPIDda.cxx
8 DA Type: LDC
9 Number of events needed: 1000 events
10 Input Files: Raw pedestal file, EXTERNAL config file: HmpidSigmaCut.txt on both HMPID LDCs
11 Output Files: 14 txt files including pedestal values
12 Trigger types used: PEDESTAL RUN (selecting on PHYSICS_EVENT)
13
14 */
15
16 extern "C" {
17 #include <daqDA.h>
18 }
19
20 #include "event.h"
21 #include "monitor.h"
22
23 #include <Riostream.h>
24 #include "fstream.h"
25 #include <stdio.h>
26 #include <stdlib.h>
27
28 //AliRoot
29 #include "AliHMPIDRawStream.h"
30 #include "AliHMPIDCalib.h"
31 #include "AliRawReaderDate.h"
32 #include "AliBitPacking.h"
33
34 //ROOT
35 #include "TROOT.h"
36 #include "TFile.h"
37 #include "TSystem.h"
38 #include "TString.h"
39 #include "TObject.h"
40 #include "TPluginManager.h"
41
42
43 int main(int argc, char **argv){ 
44
45   int status;
46   const Char_t         *hmpConfigFile = "HmpDaqDaConfig.txt"; 
47   const Int_t               ddlOffset = 1536;
48         TString                 hmpIn;
49         TString                 feeIn;
50
51   
52   /* log start of process */
53   printf("HMPID DA program started\n");  
54
55   gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo","*","TStreamerInfo","RIO","TStreamerInfo()");
56   
57   /* check that we got some arguments = list of files */
58   if (argc<2) {
59     printf("Wrong number of arguments\n");
60     return -1;
61   }
62
63   /* copy locally a file from daq detector config db */
64   hmpIn=Form("./%s",hmpConfigFile);
65   status=daqDA_DB_getFile(hmpConfigFile,hmpIn.Data());
66   if (status) { printf("Failed to get HMPID config file status: %d\n",status); return -1; }
67
68   /* report progress */
69   daqDA_progressReport(10);
70
71   
72   
73   /* define wait event timeout - 1s max */
74   monitorSetNowait();
75   monitorSetNoWaitNetworkTimeout(1000);
76
77   /* set local storage of ped files for Fe2C */
78  
79   
80   /* init the pedestal calculation */
81   AliHMPIDCalib *pCal=new AliHMPIDCalib();
82   /* Set the number of sigma cuts inside the file HmpidSigmaCut.txt on BOTH LDCs! */
83   /* If the file is NOT present then the default cut 3 will be used!*/
84   pCal->SetSigCutFromFile(hmpIn);
85   
86   /* ONLY set this option to kTRUE if you want to create the ADC dsitributions for all 161280 pads!!!!*/  
87   /* kTRUE is not suggested for production mode b/c of the memory consumption! */
88   pCal->SetWriteHistoPads(kFALSE);               //use this option for default production useage!!!
89   //pCal->SetWriteHistoPads(kTRUE);              //only for expert debug
90   //pCal->SetWriteHistoPads(kTRUE,kTRUE,13);     //DO NOT USE THIS OPTION!
91   
92   
93   /* init event counter */
94   Int_t firstEvt=0;
95   Int_t iEvtNcal=firstEvt;                      //Start from 1 not 0!                                                 
96   ULong_t runNum=0;
97   ULong_t ldcId=0;
98
99   int n;
100   for (n=1;n<argc;n++) {
101
102     status=monitorSetDataSource( argv[n] );
103     if (status!=0) {
104       printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(status));
105       return -1;
106     }
107
108     /* report progress */
109     /* in this example, indexed on the number of files */
110     daqDA_progressReport(10+80*n/argc);
111
112     for(;;) { // infinite loop 
113       
114        /* check shutdown condition */
115     if (daqDA_checkShutdown()) {break;}
116     
117       struct eventHeaderStruct *event;
118       eventTypeType eventT;
119
120       /* get next event */
121       status=monitorGetEventDynamic((void **)&event);
122       if (status==MON_ERR_EOF)                                              /* end of monitoring file has been reached */
123       {
124         printf("End of monitoring file has been reached! \n");
125         break;
126         }
127       
128        
129       if (status!=0) {
130         printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status));
131         return -1;
132       }
133
134       /* retry if got no event */
135       if (event==NULL) {
136         //break;
137         continue;
138       }
139
140       /* use event - here, just write event id to result file */
141       eventT=event->eventType;
142
143       if (eventT==PHYSICS_EVENT || eventT==CALIBRATION_EVENT  ) {                 //updated: 18/02/2008 based on http://alice-ecs.web.cern.ch/alice-ecs/runtypes_3.16.html
144         runNum=(unsigned long)event->eventRunNb;                                  //assuming that only one run is processed at a time
145         ldcId=(unsigned long)event->eventLdcId;
146         if(iEvtNcal==firstEvt && pCal->GetWritePads()==kTRUE) 
147         {
148           if(pCal->GetLargePads()==kFALSE)  pCal->InitFile((Int_t)ldcId);         //The number for iEvtNcal should be the same as for the first value
149           else pCal->InitFile((Int_t)runNum);                                     //The number for iEvtNcal should be the same as for the first value
150         }
151         
152         iEvtNcal++;        
153         AliRawReader *reader = new AliRawReaderDate((void*)event);
154         AliHMPIDRawStream stream(reader);stream.SetTurbo(kTRUE);                  //raw data decoding without error checks SetTurbo(kTRUE)
155         while(stream.Next())
156           {
157              for(Int_t iPad=0;iPad<stream.GetNPads();iPad++) {
158              pCal->FillPedestal(stream.GetPadArray()[iPad],stream.GetChargeArray()[iPad]);
159               } //pads
160           }//while -- loop on det load in one event
161           
162          for(Int_t iddl=0;iddl<stream.GetNDDL();iddl++){   
163                  pCal->FillDDLCnt(iddl,stream.GetnDDLInStream()[iddl],stream.GetnDDLOutStream()[iddl]);                     
164            for(Int_t ierr=0; ierr < stream.GetNErrors(); ierr++) {
165                pCal->FillErrors(iddl,ierr,stream.GetErrors(iddl,ierr));
166                }
167           }//err   
168           
169         pCal->SetRunParams(runNum,stream.GetTimeStamp(),stream.GetLDCNumber());   //Get the last TimeStam read and the LDC ID
170         stream.Delete();            
171       }// if CALIBRATION_EVENT
172
173       /* exit when last event received, no need to wait for TERM signal */
174       if (eventT==END_OF_RUN) {
175         printf("EOR event detected\n");
176         break;    
177     
178       } // events loop   
179
180       free(event);
181     }
182
183   }//arg
184
185   /* write report */
186   printf("HMPID DA processed RUN #%s on LDC#%d, with %d calibration events\n",getenv("DATE_RUN_NUMBER"),ldcId,iEvtNcal);
187
188   if (!iEvtNcal) {
189     printf("No calibration events have been read. Exiting\n");
190     return -1;
191   }
192
193   /* report progress */
194   daqDA_progressReport(90);
195   
196   for(Int_t nDDL=0; nDDL < AliHMPIDRawStream::kNDDL; nDDL++) {   
197     feeIn=Form("thr%d.dat",ddlOffset+nDDL);         
198     /* Calculate pedestal for the given ddl, if there is no ddl go t next */
199     if(pCal->CalcPedestal(nDDL,Form("HmpidPedDdl%02i.txt",nDDL),Form("%s",feeIn.Data()),iEvtNcal)) {
200       status=daqDA_DB_storeFile(feeIn.Data(),feeIn.Data());                                               //store a single threshold file for a DDL in DAQ DB  
201       if (status) { printf("Failed to store file %s in DAQ DB, status: %d\n",feeIn.Data(),status); }
202       status=daqDA_FES_storeFile(Form("HmpidPedDdl%02i.txt",nDDL),Form("HmpidPedDdl%02i.txt",nDDL));      //store a single pedestal file for a DDL
203       if (status) { printf("Failed to export file on FES: %d\n",status); }
204     }//pedestals and thresholds
205     if(pCal->WriteErrors(nDDL,Form("HmpidErrorsDdl%02i.txt",nDDL),iEvtNcal)) {
206       status=daqDA_FES_storeFile(Form("HmpidErrorsDdl%02i.txt",nDDL),Form("HmpidErrorsDdl%02i.txt",nDDL));
207       if (status) { printf("Failed to export file : %d\n",status); }
208     }//errors
209     /* to create pedestal file as Paolo uncomment the line */
210     //if(!pCal->CalcPedestalPaolo(nDDL,Form("%sHmpidPedDdl%02i.txt",sDaOut.Data(),nDDL),iEvtNcal)) continue; 
211   }//nDDL
212
213   if(pCal->GetWritePads()==kTRUE) pCal->CloseFile();
214   delete pCal;  
215   if (status) return -1;
216   
217   /* report progress */
218   daqDA_progressReport(100);
219   
220   
221   return status;
222 }
223