451be9fd70c6af6c4066d1d2790331c3a4f872e2
[u/mrichter/AliRoot.git] / PHOS / DA / PHOSCPVPEDda.cxx
1 /*
2 CPV PED DA for processing pedestal runs and producing pedestal tables for loading to CPV FEE.
3
4 Contact: Sergey Evdokimov <sevdokim@cern.ch>
5 Link: https://twiki.cern.ch/twiki/bin/view/ALICE/CPVda
6 Reference run: 211758 (/afs/cern.ch/user/s/sevdokim/public/CPV_run211758_pedestal.raw)
7 Run Type:  PHYSICS
8 DA Type: PED
9 Number of events needed: 2000 events
10 Input files: raw data file
11 Output files: thr?_??.dat CpvPeds.root
12 Trigger types used: PHYSICS_EVENT
13 */
14 //daqDA
15 #include "event.h"
16 #include "monitor.h"
17 #include "daqDA.h"
18 //system
19 #include <Riostream.h>
20 #include <stdlib.h>
21 #include <fstream>
22 #include <string>
23
24 //AliRoot
25 #include "AliPHOSCpvRawStream.h"
26 #include "AliPHOSCpvPedProducer.h"
27 #include "AliPHOSCpvParam.h"
28 #include "AliRawReaderDate.h"
29 #include "AliBitPacking.h"
30
31 //ROOT
32 #include "TROOT.h"
33 #include "TPluginManager.h"
34 #include "TSAXParser.h"
35 #include "TTree.h"
36 #include "TMath.h"
37 #include "TString.h"
38 #include "TFile.h"
39 #include "TSystem.h"
40 #include "TKey.h"
41 #include "TH2S.h"
42 #include "TH2F.h"
43 #include "TObject.h"
44 #include "TBenchmark.h"
45 #include "TMath.h"
46 #include "TRandom.h"
47
48
49 int main( int argc, char **argv )
50 {
51   gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo",
52                                         "*",
53                                         "TStreamerInfo",
54                                         "RIO",
55                                         "TStreamerInfo()");
56   Int_t status,print;
57   Int_t sigcut=3;
58   Bool_t turbo = kTRUE;
59
60   if (argc!=2) {
61     printf("Wrong number of arguments\n");
62     return -1;
63   }
64
65   // log start of process
66   printf("Cpv pedestal DA program started\n");
67
68   /* report progress */
69   daqDA_progressReport(0);
70
71   status=monitorSetDataSource( argv[1] );
72   if (status!=0) {
73     printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(status));
74     return -1;
75   }
76
77   /* declare monitoring program */
78   status=monitorDeclareMp( __FILE__ );
79   if (status!=0) {
80     printf("monitorDeclareMp() failed : %s\n",monitorDecodeError(status));
81     return -1;
82   }
83
84   /* define wait event timeout - 1s max */
85   monitorSetNowait();
86   monitorSetNoWaitNetworkTimeout(1000);
87
88     /* report progress */
89   daqDA_progressReport(5);
90
91
92   // init event counter
93   Int_t iPhysEvnt=0;
94   Int_t iTotEvnt =0;
95
96   AliPHOSCpvPedProducer * pedProducer = new AliPHOSCpvPedProducer(sigcut);
97
98   // Reader
99   AliRawReader * reader;
100
101   /* report progress */
102   daqDA_progressReport(10);
103
104   /* main loop (infinite) */
105   for(;;) { // infinite loop
106     struct eventHeaderStruct *event;
107     eventTypeType eventT;
108
109     /* check shutdown condition */
110     if (daqDA_checkShutdown()) {break;}
111
112     // get next event
113     status=monitorGetEventDynamic((void **)&event);
114     if (status==MON_ERR_EOF) { // end of monitoring file has been reached
115       printf("End of monitoring file has been reached! \n");
116       break;
117     }
118
119     if (status!=0) {
120       printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status));
121       break;
122     }
123
124     // retry if got no event
125     if (event==NULL) continue;
126
127     // use event - here, just write event id to result file
128     eventT=event->eventType;
129     if (eventT==PHYSICS_EVENT) { //we use PHYSICS_EVENT for pedestal not CALIBRATION_EVENT???
130       iTotEvnt++;
131       reader = new AliRawReaderDate((void*)event);
132       pedProducer->LoadNewEvent(reader);
133       if(pedProducer->FillPedestal()) iPhysEvnt++;
134       delete reader;
135     } // if PHYSICS_EVENT
136
137     free(event);
138
139     /* exit when last event received, no need to wait for TERM signal */
140     if (eventT==END_OF_RUN) {
141       printf("EOR event detected\n");
142       break;
143     }
144   }
145
146   Printf(" Received %d events, %d good events",iTotEvnt,iPhysEvnt);
147   /* report progress */
148   daqDA_progressReport(95);
149
150   for(int iDDL = 0; iDDL<2*AliPHOSCpvParam::kNDDL; iDDL++){
151     if(pedProducer -> CalcPedestal(iDDL)){
152       pedProducer -> WritePedFiles(iDDL);
153       for (int iCC = 0; iCC<AliPHOSCpvParam::kNRows; iCC++){
154         status=daqDA_DB_storeFile(Form("thr%d_%02d.dat", iDDL, iCC),Form("thr%d_%02d.dat", iDDL, iCC));
155         if(status) printf("Failed to store thr%d_%02d.dat in DAQ DB!\n",iDDL, iCC);
156         //status=daqDA_FES_storeFile(Form("thr%d_%02d.dat", iDDL, iCC));
157         //if(status) printf("Failed to export thr%d_%02d.dat to DAQ FES!\n",iDDL, iCC);
158       }
159     }
160   }
161
162   pedProducer->WriteAllHistsToFile("CpvPeds.root");
163   status = daqDA_DB_storeFile("CpvPeds.root","CpvPeds.root");
164   if(status) printf("Failed to store CpvPeds.root in DAQ DB!\n");
165   status = daqDA_FES_storeFile("CpvPeds.root","CpvPeds.root");
166   if(status) printf("Failed to store CpvPeds.root in DAQ FXS!\n");
167
168   /* report progress */
169   daqDA_progressReport(100);
170
171
172   return status;
173 }