X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ITS%2FAliITSPreprocessorSDD.cxx;h=a0e612923089504f4729a46d9d59e465e43b8d89;hb=44785f3e323b52cf3992aa28d80217e25f7ae08b;hp=4f1616aca85f06f172445c0807b8cf1dbdc3fa45;hpb=915c0469c2edef828173f083341bc7bf2d47ba01;p=u%2Fmrichter%2FAliRoot.git diff --git a/ITS/AliITSPreprocessorSDD.cxx b/ITS/AliITSPreprocessorSDD.cxx index 4f1616aca85..a0e61292308 100644 --- a/ITS/AliITSPreprocessorSDD.cxx +++ b/ITS/AliITSPreprocessorSDD.cxx @@ -18,11 +18,15 @@ /////////////////////////////////////////////////////////////////// // // // Implementation of the class for SDD preprocessing // +// Run Types treated: // +// PULSER, INJECTOR -> Store OCDB parameters // +// ALL RUNS -> Store DCS reference data // // Origin: E.Crescio, Torino, crescio@to.infn.it // // F.Prino, Torino, prino@to.infn.it // // // /////////////////////////////////////////////////////////////////// +#include "AliITSDDLModuleMapSDD.h" #include "AliITSPreprocessorSDD.h" #include "AliITSCalibrationSDD.h" #include "AliITSDriftSpeedSDD.h" @@ -36,6 +40,8 @@ #include #include #include +#include +#include const TString AliITSPreprocessorSDD::fgkNameHistoPedestals = "hpedestal"; const TString AliITSPreprocessorSDD::fgkNameHistoNoise = "hnoise"; @@ -255,6 +261,7 @@ UInt_t AliITSPreprocessorSDD::ProcessInjector(AliITSDDLModuleMapSDD* ddlmap){ } delete sourceList; Int_t retfscf; + for(Int_t iddl=0;iddlminValP0 && param[0]minValP1){ + if(polDeg>=0 && polDeg<=AliITSDriftSpeedSDD::GetMaxPolDeg() && + param[0]>minValP0 && param[0]minValP1){ if(polDeg==3){ if(modID0) aveCoefLay4[ic]/=nPtLay4; // mean parameters else aveCoefLay4[ic]=defCoef[ic]; // default parameters } - AliITSDriftSpeedSDD *avdsp3=new AliITSDriftSpeedSDD(evNumb,timeStamp,polDeg,aveCoefLay3); - AliITSDriftSpeedSDD *avdsp4=new AliITSDriftSpeedSDD(evNumb,timeStamp,polDeg,aveCoefLay4); + AliITSDriftSpeedSDD *avdsp3=new AliITSDriftSpeedSDD(evNumb,timeStamp,3,aveCoefLay3); + AliITSDriftSpeedSDD *avdsp4=new AliITSDriftSpeedSDD(evNumb,timeStamp,3,aveCoefLay4); + // Check status of golden modules + Int_t idGoldenMod=-1, idGoldenSide=-1; + Int_t idGoldenModList[5]={319,319,321,243,243}; + Int_t idGoldenSideList[5]={0,1,0,0,1}; + AliITSDriftSpeedSDD* refSpeed=0x0; + for(Int_t iGold=0; iGold<5; iGold++){ + Int_t indexG=2*(idGoldenModList[iGold]-240)+idGoldenSideList[iGold]; + if(modSet[indexG]){ + idGoldenMod=idGoldenModList[iGold]; + idGoldenSide=idGoldenSideList[iGold]; + AliITSDriftSpeedArraySDD* arrRef=(AliITSDriftSpeedArraySDD*)vdrift.At(indexG); + refSpeed=arrRef->GetDriftSpeedObject(0); + break; + } + } + TList* correctionList=0x0; + if(idGoldenMod>=240 && idGoldenSide>=0){ + // Get rescaling corrections from OCDB + AliCDBEntry* entry = GetFromOCDB("Calib", "RescaleDriftSpeedSDD"); + if(!entry){ + Log("RescaleDriftSpeedSDD file not found in OCDB."); + } + TList* fullList=(TList*)entry->GetObject(); + if(!fullList){ + Log("TList object not found in file."); + } + TString listName=Form("RefMod%d_Side%d",idGoldenMod,idGoldenSide); + correctionList=(TList*)fullList->FindObject(listName.Data()); + if(!correctionList){ + Log(Form("TList for requested module %d side %d not found",idGoldenMod,idGoldenSide)); + }else{ + Log(Form("Use module %d side %d as reference module",idGoldenMod,idGoldenSide)); + if(refSpeed){ + Log(Form("Drift speed params for golden module = %g %g %g %g",refSpeed->GetDriftSpeedParameter(0),refSpeed->GetDriftSpeedParameter(1),refSpeed->GetDriftSpeedParameter(2),refSpeed->GetDriftSpeedParameter(3))); + }else{ + AliError("No drift speed object for golden module"); + } + } + } + for(Int_t ihyb=0; ihyb<2*kNumberOfSDDLay3; ihyb++){ + AliITSDriftSpeedArraySDD *arr=new AliITSDriftSpeedArraySDD(); if(modSet[ihyb]==0){ - AliWarning(Form("No good injector events for mod. %d side %d --> use average values for layer 3",ihyb/2,ihyb%2)); - AliITSDriftSpeedArraySDD *arr=new AliITSDriftSpeedArraySDD(); - arr->AddDriftSpeed(avdsp3); - arr->SetInjectorStatus(0); + Int_t iBadMod=ihyb/2+240; + Int_t iBadSide=ihyb%2; + Bool_t goldenUsed=kFALSE; + if(correctionList && refSpeed){ + Double_t *params=RescaleDriftSpeedModule(correctionList,iBadMod,iBadSide,refSpeed); + if(params){ + AliWarning(Form("No good injector events for mod. %d side %d --> use rescaled values from golden module",iBadMod,iBadSide)); + AliITSDriftSpeedSDD* dspres=new AliITSDriftSpeedSDD(0,refSpeed->GetEventTimestamp(),3,params); + arr->AddDriftSpeed(dspres); + arr->SetInjectorStatus(1); + goldenUsed=kTRUE; + } + } + if(!goldenUsed){ + AliWarning(Form("No good injector events for mod. %d side %d --> use average values for layer 3",iBadMod,iBadSide)); + arr->AddDriftSpeed(avdsp3); + arr->SetInjectorStatus(0); + } vdrift.AddAt(arr,ihyb); } } @@ -346,6 +409,34 @@ UInt_t AliITSPreprocessorSDD::ProcessInjector(AliITSDDLModuleMapSDD* ddlmap){ if(retCode) return 0; else return 1; } + +//______________________________________________________________________ +Double_t* AliITSPreprocessorSDD::RescaleDriftSpeedModule(const TList* theList, + Int_t iBadMod, + Int_t iBadSide, + const AliITSDriftSpeedSDD* refSpeed) + const +{ + // Rescale driftSpeed for a drift region starting from values of golden module + + if(!refSpeed) return 0x0; + TString hisName=Form("hRatioMod%d_Side%d",iBadMod,iBadSide); + TH1D* h=(TH1D*)theList->FindObject(hisName.Data()); + if(!h) return 0x0; + + TF1* fpoly=new TF1("fpoly","pol3",0.,255.); + for(Int_t iAnode=0; iAnode<256; iAnode++){ + Double_t vref=refSpeed->GetDriftSpeedAtAnode((Double_t)iAnode); + Double_t vcorr=h->GetBinContent(iAnode+1)*vref; + h->SetBinContent(iAnode+1,vcorr); + } + h->Fit(fpoly,"RNQ"); + Double_t *params=new Double_t[4]; + for(Int_t iPar=0; iPar<4; iPar++) params[iPar]=fpoly->GetParameter(iPar); + delete fpoly; + return params; +} + //______________________________________________________________________ Bool_t AliITSPreprocessorSDD::ProcessDCSDataPoints(TMap* dcsAliasMap){ // Process DCS data