Moving required CMake version from 2.8.4 to 2.8.8
[u/mrichter/AliRoot.git] / ITS / ITSSPDFOda.cxx
CommitLineData
afd9bf7e 1/*
2Contact: annalisa.mastroserio@cern.ch
3Link: tydes.home.cern.ch/tydes/doc/CalibrationOverview/CalibrationAlgorithms/
4Run Type: DAQ_FO_UNIF_SCAN
5DA Type: LDC
6Number of events needed: Depending on scan type
7Input Files: spd_focalib_params, raw data
8Output Files: ./calibResults/ScanDCSconfigToFXS/*
9Trigger types used: PHYSICS
10*/
11
286382a3 12////////////////////////////////////////////////////////////////////////////////
13// This program can be compiled in two modes. //
14// //
15// 1. With the DAQ DA framework on. This is the default operating mode. //
16// Call this program with the name of the executable followed by the //
17// data files to process. //
18// //
19// 2. Without the DAQ DA framework on. Define the SPD_DA_OFF environment var. //
20// Call this program with the name of the executable followed by the //
21// runNr and the data files to process. //
22// //
23////////////////////////////////////////////////////////////////////////////////
24
25#ifndef SPD_DA_OFF
26extern "C" {
27#include <daqDA.h>
28}
29#endif
30#include "event.h"
31#include "monitor.h"
32#include "AliRawReaderDate.h"
33#include "AliITSRawStreamSPD.h"
34#include "AliITSOnlineSPDfoChip.h"
35#include "AliITSOnlineSPDfoInfo.h"
36#include "AliITSOnlineSPDfo.h"
37#include "AliITSOnlineSPDfoAnalyzer.h"
38#include "AliLog.h"
39#include <Riostream.h>
40#include <fstream>
41#include <TROOT.h>
42#include <TStopwatch.h>
43#include <TPluginManager.h>
44#include <TObjArray.h>
45#include <TClonesArray.h>
46#include <TObjString.h>
47#include <TString.h>
48#include <TFitter.h>
49#include <TFile.h>
cc7ca4a6 50#include <cstdlib>
286382a3 51
52int main(int argc, char **argv) {
53 if (argc<2) {
54 printf("Wrong number of arguments\n");
55 return -1;
56 }
57
58
59 TStopwatch timer;
60 timer.Start();
61
62 // directory structure, hard coded
286382a3 63 char *saveDirDCSconfigToFXS= "./calibResults/ScanDCSconfigToFXS"; // may delete content
64 char *configFilesDir = "./configFiles"; // may delete content
65 char *saveDirIdsToFXS = "./calibResults/IdsToFXS";
afd9bf7e 66
67 // make sure the directory structure is correct:
68 system("mkdir ./calibResults >& /dev/null");
69 system("mkdir ./calibResults/ScanDCSconfigToFXS >& /dev/null");
70 system("mkdir ./calibResults/IdsToFXS >& /dev/null");
71 system("mkdir ./configFiles >& /dev/null");
72
73
286382a3 74 // parameters config files
75 TString thresholdsFileName = Form("%s/focalib_params.txt",configFilesDir);
76
77 TFitter *fitter = new TFitter(3);
78 TVirtualFitter::SetFitter(fitter);
79
80 // This line is needed in case of a stand-alone application w/o
81 // $ROOTSYS/etc/system.rootrc file
82 gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo",
83 "*",
84 "TStreamerInfo",
85 "RIO",
86 "TStreamerInfo()");
87
88 // turn off annoying warning messages
6d7793cf 89 // NB: Should not be handled here
45526b5e 90 AliLog* logger = AliLog::GetRootLogger();
6d7793cf 91 logger->SetGlobalDebugLevel(-20);
286382a3 92
93// ********* STEP 0: Get configuration files from db (if there are any) , then read parameters*********
94
95 //chip efficiency selection parameters (needed afterwards for the data analysis)
96 Int_t status = 0;
97#ifndef SPD_DA_OFF
98 TString idp = "spd_focalib_params";
99 status=daqDA_DB_getFile(idp.Data(),thresholdsFileName.Data());
100 if (status) {
101 printf("Failed to get config file %s: status=%d. Using default tuning parameters.\n",idp.Data(),status);
102 TString rmCmd = Form("rm -f %s",thresholdsFileName.Data());
103 system(rmCmd.Data());
104 }
105#endif
106
107
108
109 // ********* STEP 1: Produce FO scan container files (Reference Data). ***********************************
110 int startSeg = 1;
111
112#ifndef SPD_DA_OFF
113 if (getenv("DATE_RUN_NUMBER")==0) {
114 printf("DATE_RUN_NUMBER not properly set.\n");
115 return -1;
116 }
117 int runNr = atoi(getenv("DATE_RUN_NUMBER"));
118#else
119 int runNr = atoi(argv[1]);
120 startSeg = 2;
121#endif
122
123 Int_t evType =-1;
124 AliITSOnlineSPDfoInfo *info[20]; Int_t ntriggers[20]; Int_t vDB[20]; Bool_t iseq[20];
286382a3 125 AliITSOnlineSPDfo *fomanager[20];
126 TString s = "focalib";
127
128 for(Int_t equip =0; equip < 20; equip++ ) {
129 info[equip] = new AliITSOnlineSPDfoInfo();
130 info[equip]->SetRunNumber(runNr);
131 info[equip]->SetRouter(equip);
132 ntriggers[equip] = 0;
133 vDB[equip] =0;
134 iseq[equip]=kFALSE;
135 fomanager[equip] = new AliITSOnlineSPDfo(s,runNr,equip);
136 }
137
138
139 // loop over run segments
140 for (int segNr=startSeg; segNr<argc; segNr++) {
141
142 int status;
143
144 // define data source : this is argument 1
145 status=monitorSetDataSource( argv[segNr] );
146 if (status!=0) {
147 printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(status));
148 return -1;
149 }
150 // declare monitoring program
151 status=monitorDeclareMp("ITS_SPD_CAL");
152 if (status!=0) {
153 printf("monitorDeclareMp() failed : %s\n",monitorDecodeError(status));
154 return -1;
155 }
156 // define wait event timeout - 1s max
157 monitorSetNowait();
158 monitorSetNoWaitNetworkTimeout(1000);
159
160 Int_t eventType;
161 UInt_t eventNr=0;
afd9bf7e 162
286382a3 163 // main loop (infinite)
164 for(;;) {
165
166 struct eventHeaderStruct *event;
167 eventTypeType eventT;
168
169 /* check shutdown condition */
170#ifndef SPD_DA_OFF
171 if (daqDA_checkShutdown()) {break;}
172#endif
173 /* get next event (blocking call until timeout) */
174 status=monitorGetEventDynamic((void **)&event);
175 if (status==MON_ERR_EOF) {
176 printf ("End of File detected\n");
177 break; /* end of monitoring file has been reached */
178 }
179 if (status!=0) {
180 printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status));
181 break;
182 }
183 /* retry if got no event */
184 if (event==NULL) {
185 continue;
186 }
187
188 eventT=event->eventType;
189 eventType = (Int_t) eventT;
190
191 if (eventT == PHYSICS_EVENT) {
192
193 eventNr++;
194 //if(eventNr%5000 == 0 )printf(" eventNr %d\n",eventNr);
195
196 AliRawReader *reader = new AliRawReaderDate((void*)event);
197 AliITSRawStreamSPD *str = new AliITSRawStreamSPD(reader);
198
199 for (UInt_t eqId=0; eqId<20; eqId++) {
200
201 reader->Reset();
202 reader->Select("ITSSPD",eqId,eqId);
203
204 if (str->ReadCalibHeader()>0) {
205
206 if(evType<0) evType = str->GetFOHtype();
207
208 if(!iseq[eqId]){ // create output files
209 fomanager[eqId]->CreateOutputFile();
210 fomanager[eqId]->SetFOscanParams(info[eqId]);
211 iseq[eqId]=kTRUE;
212 }
213
214 if(info[eqId]->GetNumDACindex()<1) {
215 Int_t ind =0;
216 while(str->GetFOHdacIndex(ind)>0) {
217 info[eqId]->AddDACindex(str->GetFOHdacIndex(ind));
218 ind++;
219 }
220 }
221
222 if(!ntriggers[eqId]) {
223 ntriggers[eqId] = str->GetFOHtriggers();
224 info[eqId]->SetNumTriggers(str->GetFOHtriggers());
225 }
226 if(!vDB[eqId]) {
227 vDB[eqId] = str->GetFOHglobalDBversion();
228 info[eqId]->SetDBversion(str->GetFOHglobalDBversion());
229 }
230
231 if(!fomanager[eqId]->GetNdacs()) fomanager[eqId]->SetNdacs(str->GetFOHnumDacs());
232
233 TArrayS dacvalues(str->GetFOHnumDacs());
afd9bf7e 234 for(Int_t n = 0; n<(Int_t)str->GetFOHnumDacs(); n++) dacvalues.AddAt(str->GetFOHdacValue(n),n);
286382a3 235
236 TArrayS dacs = fomanager[eqId]->CreateDACArray(dacvalues, info[eqId]->GetDACIndexArray());
237
238 for(Int_t ihs =0; ihs < 6; ihs++) { // needed in the header to access the HS and ChipId info (in data it is different)
239 for(Int_t ich =0; ich < 10; ich++){
240 if(!str->GetFOHchipPresent(ihs, ich)) continue;
14374702 241 info[eqId]->SetActiveChipsAndHS(ihs,ich);
286382a3 242 Short_t measure[4] = {str->GetFOHMatrixID(),str->GetFOHpixelRow(), str->GetFOHpixelCol(), str->GetFOHchipCount(ihs,ich)};
243 fomanager[eqId]->AddMeasurement(dacs,measure,ihs,ich);
244 } // chip loop
245 }// HS loop
246 }// if str->ReadHeader()>0;
247 }//if eqId
248 delete str;
249 delete reader;
250 }
251
252 // free resources
253 free(event);
254 }// infinite loop
255
256
257
258
259#ifndef SPD_DA_OFF
260 daqDA_progressReport((unsigned int)( ((Float_t)(segNr-startSeg+1))/(argc-startSeg)*50 ));
261#else
262 printf("progress: %d\n",(unsigned int)( ((Float_t)(segNr-startSeg+1))/(argc-startSeg)*50 ));
263#endif
264
265 }// loop over run segments
266
267
268 TString id[20], files[20];
269 for(Int_t ifile =0; ifile < 20; ifile++) {
270 if(iseq[ifile]){
271 id[ifile] = Form("SPD_ref_fo%02i",ifile);
272 files[ifile] = fomanager[ifile]->GetFile()->GetName();
273 fomanager[ifile]->WriteToFile();
274 }
275 delete fomanager[ifile];
276 }
277
278
279 // ANALYSIS part
280
281 for(Int_t iff =0; iff<20 ; iff++){
282 if(!iseq[iff]) continue;
283
284 AliITSOnlineSPDfoAnalyzer * analyzer = new AliITSOnlineSPDfoAnalyzer(Form("%i_%s%02i.root",runNr,s.Data(),iff));
285 analyzer->ReadParamsFromLocation(configFilesDir);
286 analyzer->Process();
287
288 TString dcsConfigFileName = Form("%s/dcsConfig_run_%d_eq_%d.txt",saveDirDCSconfigToFXS,runNr,iff);
289 ofstream dcsfile;
290 dcsfile.open(dcsConfigFileName.Data());
291 dcsfile << "[SPD SCAN]\n";
292 dcsfile << "RunNumber=" << runNr << "\n";
293 dcsfile << "Type="<< evType <<"\n";
294 dcsfile << "Router=" << iff << "\n";
295 dcsfile << "ActualDetConfiguration=" << vDB[iff]<<"\n\n";
296 dcsfile << "[DACvalues]\n";
297
298 for(Int_t hs =0; hs<6; hs++){
299 for(Int_t ichip =0; ichip < 10; ichip++){
300 TArrayI dacs = analyzer->ChooseDACValues(hs,ichip);
301
302 if(dacs.GetSize() == 0) continue;
303 for(Int_t idac =0; idac < dacs.GetSize() - 1; idac++) { // -1 (the last one is the quality flag)
304 if(dacs.At(idac) >=0 ) {
14374702 305
286382a3 306 dcsfile << ((analyzer->GetFOHandler())->GetFOscanInfo())->GetDACindex(idac) << ",";
307 dcsfile << iff << ",";
308 dcsfile << hs << ",";
309 dcsfile << ichip << "=" ;
310 dcsfile << dacs.At(idac) << ",";
311 dcsfile << dacs.At(dacs.GetSize() - 1) << "\n";
312 }
313 }
314 }
315 }
316 dcsfile.close();
317 }
318
319
320 printf("Preparing DCS config files\n");
321 // send a tared file of all the dcsConfig text files
322 TString command = Form("cd %s; tar -cf dcsConfig.tar *",saveDirDCSconfigToFXS);
323 //printf("\n\n%s\n\n",command.Data());
afd9bf7e 324 system(command.Data());
286382a3 325 TString fileName = Form("%s/dcsConfig.tar",saveDirDCSconfigToFXS);
326 TString iddcs = "SPD_dcsConfig";
327
328#ifndef SPD_DA_OFF
329 status = daqDA_FES_storeFile(fileName.Data(),iddcs.Data());
330 if (status!=0) {
331 printf("Failed to export file %s , status %d\n",fileName.Data(),status);
332 return -1;
333 }
334#endif
335
336
337 printf("Opening id list file\n");
338 TString idsFXSFileName = Form("%s/FXSids_run_%d.txt",saveDirIdsToFXS,runNr);
339 ofstream idsFXSfile;
340 idsFXSfile.open(idsFXSFileName.Data());
341
342 // send reference data to FXS
343 for (UInt_t eqId=0; eqId<20; eqId++) {
344 if(!iseq[eqId]) continue;
345 //printf("Preparing reference data for eq %d\n",eqId);
346
5e575679 347 TString idf = Form("SPD_ref_fo_%d",eqId);
286382a3 348#ifndef SPD_DA_OFF
349 status = daqDA_FES_storeFile(files[eqId].Data(),idf.Data());
350 if (status!=0) {
351 printf("Failed to export file %s , status %d\n",files[eqId].Data(),status);
352 return -1;
353 }
354#endif
355 idsFXSfile << Form("%s\n",idf.Data());
356 }
357
e737a317 358
359
360 printf("Preparing id list file\n");
361 idsFXSfile.close();
362 TString idlist = "SPD_id_list";
363#ifndef SPD_DA_OFF
364 status = daqDA_FES_storeFile(idsFXSFileName.Data(),idlist.Data());
365 if (status!=0) {
366 printf("Failed to export file %s , status %d\n",idsFXSFileName.Data(),status);
367 return -1;
368 }
369#endif
370
371
372
286382a3 373 timer.Stop();
374 timer.Print();
375 printf("DA finished.\n");
376 return 0;
377}