1 /*********************************************************************************
2 - Contact: Brigitte Cheynis b.cheynis@ipnl.in2p3.fr
5 - Reference run number : 137366
8 - Number of events needed: >=2000
9 - Input Files: argument list
10 - Output Files: FXS file V0_EqualizationFactors.dat (Channel equalization factors)
11 - Trigger types used: PHYSICS_EVENT
12 **********************************************************************************/
14 /**********************************************************************************
16 * VZERO Detector Algorithm for extracting channel equalization factors for Pb-Pb *
19 ***********************************************************************************/
27 #include <AliVZERORawStream.h>
28 #include <AliRawReaderDate.h>
29 #include <AliRawReader.h>
38 #include "TPluginManager.h"
43 Int_t GetOfflineChannel(Int_t channel);
45 /* Main routine --- Arguments: monitoring data source */
47 int main(int argc, char **argv) {
49 /* magic line from Cvetan */
50 gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo",
57 printf("Wrong number of arguments\n");
61 //___________________________________________________
62 // Get parameters from V00DAEqualFactors.config file
64 Int_t kStartClock = 9; // First clock in the search for max adc
65 Int_t kEndClock = 11; // Last clock in the search for max adc
66 Int_t kNPreClocks = 6; // Number of clock before max used in the charge sum
67 Int_t kNPostClocks = 1; // Number of clock after max used in the charge sum
69 UChar_t kNFlagsCut = 63;// Minimum number of TDC flags requested, replaces the trigger selection
74 status = daqDA_DB_getFile("V00DAEqualFactors.config","./V00DAEqualFactors.config");
76 printf("Failed to get Config file (V00DAEqualFactors.config) from DAQ DB, status=%d\n", status);
77 printf("Take default values of parameters for pedestal calculation \n");
79 /* open the config file and retrieve cuts */
80 FILE *fpConfig = fopen("V00DAEqualFactors.config","r");
81 int res = fscanf(fpConfig,"%d %d %d %d %hhu %d %f",
82 &kStartClock,&kEndClock,&kNPreClocks,&kNPostClocks,&kNFlagsCut,&kNBins,&kRange);
84 printf("Failed to get values from Config file (V00DAEqualFactors.config): wrong file format - 6 integers and 1 float are expected - \n");
89 printf("First LHC Clock = %d; Last LHC Clock = %d; N Pre Clock = %d ; N Post Clock = %d; Minimum number of TDC flags = %hhu; Number of histogram bins = %d; Histogram range = %.3f\n",
90 kStartClock, kEndClock, kNPreClocks, kNPostClocks, kNFlagsCut, kNBins, kRange);
93 for(Int_t j = 0; j < 64; ++j) fMedian[j] = new TH1D(Form("fMedian_%d",j),"Slopes weighted median, channel par channel",kNBins,0,kRange);
95 Bool_t fFirst = kTRUE;
96 Float_t fPrevTotCharge = 0;
98 for(Int_t j = 0; j < 64; ++j) fPrevadc[j] = 0;
100 //___________________________________________________
102 /* define data source : this is argument 1 */
103 status=monitorSetDataSource( argv[1] );
105 printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(status));
109 /* declare monitoring program */
110 status=monitorDeclareMp( __FILE__ );
112 printf("monitorDeclareMp() failed : %s\n",monitorDecodeError(status));
116 /* define wait event timeout - 1s max */
118 monitorSetNoWaitNetworkTimeout(1000);
120 /* init counters on events */
121 int neventsPhysics=0;
125 /* loop on events (infinite) */
127 struct eventHeaderStruct *event;
128 eventTypeType eventT;
130 /* check shutdown condition */
131 if (daqDA_checkShutdown()) {break;}
133 /* get next event (blocking call until timeout) */
134 status=monitorGetEventDynamic((void **)&event);
135 if (status==MON_ERR_EOF) {
136 printf ("End of File detected\n");
137 break; /* end of monitoring file has been reached */
141 printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status));
145 /* retry if got no event */
146 if (event==NULL) continue;
149 eventT=event->eventType;
151 switch (event->eventType){
157 printf("End Of Run detected\n");
162 AliRawReader *rawReader = new AliRawReaderDate((void*)event);
164 AliVZERORawStream* rawStream = new AliVZERORawStream(rawReader);
165 if (rawStream->Next()) {
166 UShort_t triggers = rawStream->GetTriggerInputs();
168 for(Int_t i = 0; i < 64; ++i) {
169 if (rawStream->GetBBFlag(i,10)) nFlags++;
171 if (nFlags >= kNFlagsCut) { // Check if the number of minimum number of TDC flags is reached (trigger selection)
176 Float_t totCharge = 0.;
177 for(Int_t i = 0; i < 64; ++i) {
181 for(Int_t j = kStartClock; j <= kEndClock; ++j) {
182 Float_t charge = (Float_t)(rawStream->GetPedestal(i,j));
190 Int_t start = imax - kNPreClocks;
191 if (start < 0) start = 0;
192 Int_t end = imax + kNPostClocks;
193 if (end > 20) end = 20;
194 for(Int_t iClock = start; iClock <= end; iClock++) {
195 adc[i] += (Float_t)(rawStream->GetPedestal(i,iClock));
203 fPrevTotCharge = totCharge;
204 for(int i = 0; i < 64; ++i) fPrevadc[i] = adc[i];
208 Float_t deltaTotCharge = totCharge - fPrevTotCharge;
209 Float_t weight = deltaTotCharge*deltaTotCharge;
211 for(int i = 0; i < 64; ++i) {
212 fMedian[i]->Fill((adc[i]-fPrevadc[i])/deltaTotCharge,weight);
218 } // End : if rawstream
223 } // end of switch on event type
229 /* exit when last event received, no need to wait for TERM signal */
230 if (eventT==END_OF_RUN) {
231 printf("End Of Run event detected\n");
235 } // loop over events
237 printf("%d physics events processed\n",neventsPhysics);
239 //___________________________________________________________________________
240 // Computes regression parameters
241 // charge_i = p0 + charge_tot * p1
243 if(neventsPhysics>2000){
244 /* open result file to be exported to FES */
246 fp=fopen("./V0_EqualizationFactors.dat","w");
248 printf("Failed to open local result file\n");
253 for(int i = 0; i < 64; ++i) fMedian[i]->GetQuantiles(1,&beta[i],&q);
255 for(Int_t i=0; i<64; i++) {
256 fprintf(fp," %d %.3f\n",GetOfflineChannel(i), beta[i]*64.);
257 printf(" %d %.3f\n",GetOfflineChannel(i), beta[i]*64.);
260 /* close local result file and FXS result file*/
264 //________________________________________________________________________
266 /* export result file to FES */
267 status=daqDA_FES_storeFile("./V0_EqualizationFactors.dat","V00DAEqualFactors");
269 printf("Failed to export file : %d\n",status);
272 /* store result file into Online DB */
273 status=daqDA_DB_storeFile("./V0_EqualizationFactors.dat","V00DAEqualFactors");
275 printf("Failed to store file into Online DB: %d\n",status);
281 Int_t GetOfflineChannel(Int_t channel) {
283 // Channel mapping Online - Offline:
285 Int_t fOfflineChannel[64] = {39, 38, 37, 36, 35, 34, 33, 32,
286 47, 46, 45, 44, 43, 42, 41, 40,
287 55, 54, 53, 52, 51, 50, 49, 48,
288 63, 62, 61, 60, 59, 58, 57, 56,
289 7, 6, 5, 4, 3, 2, 1, 0,
290 15, 14, 13, 12, 11, 10, 9, 8,
291 23, 22, 21, 20, 19, 18, 17, 16,
292 31, 30, 29, 28, 27, 26, 25, 24};
293 return fOfflineChannel[channel];