/* HMPID DA for online calibration Contact: Levente.Molnar@ba.infn.it, Giacomo.Volpe@ba.infn.it Link: http://richpc1.ba.infn.it/~levente/Files4Public/ValidateHmpidDA/ Run Type: PEDESTAL -- but we select on the PHYSICS_EVENTS in th HMPIDda.cxx DA Type: LDC Number of events needed: 1000 events Input Files: Raw pedestal file, EXTERNAL config file: HmpidSigmaCut.txt on both HMPID LDCs Output Files: 14 txt files including pedestal values Trigger types used: PEDESTAL RUN (selecting on PHYSICS_EVENT) */ extern "C" { #include } #include "event.h" #include "monitor.h" #include #include "fstream.h" #include #include //AliRoot #include "AliHMPIDRawStream.h" #include "AliHMPIDCalib.h" #include "AliRawReaderDate.h" #include "AliBitPacking.h" //ROOT #include "TROOT.h" #include "TFile.h" #include "TSystem.h" #include "TString.h" #include "TObject.h" #include "TPluginManager.h" int main(int argc, char **argv){ int status; /* log start of process */ printf("HMPID DA program started\n"); gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo", "*", "TStreamerInfo", "RIO", "TStreamerInfo()"); /* check that we got some arguments = list of files */ if (argc<2) { printf("Wrong number of arguments\n"); return -1; } /* copy locally a file from daq detector config db status=daqDA_DB_getFile("myconfig","./myconfig.txt"); if (status) { printf("Failed to get config file : %d\n",status); return -1; } and possibly use it */ /* report progress */ daqDA_progressReport(10); /* define wait event timeout - 1s max */ monitorSetNowait(); monitorSetNoWaitNetworkTimeout(1000); /* set local storage of ped files for Fe2C */ /* init the pedestal calculation */ AliHMPIDCalib *pCal=new AliHMPIDCalib(); /* Set the number of sigma cuts inside the file HmpidSigmaCut.txt on BOTH LDCs! */ /* If the file is NOT present then the default cut 3 will be used!*/ //pCal->SetSigCutFromFile("HmpidSigmaCut.txt"); pCal->SetSigCutFromShell("HMPID_SIGMA_CUT"); //decision to make later: wether to use file or env variable... pCal->SetDaOutFromShell("HMPID_DA_OUT"); //decision to make later: wether to use file or env variable... pCal->SetFeeInFromShell("HMPID_FEE_IN"); //decision to make later: wether to use file or env variable... /* ONLY set this option to kTRUE if you want to create the ADC dsitributions for all 161280 pads!!!!*/ /* kTRUE is not suggested for production mode b/c of the memory consumption! */ pCal->SetWriteHistoPads(kFALSE); //use this option for default production useage!!! //pCal->SetWriteHistoPads(kTRUE); //only for expert debug //pCal->SetWriteHistoPads(kTRUE,kTRUE,13); //DO NOT USE THIS OPTION! /* init event counter */ Int_t firstEvt=0; Int_t iEvtNcal=firstEvt; //Start from 1 not 0! ULong_t runNum=0; ULong_t ldcId=0; int n; for (n=1;neventType; if (eventT==PHYSICS_EVENT || eventT==CALIBRATION_EVENT ) { //updated: 18/02/2008 based on http://alice-ecs.web.cern.ch/alice-ecs/runtypes_3.16.html runNum=(unsigned long)event->eventRunNb; //assuming that only one run is processed at a time ldcId=(unsigned long)event->eventLdcId; if(iEvtNcal==firstEvt && pCal->GetWritePads()==kTRUE) { if(pCal->GetLargePads()==kFALSE) pCal->InitFile((Int_t)ldcId); //The number for iEvtNcal should be the same as for the first value else pCal->InitFile((Int_t)runNum); //The number for iEvtNcal should be the same as for the first value } iEvtNcal++; AliRawReader *reader = new AliRawReaderDate((void*)event); AliHMPIDRawStream stream(reader);stream.SetTurbo(kTRUE); //raw data decoding without error checks SetTurbo(kTRUE) while(stream.Next()) { for(Int_t iPad=0;iPadFillPedestal(stream.GetPadArray()[iPad],stream.GetChargeArray()[iPad]); } //pads }//while -- loop on det load in one event for(Int_t iddl=0;iddlFillDDLCnt(iddl,stream.GetnDDLInStream()[iddl],stream.GetnDDLOutStream()[iddl]); for(Int_t ierr=0; ierr < stream.GetNErrors(); ierr++) { pCal->FillErrors(iddl,ierr,stream.GetErrors(iddl,ierr)); } }//err pCal->SetRunParams(runNum,stream.GetTimeStamp(),stream.GetLDCNumber()); //Get the last TimeStam read and the LDC ID stream.Delete(); }// if CALIBRATION_EVENT /* exit when last event received, no need to wait for TERM signal */ if (eventT==END_OF_RUN) { printf("EOR event detected\n"); break; } // events loop free(event); } }//arg /* write report */ printf("HMPID DA processed RUN #%s on LDC#%d, with %d calibration events\n",getenv("DATE_RUN_NUMBER"),ldcId,iEvtNcal); if (!iEvtNcal) { printf("No calibration events have been read. Exiting\n"); return -1; } /* report progress */ daqDA_progressReport(90); TString sDaOut=pCal->GetDaOutFromShell(); for(Int_t nDDL=0; nDDL < AliHMPIDRawStream::kNDDL; nDDL++) { /* Calculate pedestal for the given ddl, if there is no ddl go t next */ if(!pCal->CalcPedestal(nDDL,Form("%sHmpidPedDdl%02i.txt",sDaOut.Data(),nDDL),iEvtNcal)) continue; /* to create pedestal file as Paolo uncomment the line */ //if(!pCal->CalcPedestalPaolo(nDDL,Form("%sHmpidPedDdl%02i.txt",sDaOut.Data(),nDDL),iEvtNcal)) continue; if(!pCal->WriteErrors(nDDL,Form("%sHmpidErrorsDdl%02i.txt",sDaOut.Data(),nDDL),iEvtNcal)) continue; /* store the result file on FES */ status=daqDA_FES_storeFile(Form("%sHmpidPedDdl%02i.txt",sDaOut.Data(),nDDL),Form("HmpidPedDdl%02i.txt",nDDL)); if (status) { printf("Failed to export file : %d\n",status); } status=daqDA_FES_storeFile(Form("%sHmpidErrorsDdl%02i.txt",sDaOut.Data(),nDDL),Form("HmpidErrorsDdl%02i.txt",nDDL)); if (status) { printf("Failed to export file : %d\n",status); } }//nDDL if(pCal->GetWritePads()==kTRUE) pCal->CloseFile(); delete pCal; if (status) return -1; /* report progress */ daqDA_progressReport(100); return status; }