X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PHOS%2FAliPHOS.cxx;h=8c0e9e8fddc460ccdd7e0dbe4b28c7607744d97a;hb=9eba1240a50c2b8189ce37efd18b171d1b45f007;hp=77ea421a601f88c6807aa9777c37a77d52f45d48;hpb=ddd1a39c471ec4732c67dcb333e09d3519ca4012;p=u%2Fmrichter%2FAliRoot.git diff --git a/PHOS/AliPHOS.cxx b/PHOS/AliPHOS.cxx index 77ea421a601..8c0e9e8fddc 100644 --- a/PHOS/AliPHOS.cxx +++ b/PHOS/AliPHOS.cxx @@ -16,6 +16,15 @@ /* History of cvs commits: * * $Log$ + * Revision 1.116 2007/10/10 09:05:10 schutz + * Changing name QualAss to QA + * + * Revision 1.115 2007/08/22 09:20:50 hristov + * Updated QA classes (Yves) + * + * Revision 1.114 2007/08/07 14:12:03 kharlov + * Quality assurance added (Yves Schutz) + * * Revision 1.113 2007/07/18 16:29:54 policheh * Raw Sdigits energy converted to GeV. * @@ -57,20 +66,22 @@ // --- ROOT system --- class TFile; +#include #include -#include -#include +#include #include -#include #include +#include +#include // --- Standard library --- // --- AliRoot header files --- #include "AliMagF.h" #include "AliPHOS.h" -#include "AliPHOSGetter.h" +#include "AliPHOSLoader.h" #include "AliRun.h" +#include "AliRawReader.h" #include "AliPHOSDigitizer.h" #include "AliPHOSSDigitizer.h" #include "AliPHOSDigit.h" @@ -84,14 +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 "AliPHOSQualAssChecker.h" +#include "AliPHOSQAChecker.h" +#include "AliPHOSRecoParam.h" +#include "AliPHOSSimParam.h" ClassImp(AliPHOS) //____________________________________________________________________________ - AliPHOS:: AliPHOS() : AliDetector() + AliPHOS:: AliPHOS() : AliDetector(),fgCalibData(0) { // Default ctor fName = "PHOS" ; @@ -99,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 } @@ -107,12 +122,13 @@ AliPHOS::AliPHOS(const char* name, const char* title): AliDetector(name, title) //____________________________________________________________________________ AliPHOS::~AliPHOS() { + if(fgCalibData) delete fgCalibData ; } //____________________________________________________________________________ -AliDigitizer* AliPHOS::CreateDigitizer(AliRunDigitizer* manager) const +AliDigitizer* AliPHOS::CreateDigitizer(AliDigitizationInput* digInput) const { - return new AliPHOSDigitizer(manager); + return new AliPHOSDigitizer(digInput); } //____________________________________________________________________________ @@ -210,7 +226,8 @@ void AliPHOS::CreateMaterials() Float_t aG10[4] = { 12., 1., 16., 28.} ; Float_t zG10[4] = { 6., 1., 8., 14.} ; Float_t wG10[4] = { .259, .288, .248, .205} ; - Float_t dG10 = 1.7 ; + Float_t dG10 = 1.7 ; + AliMixture(12, "G10$", aG10, zG10, dG10, -4, wG10); @@ -239,7 +256,8 @@ void AliPHOS::CreateMaterials() wArCO[1] = (1-arContent)*1; wArCO[2] = (1-arContent)*2; Float_t dArCO = arContent*dAr + (1-arContent)*dCO ; - AliMixture(16, "ArCO2$", aArCO, zArCO, dArCO, -3, wArCO) ; + AliMixture(16, "ArCO2$", aArCO, zArCO, dArCO, -3, wArCO) ; + // --- Stainless steel (let it be pure iron) --- AliMaterial(17, "Steel$", 55.845, 26, 7.87, 1.76, 0., 0, 0) ; @@ -275,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, @@ -362,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.) ; } //____________________________________________________________________________ @@ -405,7 +387,11 @@ void AliPHOS::Digits2Raw() { // convert digits of the current event to raw data - AliPHOSLoader * loader = dynamic_cast(fLoader) ; + if(AliPHOSSimParam::GetInstance()->IsEDigitizationOn()){ + AliError("Energy digitization should be OFF if use Digits2Raw") ; + } + + AliPHOSLoader * loader = static_cast(fLoader) ; // get the digits loader->LoadDigits(); @@ -423,14 +409,24 @@ void AliPHOS::Digits2Raw() return; } + // get mapping from OCDB + 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()]; @@ -453,12 +449,15 @@ void AliPHOS::Digits2Raw() // 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) continue; + Int_t relId[4]; geom->AbsToRelNumbering(digit->GetId(), relId); - Int_t module = relId[0]; + Int_t module = 5-relId[0]; // Begin FIXME if (relId[1] != 0) @@ -467,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] = new AliCaloAltroMapping(path.Data()); + mapping[iDDL] = (AliAltroMapping*)maps->At(iDDL); buffer[iDDL] = new AliAltroBuffer(fileName.Data(),mapping[iDDL]); buffer[iDDL]->WriteDataHeader(kTRUE, kFALSE); //Dummy; } @@ -510,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 @@ -519,32 +513,36 @@ 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; iDDLFlush(); buffer[iDDL]->WriteDataHeader(kFALSE, kFALSE); delete buffer[iDDL]; - if (mapping[iDDL]) delete mapping[iDDL]; + //if (mapping[iDDL]) delete mapping[iDDL]; } } @@ -562,9 +560,11 @@ void AliPHOS::Hits2SDigits() AliPHOSSDigitizer phosDigitizer(fLoader->GetRunLoader()->GetFileName().Data()) ; phosDigitizer.SetEventRange(0, -1) ; // do all the events - phosDigitizer.ExecuteTask("all") ; + + phosDigitizer.Digitize("all") ; } + //____________________________________________________________________________ AliLoader* AliPHOS::MakeLoader(const char* topfoldername) { @@ -580,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) @@ -594,50 +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!!"); + + AliAltroMapping *mapping[20]; + for(Int_t i = 0; i < 20; i++) { + mapping[i] = (AliAltroMapping*)maps->At(i); } - TClonesArray * sdigits = loader->SDigits() ; - if(!sdigits) { - loader->MakeSDigitsArray(); - sdigits = loader->SDigits(); - } - sdigits->Clear(); - - AliPHOSRawDecoder dc(rawReader); - AliPHOSRawDigiProducer pr; - pr.MakeDigits(sdigits,&dc); - - //ADC counts -> GeV - for(Int_t i=0; iGetEntries(); i++) { - AliPHOSDigit* sdigit = (AliPHOSDigit*)sdigits->At(i); - sdigit->SetEnergy(sdigit->GetEnergy()/AliPHOSPulseGenerator::GeV2ADC()); - } - - Int_t bufferSize = 32000 ; - TBranch * sdigitsBranch = tree->Branch("PHOS",&sdigits,bufferSize); - tree->Fill(); - - fLoader->WriteSDigits("OVERWRITE"); - return kTRUE; - -} - -//____________________________________________________________________________ -void AliPHOS::CheckQA() -{ - // check the Quality Assurance data - - AliPHOSQualAssChecker phosQA ; - phosQA.Exec() ; + 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; + }