X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PHOS%2FAliPHOSPreprocessor.cxx;h=a11849edfb787e1d287a864628fa3adbf02dcacd;hb=be184d528589f8ffcdb3e4e515dba49624f90e99;hp=9a0e628c465f1549daec60f21a423209a793c5fb;hpb=7708b003f554347667a7e3e553e5cdad993867b9;p=u%2Fmrichter%2FAliRoot.git diff --git a/PHOS/AliPHOSPreprocessor.cxx b/PHOS/AliPHOSPreprocessor.cxx index 9a0e628c465..a11849edfb7 100644 --- a/PHOS/AliPHOSPreprocessor.cxx +++ b/PHOS/AliPHOSPreprocessor.cxx @@ -67,7 +67,7 @@ AliPreprocessor("PHS",shuttle) // Constructor AddRunType("PHYSICS"); - AddRunType("STANDALONE"); + AddRunType("LED"); } //_______________________________________________________________________________________ @@ -78,7 +78,7 @@ UInt_t AliPHOSPreprocessor::Process(TMap* /*valueSet*/) TString runType = GetRunType(); Log(Form("Run type: %s",runType.Data())); - if(runType=="STANDALONE") { + if(runType=="LED") { Bool_t ledOK = ProcessLEDRun(); Bool_t badmap_OK = FindBadChannelsEmc(); if(!badmap_OK) Log(Form("WARNING! FindBadChannels() completed with BAD status!")); @@ -130,7 +130,6 @@ Bool_t AliPHOSPreprocessor::ProcessLEDRun() TIter iter(list); TObjString *source; - Bool_t firedOK = kFALSE; while ((source = dynamic_cast (iter.Next()))) { @@ -145,26 +144,14 @@ Bool_t AliPHOSPreprocessor::ProcessLEDRun() Log(Form("File %s is not opened, something goes wrong!",fileName.Data())); return kFALSE; } - + TH1I* fFiredCells = (TH1I*)f.Get("fFiredCells"); - - if(!fFiredCells) { - Log(Form("fFiredCells histogram not found in %s, skip this source.",fileName.Data())); - firedOK=kFALSE; - } - else { + + if(fFiredCells) { const Double_t nFiredCells = fFiredCells->GetMean(); - if(nFiredCells>100 && nFiredCells<600) { - firedOK = kTRUE; - Log(Form("Number of fired cells per event is %d.",nFiredCells)); - } - else { - Log(Form("Number of fired cells per event is %d, possibly not a LED run!",nFiredCells)); - firedOK = kFALSE; - } - + Log(Form("Number of fired cells per event is %.1f",nFiredCells)); } - + const Int_t nMod=5; // 1:5 modules const Int_t nCol=56; //1:56 columns in each module const Int_t nRow=64; //1:64 rows in each module @@ -172,22 +159,20 @@ Bool_t AliPHOSPreprocessor::ProcessLEDRun() for(Int_t mod=0; modGetADCchannelEmc(mod+1,col+1,row+1); - calibData.SetADCchannelEmc(mod+1,col+1,row+1,coeff); + Float_t hg2lg = clb->GetHighLowRatioEmc(5-mod,col+1,row+1); + Double_t coeff = clb->GetADCchannelEmc(5-mod,col+1,row+1); + calibData.SetADCchannelEmc(5-mod,col+1,row+1,coeff); + calibData.SetHighLowRatioEmc(5-mod,col+1,row+1,hg2lg); + } + + //High Gain to Low Gain ratio + Float_t ratio = HG2LG(mod,row,col,&f); + if(ratio != 16.) { + calibData.SetHighLowRatioEmc(5-mod,col+1,row+1,ratio); + AliInfo(Form("mod %d iX %d iZ %d ratio %.3f\n",mod,row,col,ratio)); } - else - calibData.SetADCchannelEmc(mod+1,col+1,row+1,1.); - } } } @@ -197,10 +182,15 @@ Bool_t AliPHOSPreprocessor::ProcessLEDRun() //Store the updated High Gain/Low Gain ratios AliCDBMetaData emcMetaData; - //Data valid from current run fRun until updated (validityInfinite=kTRUE) - Bool_t result = Store("Calib","EmcGainPedestals",&calibData,&emcMetaData,fRun,kTRUE); - return result; + //Data valid from current run until updated (validityInfinite=kTRUE) + //Bool_t result = Store("Calib","EmcGainPedestals",&calibData,&emcMetaData,0,kTRUE); + //Store reference data + Bool_t refOK = StoreReferenceLED(list); + if(refOK) Log(Form("LED reference data successfully stored.")); + + //return result; + return kTRUE; } Float_t AliPHOSPreprocessor::HG2LG(Int_t mod, Int_t X, Int_t Z, TFile* f) @@ -208,15 +198,17 @@ Float_t AliPHOSPreprocessor::HG2LG(Int_t mod, Int_t X, Int_t Z, TFile* f) //Calculates High gain to Low gain ratio //for crystal at the position (X,Z) in the PHOS module mod. - char hname[128]; - sprintf(hname,"%d_%d_%d",mod,X,Z); + char hname[128]; TString shname = "%d_%d_%d"; + snprintf(hname,shname.Length(),shname.Data(),mod,X,Z); TH1F* h1 = (TH1F*)f->Get(hname); if(!h1) return 16.; - - if(!h1->GetEntries()) return 16.; + + if(h1->GetEntries()<2000.) return 16.; + + if(h1->GetMaximum()<10.) h1->Rebin(4); if(h1->GetMaximum()<10.) return 16.; - + Double_t max = h1->GetBinCenter(h1->GetMaximumBin()); // peak Double_t xmin = max - (h1->GetRMS()/3); Double_t xmax = max + (h1->GetRMS()/2); @@ -229,14 +221,20 @@ Float_t AliPHOSPreprocessor::HG2LG(Int_t mod, Int_t X, Int_t Z, TFile* f) gaus1->SetParameter("Mean",max); gaus1->SetParameter("Sigma",1.); gaus1->SetLineColor(kBlue); - h1->Fit(gaus1,"LERQ+"); - - AliInfo(Form("%s: %d entries, mean=%.3f, peak=%.3f, rms= %.3f. HG/LG = %.3f\n", - h1->GetTitle(),h1->GetEntries(),h1->GetMean(),max,h1->GetRMS(), - gaus1->GetParameter("Mean"))); - - return gaus1->GetParameter("Mean"); + + Double_t mean_min = h1->GetXaxis()->GetXmin(); + Double_t mean_max = h1->GetXaxis()->GetXmax(); + gaus1->SetParLimits(1,mean_min,mean_max); + + h1->Fit(gaus1,"RQ+"); + Double_t hg2lg = gaus1->GetParameter("Mean"); + if( (hg2lg-mean_min<0.001) || (mean_max-hg2lg<0.001)) hg2lg=max; + + AliInfo(Form("%s: %.1f entries, mean=%.3f, peak=%.3f, rms= %.3f. HG/LG = %.3f\n", + h1->GetTitle(),h1->GetEntries(),h1->GetMean(),max,h1->GetRMS(),hg2lg)); + return hg2lg; + } Bool_t AliPHOSPreprocessor::FindBadChannelsEmc() @@ -252,7 +250,9 @@ Bool_t AliPHOSPreprocessor::FindBadChannelsEmc() Bool_t result[2] = { kTRUE, kTRUE }; for (Int_t i=0; i<2; i++) { - + + if(system[i] == kHLT) continue; + AliPHOSEmcBadChannelsMap badMap; list = GetFileSources(system[i], "BAD_CHANNELS"); @@ -268,7 +268,8 @@ Bool_t AliPHOSPreprocessor::FindBadChannelsEmc() continue; } - result[i] *= DoFindBadChannelsEmc(system[i],list,badMap); + Bool_t findBadOK = DoFindBadChannelsEmc(system[i],list,badMap); + result[i] *= findBadOK; // Store the bad channels map. @@ -280,8 +281,9 @@ Bool_t AliPHOSPreprocessor::FindBadChannelsEmc() else path = "HLT"; - // Data valid from current run fRun until being updated (validityInfinite=kTRUE) - result[i] *= Store(path.Data(), "EmcBadChannels", &badMap, &md, fRun, kTRUE); + // Data valid from current run until being updated (validityInfinite=kTRUE) + Bool_t storeOK = Store(path.Data(), "EmcBadChannels", &badMap, &md, 0, kTRUE); + result[i] *= storeOK; } @@ -298,7 +300,6 @@ Bool_t AliPHOSPreprocessor::DoFindBadChannelsEmc(Int_t system, TList* list, AliP TIter iter(list); TObjString *source; - char hnam[80]; TH1F* h1=0; const Float_t fQualityCut = 1.; @@ -318,29 +319,16 @@ Bool_t AliPHOSPreprocessor::DoFindBadChannelsEmc(Int_t system, TList* list, AliP return kFALSE; } - TH1I* fFiredCells = (TH1I*)f.Get("fFiredCells"); - - if(!fFiredCells) { - Log(Form("fFiredCells histogram not found in %s, skip this source.",fileName.Data())); - continue; - } + Log(Form("Begin check for bad channels.")); - const Double_t nFiredCells = fFiredCells->GetMean(); - - if(nFiredCells<100. || nFiredCells>600. ) { - Log(Form("Number of fired cells per event is %d, possibly not a LED run!",nFiredCells)); - continue; // not a LED run! - } - - Log(Form("Number of fired cells per event %d. Begin check for bad channels.",nFiredCells)); - for(Int_t mod=0; mod<5; mod++) { for(Int_t iX=0; iX<64; iX++) { for(Int_t iZ=0; iZ<56; iZ++) { - - sprintf(hnam,"%d_%d_%d_%d",mod,iX,iZ,1); // high gain + + TString hnam; + hnam += mod; hnam += "_"; hnam += iX; hnam += "_"; hnam += iZ; hnam += "_"; hnam += "1"; h1 = (TH1F*)f.Get(hnam); - + if(h1) { Double_t mean = h1->GetMean(); @@ -372,8 +360,10 @@ Bool_t AliPHOSPreprocessor::CalibrateEmc() //Loop over two systems: DAQ and HLT. //For each system the same algorithm implemented in DoCalibrateEmc() invokes. + AliPHOSEmcCalibData* lastCalib=0; const AliPHOSEmcBadChannelsMap* badMap=0; AliCDBEntry* entryBCM=0; + AliCDBEntry* entryEmc=0; TList* list=0; TString path; @@ -383,6 +373,8 @@ Bool_t AliPHOSPreprocessor::CalibrateEmc() for (Int_t i=0; i<2; i++) { + if(system[i] == kHLT) continue; + AliPHOSEmcCalibData calibData; list = GetFileSources(system[i], "AMPLITUDES"); @@ -415,19 +407,69 @@ Bool_t AliPHOSPreprocessor::CalibrateEmc() if(!badMap) Log(Form("WARNING!! Nothing for %s in AliCDBEntry. All cells considered GOOD!",sysn[i])); - result[i] *= DoCalibrateEmc(system[i],list,badMap,calibData); + // Retrieve the last EMC calibration object + + entryEmc = GetFromOCDB(path.Data(), "EmcGainPedestals"); + + if(!entryEmc) + Log(Form("Cannot find any EmcGainPedestals entry for this run and path %s",path.Data())); + else + lastCalib = (AliPHOSEmcCalibData*)entryEmc->GetObject(); + if(lastCalib) + result[i] *= DoCalibrateEmc(system[i],list,badMap,*lastCalib); + else + result[i] *= DoCalibrateEmc(system[i],list,badMap,calibData); + //Store EMC calibration data - AliCDBMetaData emcMetaData; - result[i] *= Store(path.Data(), "EmcGainPedestals", &calibData, &emcMetaData, 0, kTRUE); - + + // if(lastCalib) + // result[i] *= Store(path.Data(), "EmcGainPedestals", lastCalib, &emcMetaData, 0, kFALSE); + // else + // result[i] *= Store(path.Data(), "EmcGainPedestals", &calibData, &emcMetaData, 0, kFALSE); + + //Store reference data + Bool_t refOK = StoreReferenceEmc(system[i],list); + if(refOK) Log(Form("Reference data for %s amplitudes successfully stored.",sysn[i])); + } if(result[0] || result[1]) return kTRUE; else return kFALSE; } +Bool_t AliPHOSPreprocessor::StoreReferenceEmc(Int_t system, TList* list) +{ + //Put 2D calibration histograms (E vs Time) prepared by DAQ/HLT to the reference storage. + //system is DAQ or HLT, TList is the list of FES sources. + + if(system!=kDAQ) return kFALSE; + + TObjString *source = dynamic_cast (list->First()); + if(!source) return kFALSE; + + TString fileName = GetFile(system, "AMPLITUDES", source->GetName()); + + Bool_t resultRef = StoreReferenceFile(fileName.Data(),"CalibRefPHOS.root"); + return resultRef; + +} + +Bool_t AliPHOSPreprocessor::StoreReferenceLED(TList* list) +{ + //Put HG/LG histograms to the reference storage. + + TObjString *source = dynamic_cast (list->First()); + if(!source) return kFALSE; + + TString fileName = GetFile(kDAQ, "LED", source->GetName()); + + Bool_t resultRef = StoreReferenceFile(fileName.Data(),"LEDRefPHOS.root"); + return resultRef; + +} + Bool_t AliPHOSPreprocessor::DoCalibrateEmc(Int_t system, TList* list, const AliPHOSEmcBadChannelsMap* badMap, AliPHOSEmcCalibData& calibData) { @@ -439,6 +481,7 @@ Bool_t AliPHOSPreprocessor::DoCalibrateEmc(Int_t system, TList* list, const AliP // It is a responsibility of the SHUTTLE framework to form the fileName. gRandom->SetSeed(0); //the seed is set to the current machine clock! + Int_t minEntries=1000; // recalculate calibration coeff. if Nentries > minEntries. TIter iter(list); TObjString *source; @@ -493,9 +536,9 @@ Bool_t AliPHOSPreprocessor::DoCalibrateEmc(Int_t system, TList* list, const AliP TString htitl = h2->GetTitle(); if(htitl.Contains("and gain 1")) { hRef = h2->ProjectionX(); - hRef->GetXaxis()->SetRange(10,1000); // to cut off saturation peak and noise + hRef->GetXaxis()->SetRangeUser(10.,1000.); // to cut off saturation peak and noise // Check if the reference histogram has too little statistics - if(hRef->GetMean() && hRef->GetEntries()>2) ok=kTRUE; + if(hRef->GetMean() && hRef->GetEntries()>minEntries) ok=kTRUE; const TString delim = "_"; TString str = hRef->GetName(); @@ -503,11 +546,11 @@ Bool_t AliPHOSPreprocessor::DoCalibrateEmc(Int_t system, TList* list, const AliP const Int_t md = ((TObjString*)tks->At(0))->GetString().Atoi(); const Int_t X = ((TObjString*)tks->At(1))->GetString().Atoi(); const Int_t Z = ((TObjString*)tks->At(2))->GetString().Atoi(); - + delete tks; if(badMap) { - if(badMap->IsBadChannel(md+1,Z+1,X+1)) { + if(badMap->IsBadChannel(5-md,Z+1,X+1)) { AliInfo(Form("Cell mod=%d col=%d row=%d is bad. Histogram %s rejected.", - md+1,Z+1,X+1,hRef->GetName())); + 5-md,Z+1,X+1,hRef->GetName())); ok=kFALSE; } } @@ -530,27 +573,26 @@ Bool_t AliPHOSPreprocessor::DoCalibrateEmc(Int_t system, TList* list, const AliP Double_t refMean=hRef->GetMean(); // Calculates relative calibration coefficients for all non-zero channels + + TString shnam = "%d_%d_%d_1"; for(Int_t mod=0; modProjectionX(); - h1->GetXaxis()->SetRange(10,1000); //to cut off saturation peak and noise + h1->GetXaxis()->SetRangeUser(10.,1000.); //to cut off saturation peak and noise coeff = h1->GetMean()/refMean; - if(coeff>0) - calibData.SetADCchannelEmc(mod+1,col+1,row+1,1./coeff); - else - calibData.SetADCchannelEmc(mod+1,col+1,row+1,1.); - AliInfo(Form("mod %d col %d row %d coeff %f\n",mod,col,row,coeff)); + if(coeff>0 && h1->GetEntries()>minEntries) { + calibData.SetADCchannelEmc(5-mod,col+1,row+1,0.005/coeff); + AliInfo(Form("mod %d col %d row %d coeff %f\n",mod,col,row,coeff)); + } } - else - calibData.SetADCchannelEmc(mod+1,col+1,row+1,1.); } } }