]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TRD/TRDVDRIFTda.cxx
BlockFilter component added; minor corrections
[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 "AliTRDRawStreamV2.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   /* main loop (infinite) */
108   for(;;) {
109   //for(Int_t k = 0; k < 20; k++) {
110     struct eventHeaderStruct *event;
111     eventTypeType eventT;
112
113     /* check shutdown condition */
114     if (daqDA_checkShutdown()) {break;}
115     
116     /* get next event (blocking call until timeout) */
117     status=monitorGetEventDynamic((void **)&event);
118     if (status==MON_ERR_EOF) {
119       printf ("End of File detected\n");
120       break; /* end of monitoring file has been reached */
121     }
122     
123     if (status!=0) {
124       printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status));
125       break;
126     }
127
128     /* retry if got no event */
129     if (event==NULL) {
130       continue;
131     }
132
133     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);  
134
135
136     /* use event - here, just write event id to result file */
137     eventT=event->eventType;
138     
139     //
140     // vdrift calibration: run only for physics events
141     //
142     if ((eventT==PHYSICS_EVENT) && (passvdrift)) {
143       //if (eventT==PHYSICS_EVENT) {
144       AliRawReader *rawReader = new AliRawReaderDate((void*)event);
145       AliTRDRawStreamV2 *trdRawStream = new AliTRDRawStreamV2((AliRawReader *) rawReader);
146       Int_t result = calibra->ProcessEventDAQ(trdRawStream,(Bool_t)nevents_physics);
147       if(!result) passvdrift = kFALSE;
148       else nbvdrift += (Int_t) result/2;
149              
150       
151       delete trdRawStream;
152       delete rawReader;
153     } 
154    
155     if(eventT==PHYSICS_EVENT){
156  
157       nevents_physics++;
158      
159     }
160     
161     nevents_total++;
162
163
164     /* free resources */
165     free(event);
166     
167     /* exit when last event received, no need to wait for TERM signal */
168     if (eventT==END_OF_RUN) {
169       printf("EOR event detected\n");
170       break;
171     }
172   }
173
174
175   /* report progress */
176   printf("%d events processed and %d used\n",nevents_total,nbvdrift);
177   
178   //
179   // Write a local file and put it on the FX 
180   //
181   TFile  *fileTRD     = new TFile(RESULT_FILE,"recreate");
182  
183   if((nbvdrift > 0) && passvdrift){
184     //Double_t *stat = calibra->StatH((TH2 *)(calibra->GetPH2d()),1);
185     //if((stat[6] < 0.20) && (stat[5] > 3000.0)) {
186     // write the histogram in any case to see if problems
187     calibra->GetPH2d()->Write();
188     //}
189   }
190   fileTRD->Close();
191   status=0;
192   // Export the file in any case to see if problems
193   if(daqDA_FES_storeFile(RESULT_FILE,RESULT_FILE)) status = -2;
194   
195   delete fileTRD;  
196
197   return status;
198 }