X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PMD%2FAliPMDClusterFinder.cxx;h=7ca2996f0bbe61142e38d96da9fa5c0fcd7efeb5;hb=d8cf83e2582c7759cbe3fa9cabbfb5f7edffa6ba;hp=36b1bb10a9d972d88c6c0a5e19972bb1ea8e5a8c;hpb=df42ab21c09f9a669327300c229540cc2ade41fd;p=u%2Fmrichter%2FAliRoot.git diff --git a/PMD/AliPMDClusterFinder.cxx b/PMD/AliPMDClusterFinder.cxx index 36b1bb10a9d..7ca2996f0bb 100644 --- a/PMD/AliPMDClusterFinder.cxx +++ b/PMD/AliPMDClusterFinder.cxx @@ -26,6 +26,7 @@ #include #include #include +#include #include "AliLog.h" #include "AliRunLoader.h" @@ -39,10 +40,16 @@ #include "AliPMDcluster.h" #include "AliPMDrecpoint1.h" #include "AliPMDrechit.h" +#include "AliPMDisocell.h" #include "AliPMDRawStream.h" #include "AliPMDCalibData.h" +#include "AliPMDPedestal.h" #include "AliPMDddldata.h" +#include "AliPMDHotData.h" +#include "AliPMDRecoParam.h" +#include "AliPMDReconstructor.h" +#include "AliDAQ.h" #include "AliCDBManager.h" #include "AliCDBEntry.h" @@ -53,6 +60,10 @@ ClassImp(AliPMDClusterFinder) AliPMDClusterFinder::AliPMDClusterFinder(): fRunLoader(0), fPMDLoader(0), + fCalibGain(GetCalibGain()), + fCalibPed(GetCalibPed()), + fCalibHot(GetCalibHot()), + fRecoParam(0x0), fTreeD(0), fTreeR(0), fDigits(new TClonesArray("AliPMDdigit", 1000)), @@ -60,17 +71,21 @@ AliPMDClusterFinder::AliPMDClusterFinder(): fRechits(new TClonesArray("AliPMDrechit", 1000)), fNpoint(0), fNhit(0), + fDetNo(0), fEcut(0.) { // // Constructor // - fCalibData = GetCalibData(); } // ------------------------------------------------------------------------- // AliPMDClusterFinder::AliPMDClusterFinder(AliRunLoader* runLoader): fRunLoader(runLoader), fPMDLoader(runLoader->GetLoader("PMDLoader")), + fCalibGain(GetCalibGain()), + fCalibPed(GetCalibPed()), + fCalibHot(GetCalibHot()), + fRecoParam(0x0), fTreeD(0), fTreeR(0), fDigits(new TClonesArray("AliPMDdigit", 1000)), @@ -78,12 +93,41 @@ AliPMDClusterFinder::AliPMDClusterFinder(AliRunLoader* runLoader): fRechits(new TClonesArray("AliPMDrechit", 1000)), fNpoint(0), fNhit(0), + fDetNo(0), fEcut(0.) { // // Constructor // - fCalibData = GetCalibData(); +} +// ------------------------------------------------------------------------- // +AliPMDClusterFinder::AliPMDClusterFinder(const AliPMDClusterFinder & finder): + TObject(finder), + fRunLoader(0), + fPMDLoader(0), + fCalibGain(GetCalibGain()), + fCalibPed(GetCalibPed()), + fCalibHot(GetCalibHot()), + fRecoParam(0x0), + fTreeD(0), + fTreeR(0), + fDigits(NULL), + fRecpoints(NULL), + fRechits(NULL), + fNpoint(0), + fNhit(0), + fDetNo(0), + fEcut(0.) +{ + // copy constructor + AliError("Copy constructor not allowed"); +} +// ------------------------------------------------------------------------- // +AliPMDClusterFinder &AliPMDClusterFinder::operator=(const AliPMDClusterFinder & /*finder*/) +{ + // assignment op + AliError("Assignment Operator not allowed"); + return *this; } // ------------------------------------------------------------------------- // AliPMDClusterFinder::~AliPMDClusterFinder() @@ -91,22 +135,17 @@ AliPMDClusterFinder::~AliPMDClusterFinder() // Destructor if (fDigits) { - fDigits->Delete(); - delete fDigits; - fDigits=0; + fDigits->Clear(); } if (fRecpoints) { - fRecpoints->Delete(); - delete fRecpoints; - fRecpoints=0; + fRecpoints->Clear(); } if (fRechits) { - fRechits->Delete(); - delete fRechits; - fRechits=0; + fRechits->Clear(); } + } // ------------------------------------------------------------------------- // @@ -115,6 +154,7 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt) // Converts digits to recpoints after running clustering // algorithm on CPV plane and PREshower plane // + Int_t det = 0,smn = 0; Int_t xpos,ypos; Float_t adc; @@ -122,10 +162,21 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt) Int_t idet; Float_t clusdata[6]; + AliPMDisocell *pmdiso = 0x0; + TObjArray *pmdcont = new TObjArray(); + TObjArray *pmdisocell = new TObjArray(); + AliPMDClustering *pmdclust = new AliPMDClusteringV1(); - pmdclust->SetEdepCut(fEcut); + // fetch the recoparam object from database + fRecoParam = AliPMDReconstructor::GetRecoParam(); + + if(fRecoParam == 0x0) + { + AliFatal("No Reco Param found for PMD!!!"); + } + fRunLoader->GetEvent(ievt); @@ -169,23 +220,45 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt) xpos = pmddigit->GetRow(); ypos = pmddigit->GetColumn(); adc = pmddigit->GetADC(); - + if(xpos < 0 || xpos > 48 || ypos < 0 || ypos > 96) + { + AliError(Form("*Row %d and Column NUMBER %d NOT Valid *", + xpos, ypos)); + continue; + } + + // Hot cell - set the cell adc = 0 + Float_t hotflag = fCalibHot->GetHotChannel(det,smn,xpos,ypos); + if (hotflag == 1) adc = 0; // CALIBRATION - Float_t gain = fCalibData->GetGainFact(det,smn,xpos,ypos); - - // printf("adc = %d gain = %f\n",adc,gain); + Float_t gain = fCalibGain->GetGainFact(det,smn,xpos,ypos); + // printf("adc = %d gain = %f\n",adc,gain); adc = adc*gain; - //Int_t trno = pmddigit->GetTrackNumber(); - fCellADC[xpos][ypos] = (Double_t) adc; + fCellTrack[xpos][ypos] = pmddigit->GetTrackNumber(); + fCellPid[xpos][ypos] = pmddigit->GetTrackPid(); + fCellADC[xpos][ypos] = (Double_t) adc; } idet = det; ismn = smn; - pmdclust->DoClust(idet,ismn,fCellADC,pmdcont); - + + // Set the minimum noise cut per module before clustering + + Int_t imod = idet*24 + ismn; + fEcut = fRecoParam->GetNoiseCut(imod); // default + // fEcut = fRecoParam->GetPbPbParam()->GetNoiseCut(imod); + // fEcut = fRecoParam->GetPPParam()->GetNoiseCut(imod); + // fEcut = fRecoParam->GetCosmicParam()->GetNoiseCut(imod); + + pmdclust->SetEdepCut(fEcut); + + + pmdclust->DoClust(idet,ismn,fCellTrack,fCellPid,fCellADC, + pmdisocell,pmdcont); + Int_t nentries1 = pmdcont->GetEntries(); AliDebug(1,Form("Total number of clusters/module = %d",nentries1)); @@ -209,12 +282,35 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt) { Int_t celldataX = pmdcl->GetClusCellX(ihit); Int_t celldataY = pmdcl->GetClusCellY(ihit); - AddRecHit(celldataX, celldataY); + Int_t celldataTr = pmdcl->GetClusCellTrack(ihit); + Int_t celldataPid = pmdcl->GetClusCellPid(ihit); + Float_t celldataAdc = pmdcl->GetClusCellAdc(ihit); + AddRecHit(celldataX, celldataY, celldataTr, celldataPid, celldataAdc); } branch2->Fill(); ResetRechit(); } - pmdcont->Clear(); + pmdcont->Delete(); + + // Added single isolated cell for offline gain calibration + nentries1 = pmdisocell->GetEntries(); + AliDebug(1,Form("Total number of isolated single cell clusters = %d",nentries1)); + + for (Int_t ient1 = 0; ient1 < nentries1; ient1++) + { + pmdiso = (AliPMDisocell*)pmdisocell->UncheckedAt(ient1); + idet = pmdiso->GetDetector(); + ismn = pmdiso->GetSmn(); + clusdata[0] = (Float_t) pmdiso->GetRow(); + clusdata[1] = (Float_t) pmdiso->GetCol(); + clusdata[2] = pmdiso->GetADC(); + clusdata[3] = 1.; + clusdata[4] = -99.; + clusdata[5] = -99.; + + AddRecPoint(idet,ismn,clusdata); + } + pmdisocell->Delete(); branch1->Fill(); ResetRecpoint(); @@ -228,24 +324,249 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt) // delete the pointers delete pmdclust; delete pmdcont; + delete pmdisocell; } // ------------------------------------------------------------------------- // +void AliPMDClusterFinder::Digits2RecPoints(TTree *digitsTree, + TTree *clustersTree) +{ + // Converts digits to recpoints after running clustering + // algorithm on CPV plane and PREshower plane + // + // This algorithm is called during the reconstruction from digits + + Int_t det = 0,smn = 0; + Int_t xpos,ypos; + Float_t adc; + Int_t ismn; + Int_t idet; + Float_t clusdata[6]; + + AliPMDcluster *pmdcl = 0x0; + AliPMDisocell *pmdiso = 0x0; + + TObjArray *pmdcont = new TObjArray(); + TObjArray *pmdisocell = new TObjArray(); + AliPMDClustering *pmdclust = new AliPMDClusteringV1(); + + // Fetch the reco param object + + fRecoParam = AliPMDReconstructor::GetRecoParam(); + if(fRecoParam == 0x0) + { + AliFatal("No Reco Param found for PMD!!!"); + } + + + AliPMDdigit *pmddigit; + TBranch *branch = digitsTree->GetBranch("PMDDigit"); + branch->SetAddress(&fDigits); + + ResetRecpoint(); + + Int_t bufsize = 16000; + TBranch * branch1 = clustersTree->Branch("PMDRecpoint", &fRecpoints, bufsize); + TBranch * branch2 = clustersTree->Branch("PMDRechit", &fRechits, bufsize); + + Int_t nmodules = (Int_t) digitsTree->GetEntries(); + + for (Int_t imodule = 0; imodule < nmodules; imodule++) + { + + Int_t totADCMod = 0; + ResetCellADC(); + digitsTree->GetEntry(imodule); + Int_t nentries = fDigits->GetLast(); + for (Int_t ient = 0; ient < nentries+1; ient++) + { + pmddigit = (AliPMDdigit*)fDigits->UncheckedAt(ient); + + det = pmddigit->GetDetector(); + smn = pmddigit->GetSMNumber(); + xpos = pmddigit->GetRow(); + ypos = pmddigit->GetColumn(); + adc = pmddigit->GetADC(); + if(xpos < 0 || xpos > 48 || ypos < 0 || ypos > 96) + { + AliError(Form("*Row %d and Column NUMBER %d NOT Valid *", + xpos, ypos)); + continue; + } + + // Pedestal Subtraction + Int_t pedmeanrms = fCalibPed->GetPedMeanRms(det,smn,xpos,ypos); + Int_t pedrms1 = (Int_t) pedmeanrms%100; + Float_t pedrms = (Float_t)pedrms1/10.; + Float_t pedmean = (Float_t) (pedmeanrms - pedrms1)/1000.0; + //printf("%f %f\n",pedmean, pedrms); + + Float_t adc1 = adc - (pedmean + 3.0*pedrms); + + // Hot cell - set the cell adc = 0 + Float_t hotflag = fCalibHot->GetHotChannel(det,smn,xpos,ypos); + if (hotflag == 1) adc1 = 0; + + // CALIBRATION + Float_t gain = fCalibGain->GetGainFact(det,smn,xpos,ypos); + // printf("adc = %d gain = %f\n",adc,gain); + + adc = adc1*gain; + + fCellTrack[xpos][ypos] = pmddigit->GetTrackNumber(); + fCellPid[xpos][ypos] = pmddigit->GetTrackPid(); + fCellADC[xpos][ypos] = (Double_t) adc; + + totADCMod += (Int_t) adc; + + } + + idet = det; + ismn = smn; + + if (totADCMod <= 0) continue; + + // Set the minimum noise cut per module before clustering + + Int_t imod = idet*24 + ismn; + fEcut = fRecoParam->GetNoiseCut(imod); // default + // fEcut = fRecoParam->GetPbPbParam()->GetNoiseCut(imod); + // fEcut = fRecoParam->GetPPParam()->GetNoiseCut(imod); + // fEcut = fRecoParam->GetCosmicParam()->GetNoiseCut(imod); + + + pmdclust->SetEdepCut(fEcut); + + pmdclust->DoClust(idet,ismn,fCellTrack,fCellPid,fCellADC, + pmdisocell,pmdcont); + + Int_t nentries1 = pmdcont->GetEntries(); + + AliDebug(1,Form("Total number of clusters/module = %d",nentries1)); + + for (Int_t ient1 = 0; ient1 < nentries1; ient1++) + { + pmdcl = (AliPMDcluster*)pmdcont->UncheckedAt(ient1); + idet = pmdcl->GetDetector(); + ismn = pmdcl->GetSMN(); + clusdata[0] = pmdcl->GetClusX(); + clusdata[1] = pmdcl->GetClusY(); + clusdata[2] = pmdcl->GetClusADC(); + clusdata[3] = pmdcl->GetClusCells(); + clusdata[4] = pmdcl->GetClusSigmaX(); + clusdata[5] = pmdcl->GetClusSigmaY(); + + AddRecPoint(idet,ismn,clusdata); + + Int_t ncell = (Int_t) clusdata[3]; + for(Int_t ihit = 0; ihit < ncell; ihit++) + { + Int_t celldataX = pmdcl->GetClusCellX(ihit); + Int_t celldataY = pmdcl->GetClusCellY(ihit); + Int_t celldataTr = pmdcl->GetClusCellTrack(ihit); + Int_t celldataPid = pmdcl->GetClusCellPid(ihit); + Float_t celldataAdc = pmdcl->GetClusCellAdc(ihit); + AddRecHit(celldataX, celldataY, celldataTr, celldataPid, celldataAdc); + } + branch2->Fill(); + ResetRechit(); + } + pmdcont->Delete(); + + // Added single isolated cell for offline gain calibration + nentries1 = pmdisocell->GetEntries(); + AliDebug(1,Form("Total number of isolated single cell clusters = %d",nentries1)); + + for (Int_t ient1 = 0; ient1 < nentries1; ient1++) + { + pmdiso = (AliPMDisocell*)pmdisocell->UncheckedAt(ient1); + idet = pmdiso->GetDetector(); + ismn = pmdiso->GetSmn(); + clusdata[0] = (Float_t) pmdiso->GetRow(); + clusdata[1] = (Float_t) pmdiso->GetCol(); + clusdata[2] = pmdiso->GetADC(); + clusdata[3] = 1.; + clusdata[4] = -99.; + clusdata[5] = -99.; + + AddRecPoint(idet,ismn,clusdata); + } + pmdisocell->Delete(); + + branch1->Fill(); + ResetRecpoint(); + + } // modules + + + ResetCellADC(); + + // delete the pointers + delete pmdclust; + delete pmdcont; + delete pmdisocell; +} +// ------------------------------------------------------------------------- // + void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader, TTree *clustersTree) { // Converts RAW data to recpoints after running clustering // algorithm on CPV and PREshower plane // + // This method is called at the time of reconstruction from RAW data + + + AliPMDddldata *pmdddl = 0x0; + AliPMDcluster *pmdcl = 0x0; + AliPMDisocell *pmdiso = 0x0; + Float_t clusdata[6]; TObjArray pmdddlcont; TObjArray *pmdcont = new TObjArray(); + TObjArray *pmdisocell = new TObjArray(); + AliPMDClustering *pmdclust = new AliPMDClusteringV1(); - pmdclust->SetEdepCut(fEcut); + // open the ddl file info to know the module + TString ddlinfofileName(gSystem->Getenv("ALICE_ROOT")); + ddlinfofileName += "/PMD/PMD_ddl_info.dat"; + + ifstream infileddl; + infileddl.open(ddlinfofileName.Data(), ios::in); // ascii file + if(!infileddl) AliError("Could not read the ddl info file"); + + Int_t ddlno; + Int_t modno; + Int_t modulePerDDL; + Int_t moduleddl[6]; + + for(Int_t jddl = 0; jddl < 6; jddl++) + { + if (infileddl.eof()) break; + infileddl >> ddlno >> modulePerDDL; + moduleddl[jddl] = modulePerDDL; + + if (modulePerDDL == 0) continue; + for (Int_t im = 0; im < modulePerDDL; im++) + { + infileddl >> modno; + } + } + + infileddl.close(); + + // Set the minimum noise cut per module before clustering + + fRecoParam = AliPMDReconstructor::GetRecoParam(); + + if(fRecoParam == 0x0) + { + AliFatal("No Reco Param found for PMD!!!"); + } ResetRecpoint(); @@ -254,23 +575,19 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader, TBranch * branch2 = clustersTree->Branch("PMDRechit", &fRechits, bufsize); - const Int_t kDDL = 6; const Int_t kRow = 48; const Int_t kCol = 96; Int_t idet = 0; Int_t iSMN = 0; - - for (Int_t indexDDL = 0; indexDDL < kDDL; indexDDL++) + + Int_t indexDDL = -1; + AliPMDRawStream pmdinput(rawReader); + + while ((indexDDL = pmdinput.DdlData(&pmdddlcont)) >=0) { - if (indexDDL < 4) - { - iSMN = 6; - } - else if (indexDDL >= 4) - { - iSMN = 12; - } + iSMN = moduleddl[indexDDL]; + Int_t ***precpvADC; precpvADC = new int **[iSMN]; for (Int_t i=0; iReset(); - AliPMDRawStream pmdinput(rawReader); - rawReader->Select("PMD", indexDDL, indexDDL); - pmdinput.DdlData(&pmdddlcont); + Int_t indexsmn = 0; Int_t ientries = pmdddlcont.GetEntries(); for (Int_t ient = 0; ient < ientries; ient++) { - AliPMDddldata *pmdddl = (AliPMDddldata*)pmdddlcont.UncheckedAt(ient); + pmdddl = (AliPMDddldata*)pmdddlcont.UncheckedAt(ient); Int_t det = pmdddl->GetDetector(); Int_t smn = pmdddl->GetSMN(); @@ -307,13 +621,57 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader, Int_t col = pmdddl->GetColumn(); Int_t sig = pmdddl->GetSignal(); - Float_t sig1 = (Float_t) sig; + if(smn == -1) + { + AliError(Form("*MODULE NUMBER WRONG %d *",smn)); + continue; + } + if(row < 0 || row > 48 || col < 0 || col > 96) + { + AliError(Form("*Row %d and Column NUMBER %d NOT Valid *", + row, col)); + + continue; + } + + // Pedestal Subtraction + Int_t pedmeanrms = fCalibPed->GetPedMeanRms(det,smn,row,col); + Int_t pedrms1 = (Int_t) pedmeanrms%100; + Float_t pedrms = (Float_t)pedrms1/10.; + Float_t pedmean = (Float_t) (pedmeanrms - pedrms1)/1000.0; + + //printf("%f %f\n",pedmean, pedrms); + + // Float_t sig1 = (Float_t) sig; + Float_t sig1 = (Float_t) sig - (pedmean + 3.0*pedrms); + + // Hot cell - set the cell adc = 0 + Float_t hotflag = fCalibHot->GetHotChannel(det,smn,row,col); + if (hotflag == 1) sig1 = 0; + // CALIBRATION - Float_t gain = fCalibData->GetGainFact(det,smn,row,col); + Float_t gain = fCalibGain->GetGainFact(det,smn,row,col); //printf("sig = %d gain = %f\n",sig,gain); sig = (Int_t) (sig1*gain); - if (indexDDL < 4) + if (indexDDL == 0) + { + if (det != 0) + AliError(Form("*DDL %d and Detector NUMBER %d NOT MATCHING *", + indexDDL, det)); + if (iSMN == 6) + { + indexsmn = smn; + } + else if (iSMN == 12) + { + if (smn < 6) + indexsmn = smn; + else if (smn >= 18 && smn < 24) + indexsmn = smn-12; + } + } + else if (indexDDL >= 1 && indexDDL < 4) { if (det != 0) AliError(Form("*DDL %d and Detector NUMBER %d NOT MATCHING *", @@ -339,34 +697,54 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader, if (det != 1) AliError(Form("*DDL %d and Detector NUMBER %d NOT MATCHING *", indexDDL, det)); - if (smn >= 6 && smn < 12) - { - indexsmn = smn - 6; - } - else if (smn >= 12 && smn < 18) + if (smn >= 6 && smn < 18) { indexsmn = smn - 6; } } + precpvADC[indexsmn][row][col] = sig; } - pmdddlcont.Clear(); + pmdddlcont.Delete(); + + Int_t totAdcMod = 0; Int_t ismn = 0; - for (Int_t indexsmn = 0; indexsmn < iSMN; indexsmn++) + for (indexsmn = 0; indexsmn < iSMN; indexsmn++) { ResetCellADC(); + totAdcMod = 0; for (Int_t irow = 0; irow < kRow; irow++) { for (Int_t icol = 0; icol < kCol; icol++) { + fCellTrack[irow][icol] = -1; + fCellPid[irow][icol] = -1; + fCellADC[irow][icol] = (Double_t) precpvADC[indexsmn][irow][icol]; + totAdcMod += precpvADC[indexsmn][irow][icol]; } // row } // col - if (indexDDL < 4) + if (indexDDL == 0) + { + if (iSMN == 6) + { + ismn = indexsmn; + } + else if (iSMN == 12) + { + + if (indexsmn < 6) + ismn = indexsmn; + else if (indexsmn >= 6 && indexsmn < 12) + ismn = indexsmn + 12; + } + idet = 0; + } + else if (indexDDL >= 1 && indexDDL < 4) { ismn = indexsmn + indexDDL * 6; idet = 0; @@ -385,26 +763,32 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader, } else if (indexDDL == 5) { - if (indexsmn < 6) - { - ismn = indexsmn + 6; - } - else if (indexsmn >= 6 && indexsmn < 12) - { - ismn = indexsmn + 6; - } + ismn = indexsmn + 6; idet = 1; } - pmdclust->DoClust(idet,ismn,fCellADC,pmdcont); + if (totAdcMod <= 0) continue; + + Int_t imod = idet*24 + ismn; + + fEcut = fRecoParam->GetNoiseCut(imod); // default + // fEcut = fRecoParam->GetPbPbParam()->GetNoiseCut(imod); + // fEcut = fRecoParam->GetPPParam()->GetNoiseCut(imod); + // fEcut = fRecoParam->GetCosmicParam()->GetNoiseCut(imod); + + + pmdclust->SetEdepCut(fEcut); + + pmdclust->DoClust(idet,ismn,fCellTrack,fCellPid,fCellADC, + pmdisocell,pmdcont); + Int_t nentries1 = pmdcont->GetEntries(); AliDebug(1,Form("Total number of clusters/module = %d",nentries1)); for (Int_t ient1 = 0; ient1 < nentries1; ient1++) { - AliPMDcluster *pmdcl = - (AliPMDcluster*)pmdcont->UncheckedAt(ient1); + pmdcl = (AliPMDcluster*)pmdcont->UncheckedAt(ient1); idet = pmdcl->GetDetector(); ismn = pmdcl->GetSMN(); clusdata[0] = pmdcl->GetClusX(); @@ -421,13 +805,37 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader, { Int_t celldataX = pmdcl->GetClusCellX(ihit); Int_t celldataY = pmdcl->GetClusCellY(ihit); - AddRecHit(celldataX, celldataY); + Int_t celldataTr = pmdcl->GetClusCellTrack(ihit); + Int_t celldataPid = pmdcl->GetClusCellPid(ihit); + Float_t celldataAdc = pmdcl->GetClusCellAdc(ihit); + AddRecHit(celldataX, celldataY, celldataTr, celldataPid, celldataAdc); } branch2->Fill(); ResetRechit(); } - pmdcont->Clear(); + pmdcont->Delete(); + + + // Added single isolated cell for offline gain calibration + nentries1 = pmdisocell->GetEntries(); + AliDebug(1,Form("Total number of isolated single cell clusters = %d",nentries1)); + + for (Int_t ient1 = 0; ient1 < nentries1; ient1++) + { + pmdiso = (AliPMDisocell*)pmdisocell->UncheckedAt(ient1); + idet = pmdiso->GetDetector(); + ismn = pmdiso->GetSmn(); + clusdata[0] = (Float_t) pmdiso->GetRow(); + clusdata[1] = (Float_t) pmdiso->GetCol(); + clusdata[2] = pmdiso->GetADC(); + clusdata[3] = 1.; + clusdata[4] = -99.; + clusdata[5] = -99.; + + AddRecPoint(idet,ismn,clusdata); + } + pmdisocell->Delete(); branch1->Fill(); ResetRecpoint(); @@ -440,14 +848,17 @@ void AliPMDClusterFinder::Digits2RecPoints(AliRawReader *rawReader, for (Int_t j=0; jSetEdepCut(fEcut); + // open the ddl file info to know the module + TString ddlinfofileName(gSystem->Getenv("ALICE_ROOT")); + ddlinfofileName += "/PMD/PMD_ddl_info.dat"; + + ifstream infileddl; + infileddl.open(ddlinfofileName.Data(), ios::in); // ascii file + if(!infileddl) AliError("Could not read the ddl info file"); + + Int_t ddlno; + Int_t modno; + Int_t modulePerDDL; + Int_t moduleddl[6]; + + for(Int_t jddl = 0; jddl < 6; jddl++) + { + if (infileddl.eof()) break; + infileddl >> ddlno >> modulePerDDL; + moduleddl[jddl] = modulePerDDL; + + if (modulePerDDL == 0) continue; + for (Int_t im = 0; im < modulePerDDL; im++) + { + infileddl >> modno; + } + } + + infileddl.close(); + + // Set the minimum noise cut per module before clustering + + fRecoParam = AliPMDReconstructor::GetRecoParam(); + + if(fRecoParam == 0x0) + { + AliFatal("No Reco Param found for PMD!!!"); + } + fRunLoader->GetEvent(ievt); @@ -480,23 +934,20 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader) TBranch *branch1 = fTreeR->Branch("PMDRecpoint", &fRecpoints, bufsize); TBranch *branch2 = fTreeR->Branch("PMDRechit", &fRechits, bufsize); - const Int_t kDDL = 6; const Int_t kRow = 48; const Int_t kCol = 96; Int_t idet = 0; Int_t iSMN = 0; - - for (Int_t indexDDL = 0; indexDDL < kDDL; indexDDL++) + + AliPMDRawStream pmdinput(rawReader); + Int_t indexDDL = -1; + + while ((indexDDL = pmdinput.DdlData(&pmdddlcont)) >=0) { - if (indexDDL < 4) - { - iSMN = 6; - } - else if (indexDDL >= 4) - { - iSMN = 12; - } + + iSMN = moduleddl[indexDDL]; + Int_t ***precpvADC; precpvADC = new int **[iSMN]; for (Int_t i=0; iReset(); - AliPMDRawStream pmdinput(rawReader); - rawReader->Select("PMD", indexDDL, indexDDL); - - pmdinput.DdlData(&pmdddlcont); + Int_t indexsmn = 0; Int_t ientries = pmdddlcont.GetEntries(); @@ -534,15 +981,48 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader) Int_t row = pmdddl->GetRow(); Int_t col = pmdddl->GetColumn(); Int_t sig = pmdddl->GetSignal(); + if(row < 0 || row > 48 || col < 0 || col > 96) + { + AliError(Form("*Row %d and Column NUMBER %d NOT Valid *", + row, col)); + continue; + } + // Pedestal Subtraction + Int_t pedmeanrms = fCalibPed->GetPedMeanRms(det,smn,row,col); + Int_t pedrms1 = (Int_t) pedmeanrms%100; + Float_t pedrms = (Float_t)pedrms1/10.; + Float_t pedmean = (Float_t) (pedmeanrms - pedrms1)/1000.0; + //printf("%f %f\n",pedmean, pedrms); + Float_t sig1 = (Float_t) sig - (pedmean + 3.0*pedrms); + + // Hot cell - set the cell adc = 0 + Float_t hotflag = fCalibHot->GetHotChannel(det,smn,row,col); + if (hotflag == 1) sig1 = 0; - Float_t sig1 = (Float_t) sig; // CALIBRATION - Float_t gain = fCalibData->GetGainFact(det,smn,row,col); + Float_t gain = fCalibGain->GetGainFact(det,smn,row,col); + //printf("sig = %d gain = %f\n",sig,gain); sig = (Int_t) (sig1*gain); - - if (indexDDL < 4) + if (indexDDL == 0) + { + if (det != 0) + AliError(Form("*DDL %d and Detector NUMBER %d NOT MATCHING *", + indexDDL, det)); + if (iSMN == 6) + { + indexsmn = smn; + } + else if (iSMN == 12) + { + if (smn < 6) + indexsmn = smn; + else if (smn >= 18 && smn < 24) + indexsmn = smn-12; + } + } + else if (indexDDL >= 1 && indexDDL < 4) { if (det != 0) AliError(Form("*DDL %d and Detector NUMBER %d NOT MATCHING *", @@ -568,36 +1048,51 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader) if (det != 1) AliError(Form("*DDL %d and Detector NUMBER %d NOT MATCHING *", indexDDL, det)); - if (smn >= 6 && smn < 12) - { - indexsmn = smn - 6; - } - else if (smn >= 12 && smn < 18) + if (smn >= 6 && smn < 18) { indexsmn = smn - 6; } } + precpvADC[indexsmn][row][col] = sig; } - pmdddlcont.Clear(); + pmdddlcont.Delete(); Int_t ismn = 0; - for (Int_t indexsmn = 0; indexsmn < iSMN; indexsmn++) + for (indexsmn = 0; indexsmn < iSMN; indexsmn++) { ResetCellADC(); for (Int_t irow = 0; irow < kRow; irow++) { for (Int_t icol = 0; icol < kCol; icol++) { + fCellTrack[irow][icol] = -1; + fCellPid[irow][icol] = -1; fCellADC[irow][icol] = (Double_t) precpvADC[indexsmn][irow][icol]; } // row } // col - - if (indexDDL < 4) + + if (indexDDL == 0) + { + if (iSMN == 6) + { + ismn = indexsmn; + } + else if (iSMN == 12) + { + + if (indexsmn < 6) + ismn = indexsmn; + else if (indexsmn >= 6 && indexsmn < 12) + ismn = indexsmn + 12; + } + idet = 0; + } + else if (indexDDL >= 1 && indexDDL < 4) { ismn = indexsmn + indexDDL * 6; idet = 0; @@ -616,26 +1111,28 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader) } else if (indexDDL == 5) { - if (indexsmn < 6) - { - ismn = indexsmn + 6; - } - else if (indexsmn >= 6 && indexsmn < 12) - { - ismn = indexsmn + 6; - } + ismn = indexsmn + 6; idet = 1; } - pmdclust->DoClust(idet,ismn,fCellADC,pmdcont); + Int_t imod = idet*24 + ismn; + fEcut = fRecoParam->GetNoiseCut(imod); // default + // fEcut = fRecoParam->GetPbPbParam()->GetNoiseCut(imod); + // fEcut = fRecoParam->GetPPParam()->GetNoiseCut(imod); + // fEcut = fRecoParam->GetCosmicParam()->GetNoiseCut(imod); + + pmdclust->SetEdepCut(fEcut); + + pmdclust->DoClust(idet,ismn,fCellTrack,fCellPid,fCellADC, + pmdisocell,pmdcont); + Int_t nentries1 = pmdcont->GetEntries(); AliDebug(1,Form("Total number of clusters/module = %d",nentries1)); for (Int_t ient1 = 0; ient1 < nentries1; ient1++) { - AliPMDcluster *pmdcl = - (AliPMDcluster*)pmdcont->UncheckedAt(ient1); + pmdcl = (AliPMDcluster*)pmdcont->UncheckedAt(ient1); idet = pmdcl->GetDetector(); ismn = pmdcl->GetSMN(); clusdata[0] = pmdcl->GetClusX(); @@ -652,13 +1149,36 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader) { Int_t celldataX = pmdcl->GetClusCellX(ihit); Int_t celldataY = pmdcl->GetClusCellY(ihit); - AddRecHit(celldataX, celldataY); + Int_t celldataTr = pmdcl->GetClusCellTrack(ihit); + Int_t celldataPid = pmdcl->GetClusCellPid(ihit); + Float_t celldataAdc = pmdcl->GetClusCellAdc(ihit); + AddRecHit(celldataX, celldataY, celldataTr, celldataPid, celldataAdc); } branch2->Fill(); ResetRechit(); } - pmdcont->Clear(); + pmdcont->Delete(); + + // Added single isolated cell for offline gain calibration + nentries1 = pmdisocell->GetEntries(); + AliDebug(1,Form("Total number of isolated single cell clusters = %d",nentries1)); + + for (Int_t ient1 = 0; ient1 < nentries1; ient1++) + { + pmdiso = (AliPMDisocell*)pmdisocell->UncheckedAt(ient1); + idet = pmdiso->GetDetector(); + ismn = pmdiso->GetSmn(); + clusdata[0] = (Float_t) pmdiso->GetRow(); + clusdata[1] = (Float_t) pmdiso->GetCol(); + clusdata[2] = pmdiso->GetADC(); + clusdata[3] = 1.; + clusdata[4] = -99.; + clusdata[5] = -99.; + + AddRecPoint(idet,ismn,clusdata); + } + pmdisocell->Delete(); branch1->Fill(); ResetRecpoint(); @@ -673,7 +1193,8 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader) for (Int_t i=0; iGetLoader("PMDLoader"); @@ -682,7 +1203,7 @@ void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt, AliRawReader *rawReader) // delete the pointers delete pmdclust; delete pmdcont; - + delete pmdisocell; } // ------------------------------------------------------------------------- // void AliPMDClusterFinder::SetCellEdepCut(Float_t ecut) @@ -701,13 +1222,15 @@ void AliPMDClusterFinder::AddRecPoint(Int_t idet,Int_t ismn,Float_t *clusdata) delete newrecpoint; } // ------------------------------------------------------------------------- // -void AliPMDClusterFinder::AddRecHit(Int_t celldataX,Int_t celldataY) +void AliPMDClusterFinder::AddRecHit(Int_t celldataX,Int_t celldataY, + Int_t celldataTr, Int_t celldataPid, + Float_t celldataAdc) { // Add associated cell hits to the Reconstructed points // TClonesArray &lrechits = *fRechits; AliPMDrechit *newrechit; - newrechit = new AliPMDrechit(celldataX, celldataY); + newrechit = new AliPMDrechit(celldataX, celldataY, celldataTr, celldataPid, celldataAdc); new(lrechits[fNhit++]) AliPMDrechit(newrechit); delete newrechit; } @@ -720,12 +1243,13 @@ void AliPMDClusterFinder::ResetCellADC() { for(Int_t icol = 0; icol < fgkCol; icol++) { - fCellADC[irow][icol] = 0.; + fCellTrack[irow][icol] = -1; + fCellPid[irow][icol] = -1; + fCellADC[irow][icol] = 0.; } } } // ------------------------------------------------------------------------- // - void AliPMDClusterFinder::ResetRecpoint() { // Clear the list of reconstructed points @@ -770,31 +1294,52 @@ void AliPMDClusterFinder::UnLoadClusters() fPMDLoader->UnloadRecPoints(); } // ------------------------------------------------------------------------- // - -AliPMDCalibData* AliPMDClusterFinder::GetCalibData() const +AliPMDCalibData* AliPMDClusterFinder::GetCalibGain() const { // The run number will be centralized in AliCDBManager, // you don't need to set it here! // Added by ZA - AliCDBEntry *entry = AliCDBManager::Instance()->Get("PMD/Calib/Data"); + AliCDBEntry *entry = AliCDBManager::Instance()->Get("PMD/Calib/Gain"); - if(!entry){ - AliWarning("Calibration object retrieval failed! Dummy calibration will be used."); - - // this just remembers the actual default storage. No problem if it is null. - AliCDBStorage *origStorage = AliCDBManager::Instance()->GetDefaultStorage(); - AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT"); - - entry = AliCDBManager::Instance()->Get("PMD/Calib/Data"); - - // now reset the original default storage to AliCDBManager... - AliCDBManager::Instance()->SetDefaultStorage(origStorage); - } + if(!entry) AliFatal("Calibration object retrieval failed! "); AliPMDCalibData *calibdata=0; if (entry) calibdata = (AliPMDCalibData*) entry->GetObject(); - if (!calibdata) AliError("No calibration data from calibration database !"); + if (!calibdata) AliFatal("No calibration data from calibration database !"); return calibdata; } +// ------------------------------------------------------------------------- // +AliPMDPedestal* AliPMDClusterFinder::GetCalibPed() const +{ + // The run number will be centralized in AliCDBManager, + // you don't need to set it here! + AliCDBEntry *entry = AliCDBManager::Instance()->Get("PMD/Calib/Ped"); + + if(!entry) AliFatal("Pedestal object retrieval failed!"); + + AliPMDPedestal *pedestal = 0; + if (entry) pedestal = (AliPMDPedestal*) entry->GetObject(); + + if (!pedestal) AliFatal("No pedestal data from pedestal database !"); + + return pedestal; +} +//--------------------------------------------------------------------// +AliPMDHotData* AliPMDClusterFinder::GetCalibHot() const +{ + // The run number will be centralized in AliCDBManager, + // you don't need to set it here! + AliCDBEntry *entry = AliCDBManager::Instance()->Get("PMD/Calib/Hot"); + + if(!entry) AliFatal("HotData object retrieval failed!"); + + AliPMDHotData *hot = 0; + if (entry) hot = (AliPMDHotData*) entry->GetObject(); + + if (!hot) AliFatal("No hot data from database !"); + + return hot; +} +