X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=HMPID%2FAliHMPIDCalib.cxx;h=d687a221c9c6526b679338de2df0d064af281498;hb=b5209c0a5f047018cc5a0edf1dd0b2ed775f6d94;hp=689841e342dec4ffaba68665aea54641e55eeb5c;hpb=9f99568d64061cba946db229ebbc2141b4aa3ce1;p=u%2Fmrichter%2FAliRoot.git diff --git a/HMPID/AliHMPIDCalib.cxx b/HMPID/AliHMPIDCalib.cxx index 689841e342d..d687a221c9c 100644 --- a/HMPID/AliHMPIDCalib.cxx +++ b/HMPID/AliHMPIDCalib.cxx @@ -16,8 +16,13 @@ #include "AliHMPIDCalib.h" //class header #include "AliHMPIDParam.h" //class header #include "AliHMPIDRawStream.h" //class header +#include "AliHMPIDDigit.h" //class header #include #include +#include +#include + + @@ -39,15 +44,22 @@ fLdcId(0), fTimeStamp(0), fRunNum(0), fSigCut(0), -fWritePads(0), fnDDLInStream(0x0), fnDDLOutStream(0x0), fLargeHisto(kFALSE), -fSelectDDL(0) +fSelectDDL(0), +fDeadMap(0x0), +fPedMeanMap(0x0), +fPedSigMap(0x0), +f1DPedMean(0x0), +f1DPedSigma(0x0), +fNumMaskedPads(0), +fNumDeadPads(0) { // //constructor // + faddl = new Bool_t[AliHMPIDRawStream::kNDDL]; Int_t nPads = (AliHMPIDParam::kMaxCh+1)*(AliHMPIDParam::kMaxPcx+1)*(AliHMPIDParam::kMaxPcy+1); @@ -108,8 +120,6 @@ fSelectDDL(0) fPadAdc=new TH1I*[nPads]; fIsPad=new Bool_t[nPads]; for(Int_t np=0;npSetStats(kFALSE); + fPedSigMap[iCh] =new TH2F(Form("fPedSigMap%d",iCh), Form("fPedSigMap%d;pad x;pad y;Sigma pedestal (ADC)",iCh), 160, 0,160,144,0,144);fPedSigMap[iCh]->SetStats(kFALSE); + } + for(Int_t iCh=0;iCh<=AliHMPIDParam::kMaxCh;iCh++) + { + for(Int_t iFee=0;iFee<6;iFee++) + { + f1DPedMean[6*iCh+iFee] = new TH1F(Form("f1DPedMean_Ch%d_FEE_%d" , iCh,iFee),Form("Mean Pedestals, RICH %d, FEE %d;Channels;Mean pedestal (ADC)" ,iCh,iFee),3840,0,3840);f1DPedMean[6*iCh+iFee]->SetStats(kFALSE); + f1DPedSigma[6*iCh+iFee] = new TH1F(Form("f1DPedSigma_Ch%d_FEE_%d" ,iCh,iFee),Form("Sigma Pedestal, RICH %d, FEE %d;Channels;Sigma pedestal (ADC)" ,iCh,iFee),3840,0,3840);f1DPedSigma[6*iCh+iFee]->SetStats(kFALSE); + } + } + }//Init() //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void AliHMPIDCalib::SetRunParams(ULong_t runNum,Int_t timeStamp, Int_t ldcId) @@ -201,7 +247,7 @@ void AliHMPIDCalib::SetRunParams(ULong_t runNum,Int_t timeStamp, Int_t ldcId) fLdcId=ldcId; }//SetRunParams() //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -void AliHMPIDCalib::SetSigCutFromFile(Char_t* name) +void AliHMPIDCalib::SetSigCutFromFile(TString hmpInFile) { // //Set Sigma Cut from the file on the LDC, if the input file is not present default value is set! @@ -209,94 +255,67 @@ void AliHMPIDCalib::SetSigCutFromFile(Char_t* name) //Returns: none // Int_t nSigCut=0; - ifstream infile(name); + ifstream infile(hmpInFile.Data()); if(!infile.is_open()) {fSigCut=3; return;} while(!infile.eof()) { infile>>nSigCut; } infile.close(); + if(nSigCut< 0 || nSigCut > 15 ) {Printf("WARNING: DAQ Sigma Cut from DAQ DB is out of bounds: %d, resetting it to 3!!!",nSigCut);nSigCut=3;} + Printf("DAQ Sigma Cut from DAQ DB is: %d",nSigCut); fSigCut=nSigCut; }//SetSigCutFromFile() -//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -void AliHMPIDCalib::InitHisto(Int_t q,Int_t histocnt,Char_t* name) -{ - // - //Init the pad histos. For one DDL we have 11520 pads. ONLY if ENABLED! - //Arguments: q-charge, the absolute number of the histogram (AliHMPIDParam::kMaxCh+1)*(AliHMPIDParam::kMaxPcx+1)*(AliHMPIDParam::kMaxPcy+1) and the name of the histogram (unique) - //Returns: none - // - if(fWritePads==kFALSE) return; - fFile->cd(); - Double_t lowbin,highbin=0; - lowbin=q-40.5; highbin=q+40.5; - - if(fIsPad[histocnt]==kTRUE) return; - - if(fLargeHisto==kFALSE) fPadAdc[histocnt]=new TH1I(name,name,81,lowbin,highbin); - if(fLargeHisto==kTRUE) fPadAdc[histocnt]=new TH1I(name,name,4093,-0.5,4092.5); - fPadAdc[histocnt]->Sumw2(); - fIsPad[histocnt]=kTRUE; - -}//InitHisto() -//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -void AliHMPIDCalib::FillHisto(Int_t histocnt,Int_t q) -{ - // - //Fill the ADC histograms for each pad - //Arguments: q-charge, the absolute number of the histogram (AliHMPIDParam::kMaxCh+1)*(AliHMPIDParam::kMaxPcx+1)*(AliHMPIDParam::kMaxPcy+1) - //Returns: none - // - if(fIsPad[histocnt]==kFALSE) return; - fFile->cd(); - fPadAdc[histocnt]->Fill(q); - -}//InitHisto() //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -void AliHMPIDCalib::InitFile(Int_t ldcId) +void AliHMPIDCalib::SetDeadChannelMapFromFile(TString hmpInFile) { // - //Initialize the ADC histo output file (one per LDC) - //Arguments: LDC Id + //Set Dead Channel Map Cut from the file on the LDC, if the input file is not present default value is set! + //Arguments: the name of the Dead Channel Map file on the LDC //Returns: none // - if(fWritePads==kFALSE) return; - fFile=new TFile(Form("HmpidPadsOnLdc%2d.root",ldcId),"RECREATE"); -}//InitFile() -//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -void AliHMPIDCalib::CloseFile(Int_t /*ldcId*/) -{ - // - //Close the ADC histo output file (one per LDC) - //Arguments: LDC Id - //Returns: none - // - fFile->cd(); - Int_t nPads = (AliHMPIDParam::kMaxCh+1)*(AliHMPIDParam::kMaxPcx+1)*(AliHMPIDParam::kMaxPcy+1); - for(Int_t np=0;npWrite();} - fFile->Close(); -}//CloseFile() + Char_t header[256]; + Int_t ddl=0,row=0,dil=0,pad=0,ch=0,pc=0,chpadx=0,chpady=0,px=0,py=0,isitmasked=0; + UInt_t dw=0; + Double_t bin[4]; + ifstream infile(hmpInFile.Data()); + if(!infile.is_open()) {Printf("HMPID Dead Channel Map file cannot be opened!!!! No mask is applied!!!");return;} + infile.getline(header,256); + AliHMPIDDigit dig; + while(!infile.eof()) + { + infile>>ch>>chpadx>>chpady>>isitmasked; //read in masked coordinates; coordinates are in the module coordinate system + pc=(chpadx/80)+2*(chpady/48); //get PC number + px=chpadx-80*(chpadx/80); //get pad X in PC coordinates + py=chpady-48*(chpady/48); //get pad Y in PC coordinates --- can we do it better??? -- just with one conversion???? clm + if(!dig.Set(ch,pc,px,py,0) && isitmasked) { //in the AliHMPIDDigit:Set there is already a check if the coordinates makes sense + dig.Raw(dw,ddl,row,dil,pad); + bin[0]=ddl; bin[1]=row; bin[2]=dil; bin[3]=pad; + fDeadMap->Fill(bin,1); + } + } + infile.close(); + +}//SetDeadChannelMapFromFile() //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void AliHMPIDCalib::FillPedestal(Int_t abspad,Int_t q) { // //Called from the HMPIDda and fills the pedestal values - //Arguments: absulote pad number as from AliHMPIDParam and q-charge + //Arguments: absolute pad number as from AliHMPIDParam and q-charge //Returns: none // - if(q<0) AliFatal("Negative charge is read!!!!!!"); - + if(q<0) { + AliError("Negative charge is read!!!!!!"); + return; + } + UInt_t w32; Int_t nDDL=0, row=0, dil=0, adr=0; //The decoding (abs. pad -> ddl,dil,...) is the same as in AliHMPIDDigit::Raw - Int_t y2a[6]={5,3,1,0,2,4}; - - nDDL= 2*AliHMPIDParam::A2C(abspad)+AliHMPIDParam::A2P(abspad)%2; //DDL# 0..13 - // Int_t tmp= 1+AliHMPIDParam::A2P(abspad)/2*8+AliHMPIDParam::A2Y(abspad)/6; //temp variable - Int_t tmp= AliHMPIDParam::A2P(abspad)/2*8+AliHMPIDParam::A2Y(abspad)/6; //temp variable -// row= (AliHMPIDParam::A2P(abspad)%2)? 25-tmp:tmp; //row r=1..24 - row= (AliHMPIDParam::A2P(abspad)%2)? tmp:24-tmp; //row r=1..24 - dil= 1+AliHMPIDParam::A2X(abspad)/8; //DILOGIC - adr=y2a[AliHMPIDParam::A2Y(abspad)%6]+6*(AliHMPIDParam::A2X(abspad)%8); //ADDRESS 0..47 + + AliHMPIDDigit dig(abspad,q); + dig.Raw(w32,nDDL,row,dil,adr); + //........... decoding done if(q>0) { @@ -311,20 +330,7 @@ void AliHMPIDCalib::FillPedestal(Int_t abspad,Int_t q) } Int_t histocnt=0; histocnt=(nDDL)*11520+(row-1)*480+(dil-1)*48+adr; //Histo counter for a single DDL - - if(fWritePads==kTRUE) //works but make it nicer later.... - { - if( fLargeHisto==kTRUE && nDDL==fSelectDDL) { - InitHisto(q,histocnt,Form("hDDL_%d_Row_%d_Dil_%d_Pad_%d",nDDL,row,dil,adr)); //for large histos use hardware naming - FillHisto(histocnt,q); - } - if(fLargeHisto==kFALSE) - { - InitHisto(q,histocnt,Form("hPad_Ch_%d_Pc_%d_Px_%d_Py_%d",AliHMPIDParam::A2C(abspad),AliHMPIDParam::A2P(abspad),AliHMPIDParam::A2X(abspad),AliHMPIDParam::A2Y(abspad))); - FillHisto(histocnt,q); - } - }//fWritePads - + }//FillPedestal() //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void AliHMPIDCalib::FillErrors(Int_t nDDL,Int_t eType, Int_t nErr) @@ -363,8 +369,7 @@ Bool_t AliHMPIDCalib::WriteErrors(Int_t nDDL, Char_t* name, Int_t nEv) //Write decoding errors to a txt file //Arguments: nDDL-DDL number, name of the error file and number of the read events //Retutns: kTRUE/kFALSE - // - + // if(faddl[nDDL]==kFALSE) return kFALSE; //if ddl is missing no error file is created ofstream outerr; outerr.open(name); //open error file outerr << Form("%8s %2d\n","RunNumber",(Int_t)fRunNum); //read run number @@ -377,12 +382,23 @@ Bool_t AliHMPIDCalib::WriteErrors(Int_t nDDL, Char_t* name, Int_t nEv) for(Int_t ierr=0; ierr 0) outerr<< Form("%2d %2d %2d %3d\n",row,dil,pad,fpedQ0[nDDL][row][dil][pad]); + } + } + } + + outerr.close(); //write error file + return kTRUE; }//FillErrors() //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -Bool_t AliHMPIDCalib::CalcPedestal(Int_t nDDL, Char_t* name, Int_t nEv) +Bool_t AliHMPIDCalib::CalcPedestal(Int_t nDDL, Char_t* name, Char_t *name2,Int_t nEv) { // //Calculate pedestal for each pad @@ -390,13 +406,20 @@ Bool_t AliHMPIDCalib::CalcPedestal(Int_t nDDL, Char_t* name, Int_t nEv) //Retutns: kTRUE/kFALSE // - if(faddl[nDDL]==kFALSE) return kFALSE; //if ddl is missing no ped file is created (and also for LDC selection). Check with Paolo what he checks for?! - Double_t mean=0,sigma=0; + + Int_t feeOffset=196657; + ofstream feeInput; feeInput.open(Form("%s",name2)); //write thr file for Fe2C + + Double_t mean=0,sigma=0, threshold=0; Double_t qs2m=0,qsm2=0; - ofstream out; //to write the pedestal text files + ofstream out; //to write the pedestal text files Int_t inhard; Int_t nEvPerPad=0; + Int_t pedbin=0; + + Int_t abspad,ch,pc,pcx,pcy,chX,chY,fee; + Int_t binSp[4]={0}; out.open(name); out << Form("%8s %2d\n","RunNumber",(Int_t)fRunNum); //read run number out << Form("%8s %2d\n","LdcId" , fLdcId); //read LDC Id @@ -405,39 +428,77 @@ Bool_t AliHMPIDCalib::CalcPedestal(Int_t nDDL, Char_t* name, Int_t nEv) out << Form("%8s %2d\n","TotDDLEvt", fnDDLInStream[nDDL]); //read number of bad events for DDL # nDDL processed out << Form("%8s %2d\n","NumBadEvt", fnDDLInStream[nDDL]-fnDDLOutStream[nDDL]); //read number of bad events for DDL # nDDL processed out << Form("%8s %2f\n","NBadE(%)", (fnDDLInStream[nDDL]-fnDDLOutStream[nDDL])*100.0/nEv); //read number of bad events (in %) for DDL # nDDL processed - out << Form("%8s %2.2d\n","#SigCut", fSigCut); //# of sigma cuts + out << Form("%8s %d\n","#SigCut", fSigCut); //# of sigma cuts for(Int_t row = 1; row <= AliHMPIDRawStream::kNRows; row++){ + feeInput << Form("0xabcdabcd \n"); //before each row we write a marker to separate the rows within a DDL + + for(Int_t dil = 1; dil <= AliHMPIDRawStream::kNDILOGICAdd; dil++){ for(Int_t pad = 0; pad < AliHMPIDRawStream::kNPadAdd; pad++){ + mean = 50;sigma = 100; //init maen and sigma to a low value + nEvPerPad=fnpc[nDDL][row][dil][pad]; //check how many times the pad was read out + abspad=AliHMPIDRawStream::GetPad(nDDL,row,dil,pad); //get the absolute oad coordinate + ch=AliHMPIDParam::A2C(abspad); //get chamber number + pc=AliHMPIDParam::A2P(abspad); //get PC number + pcx=AliHMPIDParam::A2X(abspad); //get pad x in PC + pcy=AliHMPIDParam::A2Y(abspad); //get pad y in PC + chX = (pc%2)*AliHMPIDParam::kPadPcX+pcx; //get pad x in Ch + chY = (pc/2)*AliHMPIDParam::kPadPcY+pcy; //get pad y in Ch + binSp[0]=nDDL+1;binSp[1]=row;binSp[2]=dil;binSp[3]=pad+1; //set dead map coordinates for check - mean = 50;sigma = 100; - - nEvPerPad=fnpc[nDDL][row][dil][pad]; - - - if(nEvPerPad < 1 ) { //if the pad is bad then we assign 100 for the sigma and 50 for the mean - mean = 4000; - sigma = 1000; + if(nEvPerPad < 1 ) { //if the pad is bad then we assign 100 for the sigma and 50 for the mean + mean = AliHMPIDParam::kPadMeanZeroCharge; + sigma = AliHMPIDParam::kPadSigmaZeroCharge; + fNumDeadPads++; + } + else if(fDeadMap->GetBinContent(binSp)>0) //check if channel is masked, if yes set maksed values + { + mean = AliHMPIDParam::kPadMeanMasked; + sigma = AliHMPIDParam::kPadSigmaMasked; + fNumMaskedPads++; } - else{ + else{ mean = fsq[nDDL][row][dil][pad]*1.0/nEvPerPad; qs2m = fsq2[nDDL][row][dil][pad]*1.0/nEvPerPad; qsm2 = TMath::Power(fsq[nDDL][row][dil][pad]*1.0/nEvPerPad,2); sigma = TMath::Sqrt(TMath::Abs(qs2m-qsm2)); } - - inhard=((Int_t(mean))<<9)+Int_t(mean+3*sigma); - out << Form("%2i %2i %2i %5.2f %5.2f %4.4x \n",row,dil,pad,mean,sigma,inhard); - - //if(sigma > 3.0) Printf("WARNING SIGMA DDL: %2d row: %2d dil: %2d pad: %2d mean: %3.2f sigma: %2.2f nEvPerPad: %02d fnDDLOutStream: %02d fpedQ0: %02d",nDDL,row,dil,pad,mean,sigma,nEvPerPad,fnDDLOutStream[nDDL],fpedQ0[nDDL][row][dil][pad]); - - }//adr + //The electronics takes the 32bit int as: first 9 bits for the pedestal and the second 9 bits for threshold + threshold = mean+fSigCut*sigma; + if(mean > 511.0 || threshold > 511.0) {mean = AliHMPIDParam::kPadMeanMasked; threshold = AliHMPIDParam::kPadMeanMasked + 5.0 * AliHMPIDParam::kPadSigmaMasked; } + //inhard=((Int_t(mean+fSigCut*sigma))<<9)+Int_t(mean); //right calculation, xchecked with Paolo 8/4/2008 + inhard=((Int_t(threshold))<<9)+Int_t(mean); //right calculation, xchecked with Paolo 8/4/2008 + + out << Form("%2i %2i %2i %5.3f %5.3f %4.4x \n",row,dil,pad,mean,sigma,inhard); + feeInput << Form("0x%4.4x\n",inhard); + + // fill histograms to be exported to AMORE + fPedMeanMap[ch]->SetTitle(Form("PedMeanMap%d RunNum: %d",ch,fRunNum)); + fPedSigMap[ch]->SetTitle(Form("PedSigmaMap%d RunNum: %d",ch,fRunNum)); + fPedMeanMap[ch]->Fill(chX,chY,mean); + fPedSigMap[ch]->Fill(chX,chY,sigma); + if(nDDL%2==0) pedbin = (24-row)*2*480+(10-dil)*48+pad; + if(nDDL%2!=0) pedbin = (row*2-1)*480+(10-dil)*48+pad; + pedbin = pedbin - 3840*(pedbin/3840); + fee=AliHMPIDRawStream::GetFee(nDDL,row); + f1DPedMean[6*(nDDL/2)+fee]->SetTitle(Form("PedMean_Ch%d_FEE_%d RunNum: %d",ch,fee,fRunNum)); + f1DPedSigma[6*(nDDL/2)+fee]->SetTitle(Form("PedSigma_Ch%d_FEE_%d RunNum: %d",ch,fee,fRunNum)); + f1DPedMean[6*(nDDL/2)+fee]->Fill(pedbin,mean); + f1DPedSigma[6*(nDDL/2)+fee]->Fill(pedbin,sigma); + + }//adr==pad + //we have to write up to 64 not 48 in the DILOGIC since they are daisy chained! + //offset and format is defined for the Fe2C code + for(Int_t idd=0;idd<16;idd++) feeInput << Form("0x%4.4x\n",idd+feeOffset); }//dil + + }//row out.close(); //write pedestal file + feeInput.close(); + return kTRUE; }//CaclPedestal() //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -