Corrected documentation fields
[u/mrichter/AliRoot.git] / TRD / TRDVDRIFTda.cxx
1 /*
2
3 Contact: r.bailhache@gsi.de
4 Link: http://www-linux.gsi.de/~bailhach/VDRIFT/raw.root.date
5 Run Type: nothing special in ECS, physics run
6 DA Type: MON
7 Number of events needed: as many as possible
8 Input Files: no config files, no previous result files, RAW DATA file with all the TRD ([DDL = 1024 to DDL = 1041])
9 Output Files: trdCalibrationv.root, trdCalibrationv.root, no persitent file over runs
10 Trigger types used: PHYSICS
11
12 */
13
14 #define RESULT_FILE "trdCalibrationv.root"
15
16
17 extern "C" {
18 #include <daqDA.h>
19 }
20
21 #include "event.h"
22 #include "monitor.h"
23 #include <stdio.h>
24 #include <stdlib.h>
25
26
27 //
28 //Root includes
29 //
30 #include <TObjArray.h>
31 #include <TString.h>
32 #include <TVectorF.h>
33 #include <TROOT.h>
34 #include <TDirectory.h>
35 #include <TSystem.h>
36 #include <TFile.h>
37 //
38 //AliRoot includes
39 //
40 #include "AliRawReader.h"
41 #include "AliRawReaderDate.h"
42 #include "AliTRDRawStreamTB.h"
43 #include "AliCDBManager.h"
44
45 //
46 // TRD calibration algorithm includes
47 //
48 #include "AliTRDCalibraFillHisto.h"
49
50
51
52
53 /* Main routine
54       Arguments: 
55       1- monitoring data source
56 */
57 int main(int argc, char **argv) {
58
59   int status;
60
61   if (argc!=2) {
62     printf("Wrong number of arguments\n");
63     return -1;
64   }
65
66
67   /* define data source : this is argument 1 */  
68   status=monitorSetDataSource( argv[1] );
69   if (status!=0) {
70     printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(status));
71     return -1;
72   }
73
74
75   /* declare monitoring program */
76   status=monitorDeclareMp( __FILE__ );
77   if (status!=0) {
78     printf("monitorDeclareMp() failed : %s\n",monitorDecodeError(status));
79     return -1;
80   }
81
82
83   /* define wait event timeout - 1s max */
84   monitorSetNowait();
85   monitorSetNoWaitNetworkTimeout(1000);
86   
87
88   /* log start of process */
89   printf("TRD DA VDRIFT started\n");  
90
91
92   /* init some counters */
93   int nevents_physics=0;
94   int nevents_total=0;
95
96   //Instance of AliCDBManager: needed by AliTRDRawStreamV2
97   AliCDBManager *man = AliCDBManager::Instance();
98   man->SetDefaultStorage("local://$ALICE_ROOT");
99   man->SetRun(0);
100   //Instance of AliTRDCalibraFillHisto
101   AliTRDCalibraFillHisto *calibra      = AliTRDCalibraFillHisto::Instance();
102   // everythings are okey for vdrift
103   Bool_t passvdrift  = kTRUE;    // if timebin okey
104   Int_t  nbvdrift    = 0;     // number of events with entries for vdrift
105
106
107   /* some warning less */
108   AliTRDRawStreamTB::SupressWarnings(kTRUE);
109
110   
111   /* main loop (infinite) */
112   for(;;) {
113   //for(Int_t k = 0; k < 20; k++) {
114     struct eventHeaderStruct *event;
115     eventTypeType eventT;
116
117     /* check shutdown condition */
118     if (daqDA_checkShutdown()) {break;}
119     
120     /* get next event (blocking call until timeout) */
121     status=monitorGetEventDynamic((void **)&event);
122     if (status==MON_ERR_EOF) {
123       printf ("End of File detected\n");
124       break; /* end of monitoring file has been reached */
125     }
126     
127     if (status!=0) {
128       printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status));
129       break;
130     }
131
132     /* retry if got no event */
133     if (event==NULL) {
134       continue;
135     }
136
137     if( ((Int_t)nevents_total)%100 == 0 ) printf(" event number %d (physic event number %d) will be processed\n",(Int_t) nevents_total,(Int_t) nevents_physics);  
138
139
140     /* use event - here, just write event id to result file */
141     eventT=event->eventType;
142     
143     //
144     // vdrift calibration: run only for physics events
145     //
146     if ((eventT==PHYSICS_EVENT) && (passvdrift)) {
147       //if (eventT==PHYSICS_EVENT) {
148       AliRawReader *rawReader = new AliRawReaderDate((void*)event);
149       AliTRDRawStreamTB *trdRawStream = new AliTRDRawStreamTB((AliRawReader *) rawReader);
150       Int_t result = calibra->ProcessEventDAQ(trdRawStream,(Bool_t)nevents_physics);
151       if(!result) passvdrift = kFALSE;
152       else nbvdrift += (Int_t) result/2;
153              
154       
155       delete trdRawStream;
156       delete rawReader;
157     } 
158    
159     if(eventT==PHYSICS_EVENT){
160  
161       nevents_physics++;
162      
163     }
164     
165     nevents_total++;
166
167
168     /* free resources */
169     free(event);
170     
171     /* exit when last event received, no need to wait for TERM signal */
172     if (eventT==END_OF_RUN) {
173       printf("EOR event detected\n");
174       break;
175     }
176   }
177
178
179   /* report progress */
180   printf("%d events processed and %d used\n",nevents_total,nbvdrift);
181   
182   //
183   // Write a local file and put it on the FX 
184   //
185   TFile  *fileTRD     = new TFile(RESULT_FILE,"recreate");
186  
187   if((nbvdrift > 0) && passvdrift){
188     //Double_t *stat = calibra->StatH((TH2 *)(calibra->GetPH2d()),1);
189     //if((stat[6] < 0.20) && (stat[5] > 3000.0)) {
190     // write the histogram in any case to see if problems
191     calibra->GetPH2d()->Write();
192     //}
193   }
194   fileTRD->Close();
195   status=0;
196   // Export the file in any case to see if problems
197   if(daqDA_FES_storeFile(RESULT_FILE,RESULT_FILE)) status = -2;
198   
199   delete fileTRD;  
200
201   return status;
202 }