X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=EMCAL%2FAliEMCAL.cxx;h=b030d72638f9b7d3b837c07ef13c7873c1fa1ac2;hb=a47dc7e49a0e324ed522141089efdb0159cd2523;hp=41f5c7d27b296ec8c8196eb3017294d18cfc3ac3;hpb=00d03c2f009db83fd85a1cdf4b72b16e8ab34df1;p=u%2Fmrichter%2FAliRoot.git diff --git a/EMCAL/AliEMCAL.cxx b/EMCAL/AliEMCAL.cxx index 41f5c7d27b2..b030d72638f 100644 --- a/EMCAL/AliEMCAL.cxx +++ b/EMCAL/AliEMCAL.cxx @@ -14,7 +14,39 @@ **************************************************************************/ /* $Id$ */ - +/* History of cvs commits: + * + * $Log$ + + * Revision 1.54 2007/12/06 10:31:13 hristov + * Bug fix: using the mapping from CDB + * + * Revision 1.53.10.1 2007/12/06 10:29:59 hristov + * Bug fix: using the mapping from CDB + * + * Revision 1.53 2007/03/17 19:56:38 mvl + * Moved signal shape routines from AliEMCAL to separate class AliEMCALRawUtils to streamline raw data reconstruction code. + * + * Revision 1.52 2007/03/10 22:19:01 pavlinov + * move one varibels from AliEMCALv2 to AliEMCAL + * + * Revision 1.51 2007/02/24 20:42:35 pavlinov + * fixed error of Geant3 parameters initialisation + * + * Revision 1.50 2007/02/05 10:43:25 hristov + * Changes for correct initialization of Geant4 (Mihaela) + * + * Revision 1.49 2007/01/22 17:29:12 pavlinov + * EMCAL geometry can be created independently form anything now + * + * Revision 1.48 2006/12/19 02:34:13 pavlinov + * clean up the EMCAL name scheme : super module -> module -> tower (or cell) + * + * Revision 1.47 2006/12/05 17:12:03 gustavo + * Updated AliEMCAL::Digits2Raw, reads first provisional RCU mapping files to make Raw data with new AliCaloAltroMapping and AliCaloRawStream + * + * + */ //_________________________________________________________________________ // Base Class for EMCAL description: // This class contains material definitions @@ -28,12 +60,12 @@ // --- ROOT system --- class TFile; #include -#include -#include +#include +#include #include -#include #include -#include +#include +#include // --- Standard library --- @@ -45,60 +77,134 @@ class TFile; #include "AliEMCALSDigitizer.h" #include "AliEMCALDigitizer.h" #include "AliEMCALDigit.h" -#include "AliAltroBuffer.h" -#include "AliRawReader.h" -#include "AliEMCALRawStream.h" +#include "AliEMCALRawUtils.h" +#include "AliCDBManager.h" +#include "AliCDBEntry.h" ClassImp(AliEMCAL) -Double_t AliEMCAL::fgCapa = 1.; // 1pF -Int_t AliEMCAL::fgOrder = 2 ; -Double_t AliEMCAL::fgTimeMax = 2.56E-5 ; // each sample is over 100 ns fTimeMax/fTimeBins -Double_t AliEMCAL::fgTimePeak = 4.1E-6 ; // 4 micro seconds -Double_t AliEMCAL::fgTimeTrigger = 100E-9 ; // 100ns, just for a reference -// some digitization constants -Int_t AliEMCAL::fgDDLOffset = 0x800; -Int_t AliEMCAL::fgThreshold = 1; -// 24*48=1152 towers per SM; divided up on 3 DDLs, -// each DDL with 12FEC *32towers or 12*32*2 channels (high&low gain) -Int_t AliEMCAL::fgChannelsPerDDL = 768; // 2*(1152/3 or 12*32) - + //____________________________________________________________________________ -AliEMCAL::AliEMCAL():AliDetector() +AliEMCAL::AliEMCAL() + : AliDetector(), + fBirkC0(0), + fBirkC1(0.), + fBirkC2(0.), + fGeometry(0) { // Default ctor fName = "EMCAL" ; + InitConstants(); + + // Should call AliEMCALGeometry::GetInstance(EMCAL->GetTitle(),"") for getting EMCAL geometry } //____________________________________________________________________________ -AliEMCAL::AliEMCAL(const char* name, const char* title): AliDetector(name,title) +AliEMCAL::AliEMCAL(const char* name, const char* title) + : AliDetector(name,title), + fBirkC0(0), + fBirkC1(0.), + fBirkC2(0.), + fGeometry(0) { // ctor : title is used to identify the layout - - fHighCharge = 8.2 ; // adjusted for a high gain range of 5.12 GeV (10 bits) - fHighGain = 6.64 ; - fHighLowGainFactor = 16. ; // adjusted for a low gain range of 82 GeV (10 bits) - fLowGainOffset = 1 ; // offset added to the module id to distinguish high and low gain data + InitConstants(); } //____________________________________________________________________________ AliEMCAL::~AliEMCAL() { - + //dtor } //____________________________________________________________________________ -void AliEMCAL::Copy(AliEMCAL & emcal) const +void AliEMCAL::InitConstants() +{ + //initialize EMCAL values + fBirkC0 = 1; + fBirkC1 = 0.013/1.032; + fBirkC2 = 9.6e-6/(1.032 * 1.032); + } + +//____________________________________________________________________________ +void AliEMCAL::DefineMediumParameters() { - TObject::Copy(emcal) ; - emcal.fHighCharge = fHighCharge ; - emcal.fHighGain = fHighGain ; - emcal.fHighLowGainFactor = fHighLowGainFactor ; - emcal.fLowGainOffset = fLowGainOffset; + // + // EMCAL cuts (Geant3) + // + Int_t * idtmed = fIdtmed->GetArray() - 1599 ; +// --- Set decent energy thresholds for gamma and electron tracking + + // Tracking threshold for photons and electrons in Lead + Float_t cutgam=10.e-5; // 100 kev; + Float_t cutele=10.e-5; // 100 kev; + TString ntmp(GetTitle()); + ntmp.ToUpper(); + if(ntmp.Contains("10KEV")) { + cutele = cutgam = 1.e-5; + } else if(ntmp.Contains("50KEV")) { + cutele = cutgam = 5.e-5; + } else if(ntmp.Contains("100KEV")) { + cutele = cutgam = 1.e-4; + } else if(ntmp.Contains("200KEV")) { + cutele = cutgam = 2.e-4; + } else if(ntmp.Contains("500KEV")) { + cutele = cutgam = 5.e-4; + } + + gMC->Gstpar(idtmed[1600],"CUTGAM", cutgam); + gMC->Gstpar(idtmed[1600],"CUTELE", cutele); // 1MEV -> 0.1MEV; 15-aug-05 + gMC->Gstpar(idtmed[1600],"BCUTE", cutgam); // BCUTE and BCUTM start from GUTGUM + gMC->Gstpar(idtmed[1600],"BCUTM", cutgam); // BCUTE and BCUTM start from GUTGUM + // --- Generate explicitly delta rays in Lead --- + gMC->Gstpar(idtmed[1600], "LOSS", 3) ; + gMC->Gstpar(idtmed[1600], "DRAY", 1) ; + gMC->Gstpar(idtmed[1600], "DCUTE", cutele) ; + gMC->Gstpar(idtmed[1600], "DCUTM", cutele) ; + +// --- in aluminium parts --- + gMC->Gstpar(idtmed[1602],"CUTGAM", cutgam) ; + gMC->Gstpar(idtmed[1602],"CUTELE", cutele) ; + gMC->Gstpar(idtmed[1602],"BCUTE", cutgam); // BCUTE and BCUTM start from GUTGUM + gMC->Gstpar(idtmed[1602],"BCUTM", cutgam); // BCUTE and BCUTM start from GUTGUM + gMC->Gstpar(idtmed[1602], "LOSS",3.) ; + gMC->Gstpar(idtmed[1602], "DRAY",1.) ; + gMC->Gstpar(idtmed[1602], "DCUTE", cutele) ; + gMC->Gstpar(idtmed[1602], "DCUTM", cutele) ; + +// --- and finally thresholds for photons and electrons in the scintillator --- + gMC->Gstpar(idtmed[1601],"CUTGAM", cutgam) ; + gMC->Gstpar(idtmed[1601],"CUTELE", cutele) ;// 1MEV -> 0.1MEV; 15-aug-05 + gMC->Gstpar(idtmed[1601],"BCUTE", cutgam); // BCUTE and BCUTM start from GUTGUM + gMC->Gstpar(idtmed[1601],"BCUTM", cutgam); // BCUTE and BCUTM start from GUTGUM + gMC->Gstpar(idtmed[1601], "LOSS",3) ; // generate delta rays + gMC->Gstpar(idtmed[1601], "DRAY",1) ; + gMC->Gstpar(idtmed[1601], "DCUTE", cutele) ; + gMC->Gstpar(idtmed[1601], "DCUTM", cutele) ; + + // S steel - + gMC->Gstpar(idtmed[1603],"CUTGAM", cutgam); + gMC->Gstpar(idtmed[1603],"CUTELE", cutele); + gMC->Gstpar(idtmed[1603],"BCUTE", cutgam); // BCUTE and BCUTM start from GUTGUM + gMC->Gstpar(idtmed[1603],"BCUTM", cutgam); // BCUTE and BCUTM start from GUTGUM + // --- Generate explicitly delta rays + gMC->Gstpar(idtmed[1603], "LOSS",3); + gMC->Gstpar(idtmed[1603], "DRAY",1); + gMC->Gstpar(idtmed[1603], "DCUTE", cutele) ; + gMC->Gstpar(idtmed[1603], "DCUTM", cutele) ; + + AliEMCALGeometry* geom = GetGeometry(); + if(geom->GetILOSS()>=0) { + for(int i=1600; i<=1603; i++) gMC->Gstpar(idtmed[i], "LOSS", geom->GetILOSS()) ; + } + if(geom->GetIHADR()>=0) { + for(int i=1600; i<=1603; i++) gMC->Gstpar(idtmed[i], "HADR", geom->GetIHADR()) ; + } } //____________________________________________________________________________ AliDigitizer* AliEMCAL::CreateDigitizer(AliRunDigitizer* manager) const { + //create and return the digitizer return new AliEMCALDigitizer(manager); } @@ -107,7 +213,6 @@ void AliEMCAL::CreateMaterials() { // Definitions of materials to build EMCAL and associated tracking media. // media number in idtmed are 1599 to 1698. - // --- Air --- Float_t aAir[4]={12.0107,14.0067,15.9994,39.948}; Float_t zAir[4]={6.,7.,8.,18.}; @@ -140,9 +245,8 @@ void AliEMCAL::CreateMaterials() // DEFINITION OF THE TRACKING MEDIA // for EMCAL: idtmed[1599->1698] equivalent to fIdtmed[0->100] - Int_t * idtmed = fIdtmed->GetArray() - 1599 ; - 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() ; // Air -> idtmed[1599] AliMedium(0, "Air$", 0, 0, @@ -154,8 +258,9 @@ void AliEMCAL::CreateMaterials() isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ; // The scintillator of the CPV made of Polystyrene scintillator -> idtmed[1601] + float deemax = 0.1; // maximum fractional energy loss in one step (0 < DEEMAX < deemax ) AliMedium(2, "Scintillator$", 2, 1, - isxfld, sxmgmx, 10.0, 0.001, 0.1, 0.001, 0.001, 0, 0) ; + isxfld, sxmgmx, 10.0, 0.001, deemax, 0.001, 0.001, 0, 0) ; // Various Aluminium parts made of Al -> idtmed[1602] AliMedium(3, "Al$", 3, 0, @@ -165,325 +270,22 @@ void AliEMCAL::CreateMaterials() AliMedium(4, "S steel$", 4, 0, isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.001, 0.001, 0, 0) ; -// --- Set decent energy thresholds for gamma and electron tracking - - // Tracking threshold for photons and electrons in Lead - Float_t cutgam=10.e-5; // 100 kev; - Float_t cutele=10.e-5; // 100 kev; - TString ntmp(GetTitle()); - ntmp.ToUpper(); - if(ntmp.Contains("10KEV")) { - cutele = cutgam = 1.e-5; - } else if(ntmp.Contains("50KEV")) { - cutele = cutgam = 5.e-5; - } else if(ntmp.Contains("100KEV")) { - cutele = cutgam = 1.e-4; - } else if(ntmp.Contains("200KEV")) { - cutele = cutgam = 2.e-4; - } else if(ntmp.Contains("500KEV")) { - cutele = cutgam = 5.e-4; - } - - gMC->Gstpar(idtmed[1600],"CUTGAM", cutgam); - gMC->Gstpar(idtmed[1600],"CUTELE", cutele); // 1MEV -> 0.1MEV; 15-aug-05 - gMC->Gstpar(idtmed[1600],"BCUTE", cutgam); // BCUTE and BCUTM start from GUTGUM - gMC->Gstpar(idtmed[1600],"BCUTM", cutgam); // BCUTE and BCUTM start from GUTGUM - // --- Generate explicitly delta rays in Lead --- - gMC->Gstpar(idtmed[1600], "LOSS",3.) ; - gMC->Gstpar(idtmed[1600], "DRAY",1.) ; - gMC->Gstpar(idtmed[1600], "DCUTE", cutele) ; - gMC->Gstpar(idtmed[1600], "DCUTM", cutele) ; - -// --- in aluminium parts --- - gMC->Gstpar(idtmed[1602],"CUTGAM", cutgam) ; - gMC->Gstpar(idtmed[1602],"CUTELE", cutele) ; - gMC->Gstpar(idtmed[1602],"BCUTE", cutgam); // BCUTE and BCUTM start from GUTGUM - gMC->Gstpar(idtmed[1602],"BCUTM", cutgam); // BCUTE and BCUTM start from GUTGUM - gMC->Gstpar(idtmed[1602], "LOSS",3.) ; - gMC->Gstpar(idtmed[1602], "DRAY",1.) ; - gMC->Gstpar(idtmed[1602], "DCUTE", cutele) ; - gMC->Gstpar(idtmed[1602], "DCUTM", cutele) ; - -// --- and finally thresholds for photons and electrons in the scintillator --- - gMC->Gstpar(idtmed[1601],"CUTGAM", cutgam) ; - gMC->Gstpar(idtmed[1601],"CUTELE", cutele) ;// 1MEV -> 0.1MEV; 15-aug-05 - gMC->Gstpar(idtmed[1601],"BCUTE", cutgam); // BCUTE and BCUTM start from GUTGUM - gMC->Gstpar(idtmed[1601],"BCUTM", cutgam); // BCUTE and BCUTM start from GUTGUM - gMC->Gstpar(idtmed[1601], "LOSS",3.) ; // generate delta rays - gMC->Gstpar(idtmed[1601], "DRAY",1.) ; - gMC->Gstpar(idtmed[1601], "DCUTE", cutele) ; - gMC->Gstpar(idtmed[1601], "DCUTM", cutele) ; - - // S steel - - gMC->Gstpar(idtmed[1603],"CUTGAM", cutgam); - gMC->Gstpar(idtmed[1603],"CUTELE", cutele); - gMC->Gstpar(idtmed[1603],"BCUTE", cutgam); // BCUTE and BCUTM start from GUTGUM - gMC->Gstpar(idtmed[1603],"BCUTM", cutgam); // BCUTE and BCUTM start from GUTGUM - // --- Generate explicitly delta rays - gMC->Gstpar(idtmed[1603], "LOSS",3.); - gMC->Gstpar(idtmed[1603], "DRAY",1.); - gMC->Gstpar(idtmed[1603], "DCUTE", cutele) ; - gMC->Gstpar(idtmed[1603], "DCUTM", cutele) ; //set constants for Birk's Law implentation fBirkC0 = 1; fBirkC1 = 0.013/dP; fBirkC2 = 9.6e-6/(dP * dP); + // Call just in case of Geant3; What to do in case of Geant4 ? + if(gMC->InheritsFrom("TGeant3")) DefineMediumParameters(); // Feb 20, 2007 } - -//____________________________________________________________________________ -void AliEMCAL::Digits2Raw() -{ - // convert digits of the current event to raw data - AliEMCALLoader * loader = dynamic_cast(fLoader) ; - - // get the digits - loader->LoadDigits("EMCAL"); - TClonesArray* digits = loader->Digits() ; - - if (!digits) { - Error("Digits2Raw", "no digits found !"); - return; - } - - // get the digitizer - loader->LoadDigitizer(); - AliEMCALDigitizer * digitizer = dynamic_cast(loader->Digitizer()) ; - - - AliAltroBuffer* buffer = NULL; - Int_t prevDDL = -1; - Int_t adcValuesLow[fkTimeBins]; - Int_t adcValuesHigh[fkTimeBins]; - - // loop over digits (assume ordered digits) - for (Int_t iDigit = 0; iDigit < digits->GetEntries(); iDigit++) { - AliEMCALDigit* digit = dynamic_cast(digits->At(iDigit)) ; - if (digit->GetAmp() < fgThreshold) - continue; - Int_t iDDL = digit->GetId() / fgChannelsPerDDL ; - // for each DDL id is numbered from 1 to fgChannelsperDDL -1 - Int_t idDDL = digit->GetId() - iDDL * ( fgChannelsPerDDL - 1 ) ; - // new DDL - if (iDDL != prevDDL) { - // write real header and close previous file - if (buffer) { - buffer->Flush(); - buffer->WriteDataHeader(kFALSE, kFALSE); - delete buffer; - } - - // open new file and write dummy header - TString fileName("EMCAL_") ; - fileName += (iDDL + fgDDLOffset) ; - fileName += ".ddl" ; - buffer = new AliAltroBuffer(fileName.Data(), 1); - buffer->WriteDataHeader(kTRUE, kFALSE); //Dummy; - - prevDDL = iDDL; - } - - // out of time range signal (?) - if (digit->GetTimeR() > GetRawFormatTimeMax() ) { - buffer->FillBuffer(digit->GetAmp()); - buffer->FillBuffer(GetRawFormatTimeBins() ); // time bin - buffer->FillBuffer(3); // bunch length - buffer->WriteTrailer(3, idDDL, 0, 0); // trailer - - // calculate the time response function - } else { - Double_t energy = 0 ; - energy = digit->GetAmp() * digitizer->GetECAchannel() + digitizer->GetECApedestal() ; - - Bool_t lowgain = RawSampledResponse(digit->GetTimeR(), energy, adcValuesHigh, adcValuesLow) ; - - if (lowgain) - buffer->WriteChannel(iDDL, 0, fLowGainOffset, - GetRawFormatTimeBins(), adcValuesLow, fgThreshold); - else - buffer->WriteChannel(iDDL, 0, 0, - GetRawFormatTimeBins(), adcValuesHigh, fgThreshold); - - } - } - - // write real header and close last file - if (buffer) { - buffer->Flush(); - buffer->WriteDataHeader(kFALSE, kFALSE); - delete buffer; - } - - loader->UnloadDigits(); -} - //____________________________________________________________________________ -void AliEMCAL::Raw2Digits(AliRawReader* reader) -{ - // convert raw data of the current event to digits - GetGeometry(); - AliEMCALLoader * loader = dynamic_cast(fLoader) ; - - // get the digits - loader->CleanDigits(); // start from scratch - loader->LoadDigits("EMCAL"); - TClonesArray* digits = loader->Digits() ; - digits->Clear(); // yes, this is perhaps somewhat paranoid.. [clearing an extra time] - - if (!digits) { - Error("Raw2Digits", "no digits found !"); - return; - } - if (!reader) { - Error("Raw2Digits", "no raw reader found !"); - return; - } - - // and get the digitizer too - loader->LoadDigitizer(); - AliEMCALDigitizer * digitizer = dynamic_cast(loader->Digitizer()) ; - - // Use AliAltroRawStream to read the ALTRO format. No need to - // reinvent the wheel :-) - AliEMCALRawStream in(reader); - // Select EMCAL DDL's; lowest 8 bits of DDL offser is used for something else.. - reader->Select(fgDDLOffset >> 8); +void AliEMCAL::Digits2Raw() { - // reading is from previously existing AliEMCALGetter.cxx - // ReadRaw method - Bool_t first = kTRUE ; - - TF1 * signalF = new TF1("signal", RawResponseFunction, 0, GetRawFormatTimeMax(), 4); - signalF->SetParNames("Charge", "Gain", "Amplitude", "TimeZero"); - - Int_t id = -1; - Bool_t lowGainFlag = kFALSE ; - - Int_t idigit = 0 ; - Int_t amp = 0 ; - Double_t time = 0. ; - Double_t energy = 0. ; - - TGraph * gLowGain = new TGraph(GetRawFormatTimeBins()) ; - TGraph * gHighGain= new TGraph(GetRawFormatTimeBins()) ; - - while ( in.Next() ) { // EMCAL entries loop - if ( in.IsNewId() ) { - if (!first) { - FitRaw(lowGainFlag, gLowGain, gHighGain, signalF, energy, time) ; - - if (time == 0. && energy == 0.) { - amp = 0 ; - } - else { - amp = static_cast( (energy - digitizer->GetECApedestal()) / digitizer->GetECAchannel() + 0.5 ) ; - } - - if (amp > 0) { - new((*digits)[idigit]) AliEMCALDigit( -1, -1, id, amp, time) ; - idigit++ ; - } - Int_t index ; - for (index = 0; index < GetRawFormatTimeBins(); index++) { - gLowGain->SetPoint(index, index * GetRawFormatTimeMax() / GetRawFormatTimeBins(), 0) ; - gHighGain->SetPoint(index, index * GetRawFormatTimeMax() / GetRawFormatTimeBins(), 0) ; - } - } // not first - first = kFALSE ; - id = in.GetId() ; - if (in.GetModule() == GetRawFormatLowGainOffset() ) { - lowGainFlag = kTRUE ; - } - else { - lowGainFlag = kFALSE ; - } - } // new Id? - if (lowGainFlag) { - gLowGain->SetPoint(in.GetTime(), - in.GetTime()* GetRawFormatTimeMax() / GetRawFormatTimeBins(), - in.GetSignal()) ; - } - else { - gHighGain->SetPoint(in.GetTime(), - in.GetTime() * GetRawFormatTimeMax() / GetRawFormatTimeBins(), - in.GetSignal() ) ; - } - } // EMCAL entries loop - digits->Sort() ; - - delete signalF ; - delete gLowGain; - delete gHighGain ; - - return ; -} + static AliEMCALRawUtils rawUtils; + rawUtils.Digits2Raw(); -//____________________________________________________________________________ -void AliEMCAL::FitRaw(Bool_t lowGainFlag, TGraph * gLowGain, TGraph * gHighGain, TF1* signalF, Double_t & energy, Double_t & time) -{ - // Fits the raw signal time distribution; from AliEMCALGetter - - const Int_t kNoiseThreshold = 0 ; - Double_t timezero1 = 0., timezero2 = 0., timemax = 0. ; - Double_t signal = 0., signalmax = 0. ; - energy = time = 0. ; - - if (lowGainFlag) { - timezero1 = timezero2 = signalmax = timemax = 0. ; - signalF->FixParameter(0, GetRawFormatLowCharge()) ; - signalF->FixParameter(1, GetRawFormatLowGain()) ; - Int_t index ; - for (index = 0; index < GetRawFormatTimeBins(); index++) { - gLowGain->GetPoint(index, time, signal) ; - if (signal > kNoiseThreshold && timezero1 == 0.) - timezero1 = time ; - if (signal <= kNoiseThreshold && timezero1 > 0. && timezero2 == 0.) - timezero2 = time ; - if (signal > signalmax) { - signalmax = signal ; - timemax = time ; - } - } - signalmax /= RawResponseFunctionMax(GetRawFormatLowCharge(), - GetRawFormatLowGain()) ; - if ( timezero1 + GetRawFormatTimePeak() < GetRawFormatTimeMax() * 0.4 ) { // else its noise - signalF->SetParameter(2, signalmax) ; - signalF->SetParameter(3, timezero1) ; - gLowGain->Fit(signalF, "QRON", "", 0., timezero2); //, "QRON") ; - energy = signalF->GetParameter(2) ; - time = signalF->GetMaximumX() - GetRawFormatTimePeak() - GetRawFormatTimeTrigger() ; - } - } else { - timezero1 = timezero2 = signalmax = timemax = 0. ; - signalF->FixParameter(0, GetRawFormatHighCharge()) ; - signalF->FixParameter(1, GetRawFormatHighGain()) ; - Int_t index ; - for (index = 0; index < GetRawFormatTimeBins(); index++) { - gHighGain->GetPoint(index, time, signal) ; - if (signal > kNoiseThreshold && timezero1 == 0.) - timezero1 = time ; - if (signal <= kNoiseThreshold && timezero1 > 0. && timezero2 == 0.) - timezero2 = time ; - if (signal > signalmax) { - signalmax = signal ; - timemax = time ; - } - } - signalmax /= RawResponseFunctionMax(GetRawFormatHighCharge(), - GetRawFormatHighGain()) ;; - if ( timezero1 + GetRawFormatTimePeak() < GetRawFormatTimeMax() * 0.4 ) { // else its noise - signalF->SetParameter(2, signalmax) ; - signalF->SetParameter(3, timezero1) ; - gHighGain->Fit(signalF, "QRON", "", 0., timezero2) ; - energy = signalF->GetParameter(2) ; - time = signalF->GetMaximumX() - GetRawFormatTimePeak() - GetRawFormatTimeTrigger() ; - } - } - - return; } - //____________________________________________________________________________ void AliEMCAL::Hits2SDigits() { @@ -504,70 +306,3 @@ AliLoader* AliEMCAL::MakeLoader(const char* topfoldername) fLoader = new AliEMCALLoader(GetName(),topfoldername); return fLoader; } - -//__________________________________________________________________ -Double_t AliEMCAL::RawResponseFunction(Double_t *x, Double_t *par) -{ - // Shape of the electronics raw reponse: - // It is a semi-gaussian, 2nd order Gamma function of the general form - // v(t) = n**n * Q * A**n / C *(t/tp)**n * exp(-n * t/tp) with - // tp : peaking time par[0] - // n : order of the function - // C : integrating capacitor in the preamplifier - // A : open loop gain of the preamplifier - // Q : the total APD charge to be measured Q = C * energy - - Double_t signal ; - Double_t xx = x[0] - ( fgTimeTrigger + par[3] ) ; - - if (xx < 0 || xx > fgTimeMax) - signal = 0. ; - else { - Double_t fac = par[0] * TMath::Power(fgOrder, fgOrder) * TMath::Power(par[1], fgOrder) / fgCapa ; - signal = fac * par[2] * TMath::Power(xx / fgTimePeak, fgOrder) * TMath::Exp(-fgOrder * (xx / fgTimePeak)) ; - } - return signal ; -} - -//__________________________________________________________________ -Double_t AliEMCAL::RawResponseFunctionMax(Double_t charge, Double_t gain) -{ - return ( charge * TMath::Power(fgOrder, fgOrder) * TMath::Power(gain, fgOrder) - / ( fgCapa * TMath::Exp(fgOrder) ) ); - -} -//__________________________________________________________________ -Bool_t AliEMCAL::RawSampledResponse( -const Double_t dtime, const Double_t damp, Int_t * adcH, Int_t * adcL) const -{ - // for a start time dtime and an amplitude damp given by digit, - // calculates the raw sampled response AliEMCAL::RawResponseFunction - - const Int_t kRawSignalOverflow = 0x3FF ; - Bool_t lowGain = kFALSE ; - - TF1 signalF("signal", RawResponseFunction, 0, GetRawFormatTimeMax(), 4); - - for (Int_t iTime = 0; iTime < GetRawFormatTimeBins(); iTime++) { - signalF.SetParameter(0, GetRawFormatHighCharge() ) ; - signalF.SetParameter(1, GetRawFormatHighGain() ) ; - signalF.SetParameter(2, damp) ; - signalF.SetParameter(3, dtime) ; - Double_t time = iTime * GetRawFormatTimeMax() / GetRawFormatTimeBins() ; - Double_t signal = signalF.Eval(time) ; - if ( static_cast(signal+0.5) > kRawSignalOverflow ){ // larger than 10 bits - signal = kRawSignalOverflow ; - lowGain = kTRUE ; - } - adcH[iTime] = static_cast(signal + 0.5) ; - - signalF.SetParameter(0, GetRawFormatLowCharge() ) ; - signalF.SetParameter(1, GetRawFormatLowGain() ) ; - signal = signalF.Eval(time) ; - if ( static_cast(signal+0.5) > kRawSignalOverflow) // larger than 10 bits - signal = kRawSignalOverflow ; - adcL[iTime] = static_cast(0.5 + signal ) ; - - } - return lowGain ; -}