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 UShort_t kTriggerAcc = 64; // Trigger mask for accepted events (64 = CTA1 & CTC1)
70 UShort_t kTriggerRej = 256; // Trigger mask for rejected events (256 = CTA2 & CTC2)
75 status = daqDA_DB_getFile("V00DAEqualFactors.config","./V00DAEqualFactors.config");
77 printf("Failed to get Config file (V00DAEqualFactors.config) from DAQ DB, status=%d\n", status);
78 printf("Take default values of parameters for pedestal calculation \n");
80 /* open the config file and retrieve cuts */
81 FILE *fpConfig = fopen("V00DAEqualFactors.config","r");
82 int res = fscanf(fpConfig,"%d %d %d %d %hu %hu %d %f",
83 &kStartClock,&kEndClock,&kNPreClocks,&kNPostClocks,&kTriggerAcc,&kTriggerRej,&kNBins,&kRange);
85 printf("Failed to get values from Config file (V00DAEqualFactors.config): wrong file format - 7 integers and 1 float are expected - \n");
90 printf("First LHC Clock = %d; Last LHC Clock = %d; N Pre Clock = %d ; N Post Clock = %d; Trigger mask for accepted events = %u; Trigger mask for rejected events = %u; Number of histogram bins = %d; Histogram range = %.3f\n",
91 kStartClock, kEndClock, kNPreClocks, kNPostClocks, kTriggerAcc, kTriggerRej, kNBins, kRange);
94 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);
96 Bool_t fFirst = kTRUE;
97 Float_t fPrevTotCharge = 0;
99 for(Int_t j = 0; j < 64; ++j) fPrevadc[j] = 0;
101 //___________________________________________________
103 /* define data source : this is argument 1 */
104 status=monitorSetDataSource( argv[1] );
106 printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(status));
110 /* declare monitoring program */
111 status=monitorDeclareMp( __FILE__ );
113 printf("monitorDeclareMp() failed : %s\n",monitorDecodeError(status));
117 /* define wait event timeout - 1s max */
119 monitorSetNoWaitNetworkTimeout(1000);
121 /* init counters on events */
122 int neventsPhysics=0;
126 /* loop on events (infinite) */
128 struct eventHeaderStruct *event;
129 eventTypeType eventT;
131 /* check shutdown condition */
132 if (daqDA_checkShutdown()) {break;}
134 /* get next event (blocking call until timeout) */
135 status=monitorGetEventDynamic((void **)&event);
136 if (status==MON_ERR_EOF) {
137 printf ("End of File detected\n");
138 break; /* end of monitoring file has been reached */
142 printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status));
146 /* retry if got no event */
147 if (event==NULL) continue;
150 eventT=event->eventType;
152 switch (event->eventType){
158 printf("End Of Run detected\n");
163 AliRawReader *rawReader = new AliRawReaderDate((void*)event);
165 AliVZERORawStream* rawStream = new AliVZERORawStream(rawReader);
166 if (rawStream->Next()) {
167 UShort_t triggers = rawStream->GetTriggerInputs();
168 if (((triggers & kTriggerAcc) == kTriggerAcc) && // Check if the requested trigger(s) is fired
169 ((triggers & kTriggerRej) == 0)) { // Check if the requested trigger(s) is NOT fired
173 Float_t totCharge = 0.;
174 for(Int_t i = 0; i < 64; ++i) {
178 for(Int_t j = kStartClock; j <= kEndClock; ++j) {
179 Float_t charge = (Float_t)(rawStream->GetPedestal(i,j));
187 Int_t start = imax - kNPreClocks;
188 if (start < 0) start = 0;
189 Int_t end = imax + kNPostClocks;
190 if (end > 20) end = 20;
191 for(Int_t iClock = start; iClock <= end; iClock++) {
192 adc[i] += (Float_t)(rawStream->GetPedestal(i,iClock));
200 fPrevTotCharge = totCharge;
201 for(int i = 0; i < 64; ++i) fPrevadc[i] = adc[i];
205 Float_t deltaTotCharge = totCharge - fPrevTotCharge;
206 Float_t weight = deltaTotCharge*deltaTotCharge;
208 for(int i = 0; i < 64; ++i) {
209 fMedian[i]->Fill((adc[i]-fPrevadc[i])/deltaTotCharge,weight);
215 } // End : if rawstream
220 } // end of switch on event type
226 /* exit when last event received, no need to wait for TERM signal */
227 if (eventT==END_OF_RUN) {
228 printf("End Of Run event detected\n");
232 } // loop over events
234 printf("%d physics events processed\n",neventsPhysics);
236 //___________________________________________________________________________
237 // Computes regression parameters
238 // charge_i = p0 + charge_tot * p1
240 if(neventsPhysics>2000){
241 /* open result file to be exported to FES */
243 fp=fopen("./V0_EqualizationFactors.dat","w");
245 printf("Failed to open local result file\n");
250 for(int i = 0; i < 64; ++i) fMedian[i]->GetQuantiles(1,&beta[i],&q);
252 for(Int_t i=0; i<64; i++) {
253 fprintf(fp," %d %.3f\n",GetOfflineChannel(i), beta[i]*64.);
254 printf(" %d %.3f\n",GetOfflineChannel(i), beta[i]*64.);
257 /* close local result file and FXS result file*/
261 //________________________________________________________________________
263 /* export result file to FES */
264 status=daqDA_FES_storeFile("./V0_EqualizationFactors.dat","V00DAEqualFactors");
266 printf("Failed to export file : %d\n",status);
269 /* store result file into Online DB */
270 status=daqDA_DB_storeFile("./V0_EqualizationFactors.dat","V00DAEqualFactors");
272 printf("Failed to store file into Online DB: %d\n",status);
278 Int_t GetOfflineChannel(Int_t channel) {
280 // Channel mapping Online - Offline:
282 Int_t fOfflineChannel[64] = {39, 38, 37, 36, 35, 34, 33, 32,
283 47, 46, 45, 44, 43, 42, 41, 40,
284 55, 54, 53, 52, 51, 50, 49, 48,
285 63, 62, 61, 60, 59, 58, 57, 56,
286 7, 6, 5, 4, 3, 2, 1, 0,
287 15, 14, 13, 12, 11, 10, 9, 8,
288 23, 22, 21, 20, 19, 18, 17, 16,
289 31, 30, 29, 28, 27, 26, 25, 24};
290 return fOfflineChannel[channel];