X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PHOS%2FAliPHOS.cxx;h=d0d882a62d5dce981e3ed87366641f24e32d166f;hb=c93255fea4324a5f5f270d49316a46b1e0afc171;hp=b6aa2ba507754153d43450036316eefd8cae5a94;hpb=cf9d3be818b060bb715c2f71450fb0447d45f013;p=u%2Fmrichter%2FAliRoot.git diff --git a/PHOS/AliPHOS.cxx b/PHOS/AliPHOS.cxx index b6aa2ba5077..d0d882a62d5 100644 --- a/PHOS/AliPHOS.cxx +++ b/PHOS/AliPHOS.cxx @@ -66,12 +66,13 @@ // --- ROOT system --- class TFile; +#include #include -#include -#include +#include #include -#include #include +#include +#include // --- Standard library --- @@ -80,6 +81,7 @@ class TFile; #include "AliPHOS.h" #include "AliPHOSLoader.h" #include "AliRun.h" +#include "AliRawReader.h" #include "AliPHOSDigitizer.h" #include "AliPHOSSDigitizer.h" #include "AliPHOSDigit.h" @@ -93,17 +95,17 @@ class TFile; #include "AliPHOSCalibData.h" #include "AliPHOSPulseGenerator.h" #include "AliDAQ.h" -#include "AliPHOSRawDecoder.h" +#include "AliPHOSRawFitterv0.h" +#include "AliPHOSCalibData.h" #include "AliPHOSRawDigiProducer.h" #include "AliPHOSQAChecker.h" -#include "AliPHOSRecoParamEmc.h" +#include "AliPHOSRecoParam.h" #include "AliPHOSSimParam.h" -#include "AliPHOSCpvRawWrite.h" ClassImp(AliPHOS) //____________________________________________________________________________ - AliPHOS:: AliPHOS() : AliDetector() + AliPHOS:: AliPHOS() : AliDetector(),fgCalibData(0) { // Default ctor fName = "PHOS" ; @@ -111,7 +113,8 @@ ClassImp(AliPHOS) } //____________________________________________________________________________ -AliPHOS::AliPHOS(const char* name, const char* title): AliDetector(name, title) +AliPHOS::AliPHOS(const char* name, const char* title): AliDetector(name, title), +fgCalibData(0) { // ctor : title is used to identify the layout } @@ -119,6 +122,7 @@ AliPHOS::AliPHOS(const char* name, const char* title): AliDetector(name, title) //____________________________________________________________________________ AliPHOS::~AliPHOS() { + if(fgCalibData) delete fgCalibData ; } //____________________________________________________________________________ @@ -289,8 +293,8 @@ void AliPHOS::CreateMaterials() // DEFINITION OF THE TRACKING MEDIA // for PHOS: idtmed[699->798] equivalent to fIdtmed[0->100] - Int_t isxfld = gAlice->Field()->Integ() ; - Float_t sxmgmx = gAlice->Field()->Max() ; + Int_t isxfld = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Integ() ; + Float_t sxmgmx = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Max() ; // The scintillator of the calorimeter made of PBW04 -> idtmed[699] AliMedium(0, "PHOS Xtal $", 0, 1, @@ -376,42 +380,6 @@ void AliPHOS::CreateMaterials() //_____________________________________________________________________________ void AliPHOS::Init() { - // - // Initialises cuts for PHOS - // - // --- Set decent energy thresholds for gamma and electron tracking - Int_t * idtmed = fIdtmed->GetArray() - 699 ; - - // Tracking threshold for photons and electrons in the scintillator crystal - gMC->Gstpar(idtmed[699], "CUTGAM",0.5E-4) ; - gMC->Gstpar(idtmed[699], "CUTELE",1.0E-4) ; - - // --- Generate explicitly delta rays in the titan cover --- - gMC->Gstpar(idtmed[704], "LOSS",3.) ; - gMC->Gstpar(idtmed[704], "DRAY",1.) ; - // --- and in aluminium parts --- - gMC->Gstpar(idtmed[701], "LOSS",3.) ; - gMC->Gstpar(idtmed[701], "DRAY",1.) ; - // --- and in PIN diode - gMC->Gstpar(idtmed[705], "LOSS",3) ; - gMC->Gstpar(idtmed[705], "DRAY",1) ; - // --- and in the passive convertor - gMC->Gstpar(idtmed[712], "LOSS",3) ; - gMC->Gstpar(idtmed[712], "DRAY",1) ; - // Tracking threshold for photons and electrons in the gas ArC02 - gMC->Gstpar(idtmed[715], "CUTGAM",1.E-5) ; - gMC->Gstpar(idtmed[715], "CUTELE",1.E-5) ; - gMC->Gstpar(idtmed[715], "CUTNEU",1.E-5) ; - gMC->Gstpar(idtmed[715], "CUTHAD",1.E-5) ; - gMC->Gstpar(idtmed[715], "CUTMUO",1.E-5) ; - gMC->Gstpar(idtmed[715], "BCUTE",1.E-5) ; - gMC->Gstpar(idtmed[715], "BCUTM",1.E-5) ; - gMC->Gstpar(idtmed[715], "DCUTE",1.E-5) ; - gMC->Gstpar(idtmed[715], "DCUTM",1.E-5) ; - gMC->Gstpar(idtmed[715], "PPCUTM",1.E-5) ; - gMC->Gstpar(idtmed[715], "LOSS",2.) ; - gMC->Gstpar(idtmed[715], "DRAY",0.) ; - gMC->Gstpar(idtmed[715], "STRA",2.) ; } //____________________________________________________________________________ @@ -423,7 +391,7 @@ void AliPHOS::Digits2Raw() AliError("Energy digitization should be OFF if use Digits2Raw") ; } - AliPHOSLoader * loader = dynamic_cast(fLoader) ; + AliPHOSLoader * loader = static_cast(fLoader) ; // get the digits loader->LoadDigits(); @@ -442,17 +410,23 @@ void AliPHOS::Digits2Raw() } // get mapping from OCDB - const TObjArray* maps = AliPHOSRecoParamEmc::GetMappings(); + const TObjArray* maps = AliPHOSRecoParam::GetMappings(); if(!maps) AliFatal("Cannot retrieve ALTRO mappings!!"); // some digitization constants - const Float_t kThreshold = 0.001; // skip digits below 1 MeV + const Float_t kThreshold = 1.; // skip digits below 1 ADC channel const Int_t kAdcThreshold = 1; // Lower ADC threshold to write to raw data Int_t prevDDL = -1; + if(fgCalibData==0) + fgCalibData= new AliPHOSCalibData(-1) ; + // Create a shaper pulse object AliPHOSPulseGenerator *pulse = new AliPHOSPulseGenerator(); + + //Set Time step of sample + pulse->SetTimeStep(TMath::Abs(fgCalibData->GetSampleTimeStep())) ; Int_t *adcValuesLow = new Int_t[pulse->GetRawFormatTimeBins()]; Int_t *adcValuesHigh= new Int_t[pulse->GetRawFormatTimeBins()]; @@ -473,18 +447,9 @@ void AliPHOS::Digits2Raw() Float_t eMax=-333; //!!!for debug!!! - TObjArray *cpvDigitsAll = new TObjArray(); - TClonesArray *cpvDigitsModule; - Int_t *nCPVdigits = new Int_t[geom->GetNModules()]; - Int_t module; - for (module=0; moduleGetNModules(); module++) { - cpvDigitsAll->Add(new TClonesArray("AliPHOSDigit",100)); - nCPVdigits[module] = 0; - } - // loop over digits (assume ordered digits) for (Int_t iDigit = 0; iDigit < digits->GetEntries(); iDigit++) { - AliPHOSDigit* digit = dynamic_cast(digits->At(iDigit)) ; + AliPHOSDigit* digit = static_cast(digits->At(iDigit)) ; // Skip small energy below treshold if (digit->GetEnergy() < kThreshold) @@ -492,16 +457,7 @@ void AliPHOS::Digits2Raw() Int_t relId[4]; geom->AbsToRelNumbering(digit->GetId(), relId); - module = relId[0]; - - // Fill TObjArray of TClonesArray's with CPV digits per module - if (digit->GetId() > geom->GetNModules() * geom->GetNCristalsInModule()) { - cpvDigitsModule = (TClonesArray*)cpvDigitsAll->At(module-1); - new((*cpvDigitsModule)[nCPVdigits[module-1]++]) - AliPHOSDigit(-1,digit->GetId(),digit->GetAmp(),digit->GetTime()); - continue; - } - + Int_t module = 5-relId[0]; // Begin FIXME if (relId[1] != 0) @@ -510,25 +466,25 @@ void AliPHOS::Digits2Raw() Int_t row = relId[2]-1; Int_t col = relId[3]-1; - + Int_t iRCU = -111; - + //RCU0 - if(0<=row&&row<32 && 0<=col&&col<28) iRCU=0; - + if(0<=row&&row<16 && 0<=col&&col<56) iRCU=0; + //RCU1 - if(0<=row&&row<32 && 28<=col&&col<56) iRCU=1; + if(16<=row&&row<32 && 0<=col&&col<56) iRCU=1; //RCU2 - if(32<=row&&row<64 && 0<=col&&col<28) iRCU=2; + if(32<=row&&row<48 && 0<=col&&col<56) iRCU=2; //RCU3 - if(32<=row&&row<64 && 28<=col&&col<56) iRCU=3; - - + if(48<=row&&row<64 && 0<=col&&col<56) iRCU=3; + + // PHOS EMCA has 4 DDL per module. Splitting is based on the (row,column) numbers. - // PHOS internal convention: 1Getenv("ALICE_ROOT"); - path += "/PHOS/mapping/RCU"; - path += iRCU; - path += ".data"; - - mapping[iDDL] = (AliAltroMapping*)maps->At(iRCU); + mapping[iDDL] = (AliAltroMapping*)maps->At(iDDL); buffer[iDDL] = new AliAltroBuffer(fileName.Data(),mapping[iDDL]); buffer[iDDL]->WriteDataHeader(kTRUE, kFALSE); //Dummy; } @@ -553,7 +504,7 @@ void AliPHOS::Digits2Raw() relId[0]-1,relId[3]-1,relId[2]-1)); // if a signal is out of time range, write only trailer if (digit->GetTimeR() > pulse->GetRawFormatTimeMax()*0.5 ) { - AliInfo("Signal is out of time range.\n"); + AliDebug(2,"Signal is out of time range.\n"); buffer[iDDL]->FillBuffer(0); buffer[iDDL]->FillBuffer(pulse->GetRawFormatTimeBins() ); // time bin buffer[iDDL]->FillBuffer(3); // bunch length @@ -562,25 +513,29 @@ void AliPHOS::Digits2Raw() // calculate the time response function } else { Double_t energy = 0 ; - module = relId[0]; if (digit->GetId() <= geom->GetNModules() * geom->GetNCristalsInModule()) { energy=digit->GetEnergy(); - if(energy>eMax) {eMax=energy; modMax=module; colMax=col; rowMax=row;} + if(energy>eMax) {eMax=energy; modMax=relId[0]; colMax=col; rowMax=row;} } else { energy = 0; // CPV raw data format is now know yet } pulse->SetAmplitude(energy); pulse->SetTZero(digit->GetTimeR()); + Double_t r =fgCalibData->GetHighLowRatioEmc(relId[0],relId[3],relId[2]) ; + pulse->SetHG2LGRatio(r) ; pulse->MakeSamples(); pulse->GetSamples(adcValuesHigh, adcValuesLow) ; + buffer[iDDL]->WriteChannel(relId[3]-1, relId[2]-1, 0, pulse->GetRawFormatTimeBins(), adcValuesLow , kAdcThreshold); buffer[iDDL]->WriteChannel(relId[3]-1, relId[2]-1, 1, pulse->GetRawFormatTimeBins(), adcValuesHigh, kAdcThreshold); } } - + delete [] adcValuesLow; + delete [] adcValuesHigh; + // write real header and close last file for (Int_t iDDL=0; iDDLGetNModules(); module++) { - AliDebug(2,Form("Number of CPV digits in module %d: %d/%d", - module, - ((TClonesArray*)cpvDigitsAll->At(module))->GetEntriesFast(), - nCPVdigits[module])); - } - AliPHOSCpvRawWrite *cpvRaw = new AliPHOSCpvRawWrite(); - cpvRaw->WriteRaw(cpvDigitsAll); - delete cpvRaw; loader->UnloadDigits(); } @@ -635,9 +580,9 @@ void AliPHOS::SetTreeAddress() // Links Hits in the Tree to Hits array TBranch *branch; char branchname[20]; - sprintf(branchname,"%s",GetName()); + snprintf(branchname,20,"%s",GetName()); // Branch address for hit tree - TTree *treeH = TreeH(); + TTree *treeH = fLoader->TreeH(); if (treeH) { branch = treeH->GetBranch(branchname); if (branch) @@ -649,36 +594,52 @@ void AliPHOS::SetTreeAddress() } } -//____________________________________________________________________________ -Bool_t AliPHOS::Raw2SDigits(AliRawReader* rawReader) -{ - - AliPHOSLoader * loader = dynamic_cast(fLoader) ; - - TTree * tree = 0 ; - tree = loader->TreeS() ; - if ( !tree ) { - loader->MakeTree("S"); - tree = loader->TreeS() ; - } +//____________________________________________________________________________ +Bool_t AliPHOS::Raw2SDigits(AliRawReader* rawReader) +{ + + AliPHOSLoader * loader = static_cast(fLoader) ; + + TTree * tree = 0 ; + tree = loader->TreeS() ; + if ( !tree ) { + loader->MakeTree("S"); + tree = loader->TreeS() ; + } + + TClonesArray * sdigits = loader->SDigits() ; + if(!sdigits) { + loader->MakeSDigitsArray(); + sdigits = loader->SDigits(); + } + sdigits->Clear(); + + rawReader->Reset() ; + + const TObjArray* maps = AliPHOSRecoParam::GetMappings(); + if(!maps) AliFatal("Cannot retrieve ALTRO mappings!!"); - TClonesArray * sdigits = loader->SDigits() ; - if(!sdigits) { - loader->MakeSDigitsArray(); - sdigits = loader->SDigits(); + AliAltroMapping *mapping[20]; + for(Int_t i = 0; i < 20; i++) { + mapping[i] = (AliAltroMapping*)maps->At(i); } - sdigits->Clear(); - - AliPHOSRawDecoder dc(rawReader); - AliPHOSRawDigiProducer pr; - pr.MakeDigits(sdigits,&dc); - - Int_t bufferSize = 32000 ; - // TBranch * sdigitsBranch = tree->Branch("PHOS",&sdigits,bufferSize); - tree->Branch("PHOS",&sdigits,bufferSize); - tree->Fill(); - fLoader->WriteSDigits("OVERWRITE"); - return kTRUE; - + AliPHOSRawFitterv0 fitter; + + fitter.SubtractPedestals(AliPHOSSimParam::GetInstance()->EMCSubtractPedestals()); + fitter.SetAmpOffset(AliPHOSSimParam::GetInstance()->GetGlobalAltroOffset()); + fitter.SetAmpThreshold(AliPHOSSimParam::GetInstance()->GetGlobalAltroThreshold()); + + AliPHOSRawDigiProducer pr(rawReader,mapping); + pr.SetSampleQualityCut(AliPHOSSimParam::GetInstance()->GetEMCSampleQualityCut()); + pr.MakeDigits(sdigits,&fitter); + + Int_t bufferSize = 32000 ; + // TBranch * sdigitsBranch = tree->Branch("PHOS",&sdigits,bufferSize); + tree->Branch("PHOS",&sdigits,bufferSize); + tree->Fill(); + + fLoader->WriteSDigits("OVERWRITE"); + return kTRUE; + }