X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=VZERO%2FAliVZERODigitizer.cxx;h=f73ebca0faed044f508c817c565205e0dd1ca3a0;hb=4856f48889d91fe66de69ccd2fe2d0f83c84ca0c;hp=67e8bbf311403794de2d4abfb9552feb11ab5980;hpb=2027707981d6b4494be33b69812f99230354cee1;p=u%2Fmrichter%2FAliRoot.git diff --git a/VZERO/AliVZERODigitizer.cxx b/VZERO/AliVZERODigitizer.cxx index 67e8bbf3114..f73ebca0fae 100644 --- a/VZERO/AliVZERODigitizer.cxx +++ b/VZERO/AliVZERODigitizer.cxx @@ -13,6 +13,8 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ +/* $Id$ */ + ///_________________________________________________________________________ /// /// This class constructs Digits out of Hits @@ -22,7 +24,12 @@ // --- Standard library --- // --- ROOT system --- +#include #include +#include +#include +#include +#include // --- AliRoot header files --- #include "AliVZEROConst.h" @@ -43,34 +50,48 @@ ClassImp(AliVZERODigitizer) AliVZERODigitizer::AliVZERODigitizer() + :AliDigitizer(), + fCalibData(GetCalibData()), + fPhotoCathodeEfficiency(0.18), + fPMVoltage(768.0), + fPMGain(TMath::Power((fPMVoltage / 112.5) ,7.04277)), + fNdigits(0), + fDigits(0) + { // default constructor - fNdigits = 0; - fDigits = 0; - - fPhotoCathodeEfficiency = 0.18; - fPMVoltage = 768.0; - fPMGain = TMath::Power((fPMVoltage / 112.5) ,7.04277); +// fNdigits = 0; +// fDigits = 0; +// +// fPhotoCathodeEfficiency = 0.18; +// fPMVoltage = 768.0; +// fPMGain = TMath::Power((fPMVoltage / 112.5) ,7.04277); - fCalibData = GetCalibData(); +// fCalibData = GetCalibData(); } //____________________________________________________________________________ AliVZERODigitizer::AliVZERODigitizer(AliRunDigitizer* manager) - :AliDigitizer(manager) - + :AliDigitizer(manager), + fCalibData(GetCalibData()), + fPhotoCathodeEfficiency(0.18), + fPMVoltage(768.0), + fPMGain(TMath::Power((fPMVoltage / 112.5) ,7.04277)), + fNdigits(0), + fDigits(0) + { // constructor - fNdigits = 0; - fDigits = 0; +// fNdigits = 0; +// fDigits = 0; +// +// fPhotoCathodeEfficiency = 0.18; +// fPMVoltage = 768.0; +// fPMGain = TMath::Power( (fPMVoltage / 112.5) ,7.04277 ); - fPhotoCathodeEfficiency = 0.18; - fPMVoltage = 768.0; - fPMGain = TMath::Power( (fPMVoltage / 112.5) ,7.04277 ); - - fCalibData = GetCalibData(); +// fCalibData = GetCalibData(); } @@ -93,7 +114,10 @@ Bool_t AliVZERODigitizer::Init() // Initialises the Digit array fDigits = new TClonesArray ("AliVZEROdigit", 1000); - + + // TGeoHMatrix *im = AliGeomManager::GetMatrix("VZERO/V0C"); + // im->Print(); + return kTRUE; } @@ -104,11 +128,19 @@ void AliVZERODigitizer::Exec(Option_t* /*option*/) Int_t map[80]; // 48 values on V0C + 32 on V0A Int_t adc[64]; // 32 PMs on V0C + 32 PMs on V0A - Float_t time[80], time2[64], adc_gain[80]; + Float_t time[80], time_ref[80], time2[64]; + Float_t adc_gain[80]; + Float_t adc_pedestal[64],adc_sigma[64]; fNdigits = 0; - Float_t cPM = fPhotoCathodeEfficiency * fPMGain; - - // Retrieval of ADC gain values from local CDB + Float_t PMGain_smeared[64]; + Float_t cPM[80]; + + // Smearing of the PM tubes intrinsic characteristics + + for(Int_t ii=0; ii<64; ii++) { + PMGain_smeared[ii] = gRandom->Gaus(fPMGain, fPMGain/5); } + + // Retrieval of ADC gain values and pedestal information from local CDB // I use only the first 64th values of the calibration array in CDB // as I have no beam burst structure - odd or even beam burst number @@ -116,15 +148,26 @@ void AliVZERODigitizer::Exec(Option_t* /*option*/) // on Ring 3 and Ring 4 in V0C - added to produce ADC outputs // on these rings... - for(Int_t i=0; i<16; i++) { adc_gain[i] = fCalibData->GetGain(i) ; }; + for(Int_t i=0; i<16; i++) { + adc_gain[i] = fCalibData->GetGain(i); + cPM[i] = fPhotoCathodeEfficiency * PMGain_smeared[i];} for(Int_t j=16; j<48; j=j+2) { Int_t i=(j+17)/2; - adc_gain[j] = fCalibData->GetGain(i) ; - adc_gain[j+1] = fCalibData->GetGain(i) ; } - for(Int_t i=48; i<80; i++) { adc_gain[i] = fCalibData->GetGain(i-16) ; } + adc_gain[j] = fCalibData->GetGain(i); + adc_gain[j+1] = fCalibData->GetGain(i); + cPM[j] = fPhotoCathodeEfficiency * PMGain_smeared[i]; + cPM[j+1] = fPhotoCathodeEfficiency * PMGain_smeared[i]; } + + for(Int_t i=48; i<80; i++){ + adc_gain[i] = fCalibData->GetGain(i-16); + cPM[i] = fPhotoCathodeEfficiency * PMGain_smeared[i-16];}; -// for(Int_t i=0; i<80; i++) { printf(" i = %d gain = %f\n\n", i, adc_gain[i] );} + for(Int_t i=0; i<64; i++){ adc_pedestal[i] = fCalibData->GetPedestal(i); + adc_sigma[i] = fCalibData->GetSigma(i); }; + +// for(Int_t i=0; i<64; i++) { printf(" i = %d pedestal = %f sigma = %f \n\n", +// i, adc_pedestal[i], adc_sigma[i] );} AliRunLoader* outRunLoader = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName()); @@ -143,92 +186,99 @@ void AliVZERODigitizer::Exec(Option_t* /*option*/) TTree* treeD = outLoader->TreeD(); Int_t bufsize = 16000; treeD->Branch("VZERODigit", &fDigits, bufsize); - + for (Int_t iInput = 0; iInput < fManager->GetNinputs(); iInput++) { - AliRunLoader* runLoader = - AliRunLoader::GetRunLoader(fManager->GetInputFolderName(iInput)); - AliLoader* loader = runLoader->GetLoader("VZEROLoader"); - if (!loader) { - Error("Exec", "Can not get VZERO Loader for input %d", iInput); - continue;} + AliRunLoader* runLoader = + AliRunLoader::GetRunLoader(fManager->GetInputFolderName(iInput)); + AliLoader* loader = runLoader->GetLoader("VZEROLoader"); + if (!loader) { + Error("Exec", "Can not get VZERO Loader for input %d", iInput); + continue;} - if (!runLoader->GetAliRun()) runLoader->LoadgAlice(); + if (!runLoader->GetAliRun()) runLoader->LoadgAlice(); - AliVZERO* vzero = (AliVZERO*) runLoader->GetAliRun()->GetDetector("VZERO"); - if (!vzero) { - Error("Exec", "No VZERO detector for input %d", iInput); - continue;} + AliVZERO* vzero = (AliVZERO*) runLoader->GetAliRun()->GetDetector("VZERO"); + if (!vzero) { + Error("Exec", "No VZERO detector for input %d", iInput); + continue;} - loader->LoadHits(); - TTree* treeH = loader->TreeH(); - if (!treeH) { - Error("Exec", "Cannot get TreeH for input %d", iInput); - continue; } - - Float_t timeV0 = 1e12; - for(Int_t i=0; i<80; i++) { map[i] = 0; time[i] = 0.0; } + loader->LoadHits(); + TTree* treeH = loader->TreeH(); + if (!treeH) { + Error("Exec", "Cannot get TreeH for input %d", iInput); + continue; } + + for(Int_t i=0; i<80; i++) {map[i] = 0; time[i] = 0.0;} - TClonesArray* hits = vzero->Hits(); + TClonesArray* hits = vzero->Hits(); // Now makes Digits from hits - Int_t nTracks = (Int_t) treeH->GetEntries(); - for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) { - vzero->ResetHits(); - treeH->GetEvent(iTrack); - Int_t nHits = hits->GetEntriesFast(); - for (Int_t iHit = 0; iHit < nHits; iHit++) { - AliVZEROhit* hit = (AliVZEROhit *)hits->UncheckedAt(iHit); - Int_t nPhot = hit->Nphot(); - Int_t cell = hit->Cell(); - map[cell] += nPhot; - Float_t dt_scintillator = gRandom->Gaus(0,0.7); - time[cell] = dt_scintillator + 1e9*hit->Tof(); - if(time[cell] < timeV0) timeV0 = time[cell]; - } // hit loop - } // track loop - - loader->UnloadHits(); + Int_t nTracks = (Int_t) treeH->GetEntries(); + for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) { + for (Int_t i=0; i<80; i++) {time_ref[i] = 999999.0;} + vzero->ResetHits(); + treeH->GetEvent(iTrack); + Int_t nHits = hits->GetEntriesFast(); + for (Int_t iHit = 0; iHit < nHits; iHit++) { + AliVZEROhit* hit = (AliVZEROhit *)hits->UncheckedAt(iHit); + Int_t nPhot = hit->Nphot(); + Int_t cell = hit->Cell(); + map[cell] += nPhot; + Float_t dt_scintillator = gRandom->Gaus(0,0.7); + Float_t t = dt_scintillator + 1e9*hit->Tof(); + if (t > 0.0) { + if(t < time_ref[cell]) time_ref[cell] = t; + time[cell] = TMath::Min(t,time_ref[cell]); } + } // hit loop + } // track loop + + loader->UnloadHits(); } // input loop // Now builds the scintillator cell response (80 cells i.e. 80 responses) for (Int_t i=0; i<80; i++) { - Float_t q1 = Float_t ( map[i] )* cPM * kQe; + Float_t q1 = Float_t ( map[i] )* cPM[i] * kQe; Float_t noise = gRandom->Gaus(10.5,3.22); Float_t pmResponse = q1/kC*TMath::Power(ktheta/kthau,1/(1-ktheta/kthau)) - + noise*1e-3; + + noise*1e-3; map[i] = Int_t( pmResponse * adc_gain[i]); + if(map[i] > (110/2)) {map[i] = Int_t(gRandom->Gaus(map[i], 110/6));} } - - -// Now transforms 80 cell responses into 64 photomultiplier responses + +// Now transforms 80 cell responses into 64 photomultiplier responses +// Also adds the ADC pedestals taken out of the calibration data base - for (Int_t j=0; j<32; j++){ - adc[j] = map [j]; + for (Int_t j=0; j<16; j++){ + adc[j] = static_cast(map [j] + gRandom->Gaus(adc_pedestal[j], adc_sigma[j])); time2[j]= time[j];} for (Int_t j=48; j<80; j++){ - adc[j-16] = map [j]; - time2[j-16]= time[j];} + adc[j-16] = static_cast(map [j] + + gRandom->Gaus(adc_pedestal[j-16],adc_sigma[j-16])); + time2[j-16]= time[j]; } for (Int_t j=0; j<16; j++){ - adc[16+j] = map [16 + 2*j]+ map [16 + 2*j + 1]; - time2[16+j] = TMath::Min(time [16 + 2*j], time [16 + 2*j + 1]);} - + adc[16+j] = static_cast(map [16+2*j]+ map [16+2*j+1] + + gRandom->Gaus(adc_pedestal[16+j], adc_sigma[16+j])); + Float_t min_time = TMath::Min(time [16+2*j],time [16+2*j+1]); + time2[16+j] = min_time; + if(min_time==0.0){time2[16+j]=TMath::Max(time[16+2*j],time[16+2*j+1]);} + } + + // Now add digits to the digit Tree for (Int_t i=0; i<64; i++) { if(adc[i] > 0) { -// printf(" Event, cell, adc, tof = %d %d %d %f\n", -// outRunLoader->GetEventNumber(),i, map[i], time[i]*100.0); -// multiply by 10 to have 100 ps per channel : - AddDigit(i, adc[i], Int_t(time2[i]*10.0) ); - } +// printf(" Event, cell, adc, tof = %d %d %d %f\n", +// outRunLoader->GetEventNumber(),i, map[i], time2[i]*10.0); +// multiply by 10 to have 100 ps per channel : + AddDigit(i, adc[i], Int_t(time2[i]*10.0)) ;} } - - + treeD->Fill(); outLoader->WriteDigits("OVERWRITE"); outLoader->UnloadDigits(); @@ -264,14 +314,14 @@ AliVZEROCalibData* AliVZERODigitizer::GetCalibData() const entry = man->Get("VZERO/Calib/Data"); - if(!entry){ - AliWarning("Load of calibration data from default storage failed!"); - AliWarning("Calibration data will be loaded from local storage ($ALICE_ROOT)"); - Int_t runNumber = man->GetRun(); - entry = man->GetStorage("local://$ALICE_ROOT") - ->Get("VZERO/Calib/Data",runNumber); - - } +// if(!entry){ +// AliWarning("Load of calibration data from default storage failed!"); +// AliWarning("Calibration data will be loaded from local storage ($ALICE_ROOT)"); +// Int_t runNumber = man->GetRun(); +// entry = man->GetStorage("local://$ALICE_ROOT") +// ->Get("VZERO/Calib/Data",runNumber); +// +// } // Retrieval of data in directory VZERO/Calib/Data: @@ -279,7 +329,7 @@ AliVZEROCalibData* AliVZERODigitizer::GetCalibData() const AliVZEROCalibData *calibdata = 0; if (entry) calibdata = (AliVZEROCalibData*) entry->GetObject(); - if (!calibdata) AliError("No calibration data from calibration database !"); + if (!calibdata) AliFatal("No calibration data from calibration database !"); return calibdata;