/* This program reads the DAQ data files passed as argument using the monitoring library. The program reports about its processing progress. Messages on stdout are exported to DAQ log system. DA for ZDC standalone pedestal runs Contact: Chiara.Oppedisano@to.infn.it Link: Run Type: STANDALONE_PEDESTAL_RUN DA Type: LDC Number of events needed: no constraint (tipically ~10^3) Input Files: none Output Files: ZDCPedestal.dat, ZDCChMapping.dat Trigger Types Used: Standalone Trigger */ #define PEDDATA_FILE "ZDCPedestal.dat" #define PEDHISTO_FILE "ZDCPedHisto.root" #define MAPDATA_FILE "ZDCChMapping.dat" #include #include #include // DATE #include #include #include //ROOT #include #include #include #include #include #include #include #include #include "TMinuitMinimizer.h" //AliRoot #include #include #include /* Main routine Arguments: list of DATE raw data files */ int main(int argc, char **argv) { gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo", "*", "TStreamerInfo", "RIO", "TStreamerInfo()"); TMinuitMinimizer m; gROOT->GetPluginManager()->AddHandler("ROOT::Math::Minimizer", "Minuit","TMinuitMinimizer", "Minuit", "TMinuitMinimizer(const char *)"); TVirtualFitter::SetDefaultFitter("Minuit"); int status = 0; int const kNChannels = 24; int const kNScChannels = 32; Int_t ich=0; Int_t adcMod[2*kNChannels], adcCh[2*kNChannels], sigCode[2*kNChannels]; Int_t det[2*kNChannels], sec[2*kNChannels]; for(Int_t y=0; y<2*kNChannels; y++){ adcMod[y]=adcCh[y]=sigCode[y]=det[y]=sec[y]=0; } /* log start of process */ printf("\n ZDC PEDESTAL program started\n"); /* check that we got some arguments = list of files */ if (argc<2){ printf("Wrong number of arguments\n"); return -1; } // --- Histograms for ADC pedestals // [22 signal channels + 2 reference PTMs] x 2 gain chains // TH1F::AddDirectory(0); // TH1F *hPedhg[kNChannels], *hPedOutOfTimehg[kNChannels]; TH2F *hPedCorrhg[kNChannels]; TH1F *hPedlg[kNChannels], *hPedOutOfTimelg[kNChannels]; TH2F *hPedCorrlg[kNChannels]; // char namhist1hg[50], namhist2hg[50], namhist3hg[50]; char namhist1lg[50], namhist2lg[50], namhist3lg[50]; for(Int_t j=0; j=5 && j<=9){ // ZPC sprintf(namhist1hg,"PedZPChg_%d",j-5); sprintf(namhist2hg,"PedZPChgOutOfTime_%d",j-5); sprintf(namhist3hg,"PedCorrZPChg_%d",j-5); // sprintf(namhist1lg,"PedZPClg_%d",j-5); sprintf(namhist2lg,"PedZPClgOutOfTime_%d",j-5); sprintf(namhist3lg,"PedCorrZPClg_%d",j-5); } else if(j==10 || j==11){ // ZEM sprintf(namhist1hg,"PedZEMhg_%d",j-9); sprintf(namhist2hg,"PedZEMhgOutOfTime_%d",j-9); sprintf(namhist3hg,"PedCorrZEMhg_%d",j-9); // sprintf(namhist1lg,"PedZEMlg_%d",j-9); sprintf(namhist2lg,"PedZEMlgOutOfTime_%d",j-9); sprintf(namhist3lg,"PedCorrZEMlg_%d",j-9); } else if(j>=12 && j<=16){ // ZNA sprintf(namhist1hg,"PedZNAhg_%d",j-12); sprintf(namhist2hg,"PedZNAhgOutOfTime_%d",j-12); sprintf(namhist3hg,"PedCorrZNAhg_%d",j-12); // sprintf(namhist1lg,"PedZNAlg_%d",j-12); sprintf(namhist2lg,"PedZNAlgOutOfTime_%d",j-12); sprintf(namhist3lg,"PedCorrZNAlg_%d",j-12); } else if(j>=17 && j<=21){ // ZPA sprintf(namhist1hg,"PedZPAhg_%d",j-17); sprintf(namhist2hg,"PedZPAhgOutOfTime_%d",j-17); sprintf(namhist3hg,"PedCorrZPAhg_%d",j-17); // sprintf(namhist1lg,"PedZPAlg_%d",j-17); sprintf(namhist2lg,"PedZPAlgOutOfTime_%d",j-17); sprintf(namhist3lg,"PedCorrZPAlg_%d",j-17); } else if(j==22 || j==24){ //Reference PMs sprintf(namhist1hg,"PedRefhg_%d",j-22); sprintf(namhist2hg,"PedRefhgOutOfTime_%d",j-22); sprintf(namhist3hg,"PedCorrRefhg_%d",j-22); // sprintf(namhist1lg,"PedReflg_%d",j-22); sprintf(namhist2lg,"PedReflgOutOfTime_%d",j-22); sprintf(namhist3lg,"PedCorrReflg_%d",j-22); } // --- High gain chain histos hPedhg[j] = new TH1F(namhist1hg, namhist1hg, 200, 0., 200.); hPedOutOfTimehg[j] = new TH1F(namhist2hg, namhist2hg, 200, 0., 200.); hPedCorrhg[j] = new TH2F(namhist3hg,namhist3hg,100,0.,200.,100,0.,200.); // --- Low gain chain histos hPedlg[j] = new TH1F(namhist1lg, namhist1lg, 100, 0., 1000.); hPedOutOfTimelg[j] = new TH1F(namhist2lg, namhist2lg, 100, 0., 1000.); hPedCorrlg[j] = new TH2F(namhist3lg,namhist3lg,100,0.,1000.,100,0.,1000.); } /* open result file */ FILE *fp=NULL; fp=fopen("./result.txt","w"); if (fp==NULL) { printf("Failed to open file\n"); return -1; } FILE *mapFile4Shuttle; /* report progress */ daqDA_progressReport(10); /* init some counters */ int nevents_physics=0; int nevents_total=0; struct eventHeaderStruct *event; eventTypeType eventT; /* read the data files */ int n; for(n=1;nSelect("ZDC"); // --- Reading event header //UInt_t evtype = reader->GetType(); //printf("\n\t ZDCPEDESTALda -> ev. type %d\n",evtype); //printf("\t ZDCPEDESTALda -> run # %d\n",reader->GetRunNumber()); // AliZDCRawStream *rawStreamZDC = new AliZDCRawStream(reader); /* use event - here, just write event id to result file */ eventT=event->eventType; Int_t iScCh=0; Int_t scMod[kNScChannels], scCh[kNScChannels], scSigCode[kNScChannels]; Int_t scDet[kNScChannels], scSec[kNScChannels]; for(Int_t y=0; ySetSODReading(kTRUE); // -------------------------------------------------------- // --- Writing ascii data file for the Shuttle preprocessor mapFile4Shuttle = fopen(MAPDATA_FILE,"w"); if(!rawStreamZDC->Next()) printf(" \t No raw data found!! \n"); else{ while((rawStreamZDC->Next())){ if(rawStreamZDC->IsHeaderMapping()){ // mapping header modNum = rawStreamZDC->GetADCModule(); modType = rawStreamZDC->GetModType(); } if(rawStreamZDC->IsChMapping()){ if(modType==1){ // ADC mapping ---------------------- adcMod[ich] = rawStreamZDC->GetADCModFromMap(ich); adcCh[ich] = rawStreamZDC->GetADCChFromMap(ich); sigCode[ich] = rawStreamZDC->GetADCSignFromMap(ich); det[ich] = rawStreamZDC->GetDetectorFromMap(ich); sec[ich] = rawStreamZDC->GetTowerFromMap(ich); // fprintf(mapFile4Shuttle,"\t%d\t%d\t%d\t%d\t%d\t%d\n", ich,adcMod[ich],adcCh[ich],sigCode[ich],det[ich],sec[ich]); // //printf(" Mapping in DA -> %d ADC: mod %d ch %d, code %d det %d, sec %d\n", // ich,adcMod[ich],adcCh[ich],sigCode[ich],det[ich],sec[ich]); // ich++; } else if(modType==2){ //VME scaler mapping -------------------- scMod[iScCh] = rawStreamZDC->GetScalerModFromMap(iScCh); scCh[iScCh] = rawStreamZDC->GetScalerChFromMap(iScCh); scSigCode[iScCh] = rawStreamZDC->GetScalerSignFromMap(iScCh); scDet[iScCh] = rawStreamZDC->GetScDetectorFromMap(iScCh); scSec[iScCh] = rawStreamZDC->GetScTowerFromMap(iScCh); // fprintf(mapFile4Shuttle,"\t%d\t%d\t%d\t%d\t%d\t%d\n", iScCh,scMod[iScCh],scCh[iScCh],scSigCode[iScCh],scDet[iScCh],scSec[iScCh]); // //printf(" Mapping in DA -> %d Scaler: mod %d ch %d, code %d det %d, sec %d\n", // iScCh,scMod[iScCh],scCh[iScCh],scSigCode[iScCh],scDet[iScCh],scSec[iScCh]); // iScCh++; } } } } fclose(mapFile4Shuttle); }// SOD event else if(eventT==PHYSICS_EVENT){ // --- Reading data header reader->ReadHeader(); const AliRawDataHeader* header = reader->GetDataHeader(); if(header){ UChar_t message = header->GetAttributes(); if((message & 0x20) == 0x20){ // PEDESTAL RUN //printf("\t STANDALONE_PEDESTAL RUN raw data found\n"); } else{ printf("ZDCPEDESTALda.cxx -> NO STANDALONE_PEDESTAL RUN raw data found\n"); printf(" Attributes: %x\n", message); return -1; } } else{ printf("\t ATTENTION! No Raw Data Header found!!!\n"); return -1; } rawStreamZDC->SetSODReading(kTRUE); if(!rawStreamZDC->Next()) printf(" \t No raw data found!! \n"); // // ----- Setting ch. mapping ----- for(Int_t jk=0; jk<2*kNChannels; jk++){ //printf("ZDCPEDESTALDA.cxx -> ch.%d mod %d, ch %d, code %d det %d, sec %d\n", // jk,adcMod[jk],adcCh[jk],sigCode[jk],det[jk],sec[jk]); rawStreamZDC->SetMapADCMod(jk, adcMod[jk]); rawStreamZDC->SetMapADCCh(jk, adcCh[jk]); rawStreamZDC->SetMapADCSig(jk, sigCode[jk]); rawStreamZDC->SetMapDet(jk, det[jk]); rawStreamZDC->SetMapTow(jk, sec[jk]); } // Int_t iraw=0; Int_t RawADChg[kNChannels], RawADCoothg[kNChannels]; Int_t RawADClg[kNChannels], RawADCootlg[kNChannels]; for(Int_t j=0; jNext()){ Int_t index=-1; Int_t detector = rawStreamZDC->GetSector(0); Int_t sector = rawStreamZDC->GetSector(1); // //printf(" rawData: det %d sec %d value %d\n", // detector, sector,rawStreamZDC->GetADCGain(),rawStreamZDC->GetADCValue() ); if(rawStreamZDC->IsADCDataWord() && (detector!=-1)){ if(sector!=5){ // Physics signals if(detector==1) index = sector; // *** ZNC else if(detector==2) index = sector+5; // *** ZPC else if(detector==3) index = sector+9; // *** ZEM else if(detector==4) index = sector+12; // *** ZNA else if(detector==5) index = sector+17; // *** ZPA } else{ // Reference PMs index = (detector-1)/3+22; } // if(index==-1) printf("ERROR in ZDCPEDESTALda.cxx -> det %d quad %d index %d \n", detector,sector,index); // if(iraw<2*kNChannels){ // --- In-time pedestals (1st 48 raw data) if(rawStreamZDC->GetADCGain()==0){ hPedhg[index]->Fill(rawStreamZDC->GetADCValue()); RawADChg[index] = rawStreamZDC->GetADCValue(); // //printf("\t filling histo hPedhg[%d]\n",index); } else{ hPedlg[index]->Fill(rawStreamZDC->GetADCValue()); RawADClg[index] = rawStreamZDC->GetADCValue(); // //printf("\t filling histo hPedlg[%d]\n",index); } } else{ // --- Out-of-time pedestals if(rawStreamZDC->GetADCGain()==0){ hPedOutOfTimehg[index]->Fill(rawStreamZDC->GetADCValue()); RawADCoothg[index] = rawStreamZDC->GetADCValue(); // //printf("\t filling histo hPedOutOfTimehg[%d]\n",index); } else{ hPedOutOfTimelg[index]->Fill(rawStreamZDC->GetADCValue()); RawADCootlg[index] = rawStreamZDC->GetADCValue(); // //printf("\t filling histo hPedOutOfTimelg[%d]\n",index); } } iraw++; }//IsADCDataWord() // if(iraw == 4*kNChannels){ // Last ADC channel -> Filling correlation histos for(Int_t k=0; kFill(RawADCoothg[k], RawADChg[k]); hPedCorrlg[k]->Fill(RawADCootlg[k], RawADClg[k]); } } } nevents_physics++; // delete reader; delete rawStreamZDC; }//(if PHYSICS_EVENT) /* exit when last event received, no need to wait for TERM signal */ else if(eventT==END_OF_RUN) { printf(" -> EOR event detected\n"); break; } nevents_total++; } /* free resources */ free(event); } /* Analysis of the histograms */ // FILE *fileShuttle; fileShuttle = fopen(PEDDATA_FILE,"w"); // Float_t MeanPed[2*kNChannels], MeanPedWidth[2*kNChannels], MeanPedOOT[2*kNChannels], MeanPedWidthOOT[2*kNChannels]; // --- In-time pedestals TF1 *ADCfunchg[kNChannels]; for(Int_t i=0; iGetEntries() == 0){ printf("\n WARNING! Empty histos -> ending DA WITHOUT writing output\n\n"); return -1; } hPedhg[i]->Fit("gaus","Q"); ADCfunchg[i] = hPedhg[i]->GetFunction("gaus"); MeanPed[i] = (Double_t) ADCfunchg[i]->GetParameter(1); MeanPedWidth[i] = (Double_t) ADCfunchg[i]->GetParameter(2); fprintf(fileShuttle,"\t%f\t%f\n",MeanPed[i],MeanPedWidth[i]); //printf("\t MeanPedhg[%d] = %f\n",i, MeanPed[i]); } TF1 *ADCfunclg[kNChannels]; for(Int_t i=0; iFit("gaus","Q"); ADCfunclg[i] = hPedlg[i]->GetFunction("gaus"); MeanPed[i+kNChannels] = (Double_t) ADCfunclg[i]->GetParameter(1); MeanPedWidth[i+kNChannels] = (Double_t) ADCfunclg[i]->GetParameter(2); fprintf(fileShuttle,"\t%f\t%f\n",MeanPed[i+kNChannels],MeanPedWidth[i+kNChannels]); //printf("\t MeanPedlg[%d] = %f\n",i+kNChannels, MeanPed[i+kNChannels]); } // --- Out-of-time pedestals TF1 *ADCootfunchg[kNChannels]; for(Int_t i=0; iGetEntries() == 0){ printf("\n WARNING! Empty histos for out-of-time channels!!!\n\n"); return -1; } hPedOutOfTimehg[i]->Fit("gaus","Q"); ADCootfunchg[i] = hPedOutOfTimehg[i]->GetFunction("gaus"); MeanPedOOT[i] = (Double_t) ADCootfunchg[i]->GetParameter(1); MeanPedWidthOOT[i] = (Double_t) ADCootfunchg[i]->GetParameter(2); fprintf(fileShuttle,"\t%f\t%f\n",MeanPedOOT[i],MeanPedWidthOOT[i]); //printf("\t MeanPedOOThg[%d] = %f\n",i, MeanPedOOT[i]); } TF1 *ADCootfunclg[kNChannels]; for(Int_t i=0; iFit("gaus","Q"); ADCootfunclg[i] = hPedOutOfTimelg[i]->GetFunction("gaus"); MeanPedOOT[i+kNChannels] = (Double_t) ADCootfunclg[i]->GetParameter(1); MeanPedWidthOOT[i+kNChannels] = (Double_t) ADCootfunclg[i]->GetParameter(2); fprintf(fileShuttle,"\t%f\t%f\n",MeanPedOOT[i+kNChannels],MeanPedWidthOOT[i+kNChannels]); //printf("\t MeanPedOOTlg[%d] = %f\n",i+kNChannels, MeanPedOOT[i+kNChannels]); } // --- Correlations // NB -> The correlations are NOT fitted since at the moment // (Sptember 2009) they are NOT correlations and the DA would fail!!! /* Float_t CorrCoeff0[2*kNChannels], CorrCoeff1[2*kNChannels]; TProfile *hPedCorrProfhg[kNChannels], *hPedCorrProflg[kNChannels]; TF1 *ffunchg[kNChannels], *ffunclg[kNChannels]; char namhist4[50]; for(int i=0;iProfileX(namhist4,-1,-1,"S"); hPedCorrProfhg[i]->SetName(namhist4); hPedCorrProfhg[i]->Fit("pol1","Q"); ffunchg[i] = hPedCorrProfhg[i]->GetFunction("pol1"); CorrCoeff0[i] = (Double_t) ffunchg[i]->GetParameter(0); CorrCoeff1[i] = (Double_t) ffunchg[i]->GetParameter(1); fprintf(fileShuttle,"\t%f\t%f\n",CorrCoeff0[i],CorrCoeff1[i]); //printf("\t CorrCoeff0[%d] = %f, CorrCoeff1[%d] = %f\n",i, CorrCoeff0[i], i, CorrCoeff1[i]); } for(int i=0;iProfileX(namhist4,-1,-1,"S"); hPedCorrProflg[i]->SetName(namhist4); hPedCorrProflg[i]->Fit("pol1","Q"); ffunclg[i] = hPedCorrProflg[i]->GetFunction("pol1"); CorrCoeff0[i+kNChannels] = (Double_t) ffunclg[i]->GetParameter(0); CorrCoeff1[i+kNChannels] = (Double_t) ffunclg[i]->GetParameter(1); fprintf(fileShuttle,"\t%f\t%f\n",CorrCoeff0[i+kNChannels],CorrCoeff1[i+kNChannels]); //printf("\t CorrCoeff0[%d] = %f, CorrCoeff1[%d] = %f\n", // i+kNChannels, CorrCoeff0[i+kNChannels], i+kNChannels, CorrCoeff1[i+kNChannels]); } */ // fclose(fileShuttle); // /* report progress */ daqDA_progressReport(80); // TFile *histofile = new TFile(PEDHISTO_FILE,"RECREATE"); histofile->cd(); for(int k=0; kWrite(); hPedOutOfTimehg[k]->Write(); hPedCorrhg[k]->Write(); hPedlg[k]->Write(); hPedOutOfTimelg[k]->Write(); hPedCorrlg[k]->Write(); } // histofile->Close(); // for(Int_t j=0; j