X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TOF%2FAliTOFSDigitizer.cxx;h=e1a02e1e80d5000fbb898b9d10a6547380dec9e4;hb=877fbac6bfb3e4bbfb9c5d66d9ecab028c84d3f8;hp=676cf598b12649e0f63a09bba705215108ee826d;hpb=7e6dce66e285ffae5d5e06a8575cf5e8bb9ac90e;p=u%2Fmrichter%2FAliRoot.git diff --git a/TOF/AliTOFSDigitizer.cxx b/TOF/AliTOFSDigitizer.cxx index 676cf598b12..e1a02e1e80d 100644 --- a/TOF/AliTOFSDigitizer.cxx +++ b/TOF/AliTOFSDigitizer.cxx @@ -15,68 +15,188 @@ /* $Id$ */ -//_________________________________________________________________________ -// This is a TTask that constructs SDigits out of Hits -// A Summable Digits is the "sum" of all hits in a pad -// Detector response has been simulated via the method -// SimulateDetectorResponse -// -//-- Authors: F. Pierella, A. De Caro -// Use case: see AliTOFhits2sdigits.C macro in the CVS -////////////////////////////////////////////////////////////////////////////// - -#include -#include +//__________________________________________________________// +// // +// This is a TTask that constructs SDigits out of Hits // +// A Summable Digits is the "sum" of all hits in a pad // +// Detector response has been simulated via the method // +// SimulateDetectorResponse // +// // +// -- Authors: F. Pierella, A. De Caro // +// Use case: see AliTOFhits2sdigits.C macro in the CVS // +//__________________________________________________________// #include +#include #include #include -#include -#include #include -#include -#include -#include #include +#include +#include -#include "AliDetector.h" #include "AliLoader.h" -#include "AliRun.h" +#include "AliLog.h" +#include "AliMC.h" #include "AliRunLoader.h" -#include "AliTOF.h" +#include "AliRun.h" + #include "AliTOFGeometry.h" #include "AliTOFHitMap.h" -#include "AliTOFSDigit.h" -#include "AliTOFSDigitizer.h" -#include "AliTOFhit.h" #include "AliTOFhitT0.h" -#include "AliMC.h" +#include "AliTOFhit.h" +#include "AliTOFSDigitizer.h" +#include "AliTOFSDigit.h" +#include "AliTOF.h" + +extern TROOT *gROOT; ClassImp(AliTOFSDigitizer) //____________________________________________________________________________ - AliTOFSDigitizer::AliTOFSDigitizer():TTask("TOFSDigitizer","") +AliTOFSDigitizer::AliTOFSDigitizer(): + TTask("TOFSDigitizer",""), + fEvent1(-1), + fEvent2(-1), + ftail(0x0), + fHeadersFile(""), + fRunLoader(0x0), + fTOFLoader(0x0), + fSelectedSector(-1), + fSelectedPlate(-1), + fTimeResolution(0), + fpadefficiency(0), + fEdgeEffect(-1), + fEdgeTails(-1), + fHparameter(0), + fH2parameter(0), + fKparameter(0), + fK2parameter(0), + fEffCenter(0), + fEffBoundary(0), + fEff2Boundary(0), + fEff3Boundary(0), + fAddTRes(0), + fResCenter(0), + fResBoundary(0), + fResSlope(0), + fTimeWalkCenter(0), + fTimeWalkBoundary(0), + fTimeWalkSlope(0), + fTimeDelayFlag(-1), + fPulseHeightSlope(0), + fTimeDelaySlope(0), + fMinimumCharge(0), + fChargeSmearing(0), + fLogChargeSmearing(0), + fTimeSmearing(0), + fAverageTimeFlag(-1), + fAdcBin(0), + fAdcMean(0), + fAdcRms(0) { // ctor +} + +//------------------------------------------------------------------------ +AliTOFSDigitizer::AliTOFSDigitizer(const AliTOFSDigitizer &source): + TTask(source), + fEvent1(-1), + fEvent2(-1), + ftail(0x0), + fHeadersFile(""), + fRunLoader(0x0), + fTOFLoader(0x0), + fSelectedSector(-1), + fSelectedPlate(-1), + fTimeResolution(0), + fpadefficiency(0), + fEdgeEffect(-1), + fEdgeTails(-1), + fHparameter(0), + fH2parameter(0), + fKparameter(0), + fK2parameter(0), + fEffCenter(0), + fEffBoundary(0), + fEff2Boundary(0), + fEff3Boundary(0), + fAddTRes(0), + fResCenter(0), + fResBoundary(0), + fResSlope(0), + fTimeWalkCenter(0), + fTimeWalkBoundary(0), + fTimeWalkSlope(0), + fTimeDelayFlag(-1), + fPulseHeightSlope(0), + fTimeDelaySlope(0), + fMinimumCharge(0), + fChargeSmearing(0), + fLogChargeSmearing(0), + fTimeSmearing(0), + fAverageTimeFlag(-1), + fAdcBin(0), + fAdcMean(0), + fAdcRms(0) +{ + // copy constructor + //this->fTOFGeometry=source.fTOFGeometry; + +} - fRunLoader = 0; - fTOFLoader = 0; +//____________________________________________________________________________ +AliTOFSDigitizer& AliTOFSDigitizer::operator=(const AliTOFSDigitizer &/*source*/) +{ + // ass. op. + return *this; - fEvent1 = 0; - fEvent2 = 0; - ftail = 0; - fSelectedSector = -1; - fSelectedPlate = -1; } //____________________________________________________________________________ -AliTOFSDigitizer::AliTOFSDigitizer(const char* HeaderFile, Int_t evNumber1, Int_t nEvents):TTask("TOFSDigitizer","") +AliTOFSDigitizer::AliTOFSDigitizer(const char* HeaderFile, Int_t evNumber1, Int_t nEvents): + TTask("TOFSDigitizer",""), + fEvent1(-1), + fEvent2(-1), + ftail(0x0), + fHeadersFile(HeaderFile), // input filename (with hits) + fRunLoader(0x0), + fTOFLoader(0x0), + fSelectedSector(-1), // by default we sdigitize all sectors + fSelectedPlate(-1), // by default we sdigitize all plates in all sectors + fTimeResolution(0), + fpadefficiency(0), + fEdgeEffect(-1), + fEdgeTails(-1), + fHparameter(0), + fH2parameter(0), + fKparameter(0), + fK2parameter(0), + fEffCenter(0), + fEffBoundary(0), + fEff2Boundary(0), + fEff3Boundary(0), + fAddTRes(0), + fResCenter(0), + fResBoundary(0), + fResSlope(0), + fTimeWalkCenter(0), + fTimeWalkBoundary(0), + fTimeWalkSlope(0), + fTimeDelayFlag(-1), + fPulseHeightSlope(0), + fTimeDelaySlope(0), + fMinimumCharge(0), + fChargeSmearing(0), + fLogChargeSmearing(0), + fTimeSmearing(0), + fAverageTimeFlag(-1), + fAdcBin(0), + fAdcMean(0), + fAdcRms(0) { - ftail = 0; - fSelectedSector=-1; // by default we sdigitize all sectors - fSelectedPlate =-1; // by default we sdigitize all plates in all sectors + //ctor, reading from input file - fHeadersFile = HeaderFile ; // input filename (with hits) TFile * file = (TFile*) gROOT->GetFile(fHeadersFile.Data()); //File was not opened yet open file and get alirun object @@ -92,10 +212,28 @@ AliTOFSDigitizer::AliTOFSDigitizer(const char* HeaderFile, Int_t evNumber1, Int_ fRunLoader = AliRunLoader::Open(HeaderFile);//open session and mount on default event folder if (fRunLoader == 0x0) { - Fatal("AliTOFSDigitizer","Event is not loaded. Exiting"); + AliFatal("Event is not loaded. Exiting"); return; } + /* + fRunLoader->CdGAFile(); + TDirectory *savedir=gDirectory; + TFile *in=(TFile*)gFile; + + +// when fTOFGeometry was needed + if (!in->IsOpen()) { + AliWarning("Geometry file is not open default TOF geometry will be used"); + fTOFGeometry = new AliTOFGeometry(); + } + else { + in->cd(); + fTOFGeometry = (AliTOFGeometry*)in->Get("TOFgeometry"); + } + + savedir->cd(); + */ if (fRunLoader->TreeE() == 0x0) fRunLoader->LoadHeader(); if (evNumber1>=0) fEvent1 = evNumber1; @@ -106,10 +244,10 @@ AliTOFSDigitizer::AliTOFSDigitizer(const char* HeaderFile, Int_t evNumber1, Int_ else fEvent2 = 1; if (!(fEvent2>fEvent1)) { - cout << " ERROR: fEvent2 = " << fEvent2 << " <= fEvent1 = " << fEvent1 << endl; + AliError(Form("fEvent2 = %d <= fEvent1 = %d", fEvent2, fEvent1)); fEvent1 = 0; fEvent2 = 1; - cout << " Correction: fEvent2 = " << fEvent2 << " <= fEvent1 = " << fEvent1 << endl; + AliError(Form("Correction: fEvent2 = %d <= fEvent1 = %d", fEvent2, fEvent1)); } // init parameters for sdigitization @@ -118,7 +256,7 @@ AliTOFSDigitizer::AliTOFSDigitizer(const char* HeaderFile, Int_t evNumber1, Int_ fTOFLoader = fRunLoader->GetLoader("TOFLoader"); if (fTOFLoader == 0x0) { - Fatal("AliTOFSDigitizer","Can not find TOF loader in event. Exiting."); + AliFatal("Can not find TOF loader in event. Exiting."); return; } fTOFLoader->PostSDigitizer(this); @@ -129,6 +267,7 @@ AliTOFSDigitizer::~AliTOFSDigitizer() { // dtor fTOFLoader->CleanSDigitizer(); + } //____________________________________________________________________________ @@ -148,8 +287,8 @@ void AliTOFSDigitizer::InitParameters() fEffBoundary = 0.65; fEff2Boundary = 0.90; fEff3Boundary = 0.08; - fAddTRes = 68. ; // \sqrt{2x20^2 + 15^2 + 2x10^2 + 30^2 + 50^2} (Pb-Pb) - //fAddTRes = 48. ; // \sqrt{2x20^2 + 15^2 + 2x10^2 + 30^2 + 15^2} (p-p) + fAddTRes = 68. ; // \sqrt{2x20^2 + 15^2 + 2x10^2 + 30^2 + 50^2} (p-p) + //fAddTRes = 48. ; // \sqrt{2x20^2 + 15^2 + 2x10^2 + 30^2 + 15^2} (Pb-Pb) // 30^2+20^2+40^2+50^2+50^2+50^2 = 10400 ps^2 (very old value) fResCenter = 35. ; //50. ; // OLD fResBoundary = 70. ; @@ -166,7 +305,7 @@ void AliTOFSDigitizer::InitParameters() fLogChargeSmearing=0.13; fTimeSmearing =0.022; fAverageTimeFlag=0 ; - fTdcBin = 50.; // 1 TDC bin = 50 ps + fAdcBin = 0.25; // 1 ADC bin = 0.25 pC (or 0.03 pC) fAdcMean = 50.; // ADC distribution mpv value for Landau (in bins) // it corresponds to a mean value of ~100 bins @@ -175,7 +314,7 @@ void AliTOFSDigitizer::InitParameters() } //__________________________________________________________________ -Double_t TimeWithTail(Double_t* x, Double_t* par) +Double_t TimeWithTail(const Double_t * const x, const Double_t * const par) { // sigma - par[0], alpha - par[1], part - par[2] // at xStart("TOFSDigitizer"); @@ -218,20 +356,29 @@ void AliTOFSDigitizer::Exec(Option_t *verboseOption) { AliTOF *tof = (AliTOF *) gAlice->GetDetector("TOF"); if (!tof) { - Error("AliTOFSDigitizer","TOF not found"); + AliError("TOF not found"); return; } fTOFLoader->LoadHits("read"); fTOFLoader->LoadSDigits("recreate"); + + Int_t vol[5]={-1,-1,-1,-1,-1}; // location for a digit + Int_t digit[2]={0,0}; // TOF digit variables + Int_t nselectedHitsinEv=0; + Int_t ntotalsdigitsinEv=0; + Int_t ntotalupdatesinEv=0; + Int_t nnoisesdigitsinEv=0; + Int_t nsignalsdigitsinEv=0; + for (Int_t iEvent=fEvent1; iEventGetEvent(iEvent); - TTree *hitTree = fTOFLoader->TreeH (); + TTree *hitTree = fTOFLoader->TreeH(); if (!hitTree) return; if (fTOFLoader->TreeS () == 0) fTOFLoader->MakeTree ("S"); @@ -250,17 +397,18 @@ void AliTOFSDigitizer::Exec(Option_t *verboseOption) { Int_t version=tof->IsVersion(); - Int_t nselectedHitsinEv=0; - Int_t ntotalsdigitsinEv=0; - Int_t ntotalupdatesinEv=0; - Int_t nnoisesdigitsinEv=0; - Int_t nsignalsdigitsinEv=0; + nselectedHitsinEv=0; + ntotalsdigitsinEv=0; + ntotalupdatesinEv=0; + nnoisesdigitsinEv=0; + nsignalsdigitsinEv=0; TParticle *particle; //AliTOFhit *tofHit; TClonesArray *tofHitArray = tof->Hits(); // create hit map + //AliTOFHitMap *hitMap = new AliTOFHitMap(tof->SDigits(), fTOFGeometry); AliTOFHitMap *hitMap = new AliTOFHitMap(tof->SDigits()); TBranch * tofHitsBranch = hitTree->GetBranch("TOF"); @@ -268,9 +416,12 @@ void AliTOFSDigitizer::Exec(Option_t *verboseOption) { Int_t ntracks = static_cast(hitTree->GetEntries()); for (Int_t track = 0; track < ntracks; track++) { - gAlice->ResetHits(); + gAlice->GetMCApp()->ResetHits(); tofHitsBranch->GetEvent(track); - particle = gAlice->GetMCApp()->Particle(track); + + AliMC *mcApplication = (AliMC*)gAlice->GetMCApp(); + + particle = (TParticle*)mcApplication->Particle(track); Int_t nhits = tofHitArray->GetEntriesFast(); // cleaning all hits of the same track in the same pad volume // it is a rare event, however it happens @@ -283,16 +434,16 @@ void AliTOFSDigitizer::Exec(Option_t *verboseOption) { Int_t previousPadZ =-1; for (Int_t hit = 0; hit < nhits; hit++) { - Int_t vol[5]; // location for a digit - Float_t digit[2]; // TOF digit variables - Int_t tracknum; + for (Int_t aa=0; aa<5;aa++) vol[aa]=-1; // location for a digit + for (Int_t aa=0; aa<2;aa++) digit[aa]=0; // TOF digit variables + Int_t tracknum; Float_t dxPad; Float_t dzPad; Float_t geantTime; // fp: really sorry for this, it is a temporary trick to have // track length too - if(version!=6){ + if (version<6) { //(version!=6 && version!=7) AliTOFhit *tofHit = (AliTOFhit *) tofHitArray->UncheckedAt(hit); tracknum = tofHit->GetTrack(); vol[0] = tofHit->GetSector(); @@ -317,7 +468,13 @@ void AliTOFSDigitizer::Exec(Option_t *verboseOption) { } geantTime *= 1.e+09; // conversion from [s] to [ns] - + // TOF matching window (~200ns) control + if (geantTime>=AliTOFGeometry::MatchingWindow()*1E-3) { + AliDebug(2,Form("Time measurement (%f) greater than the matching window (%f)", + geantTime, AliTOFGeometry::MatchingWindow()*1E-3)); + continue; + } + // selection case for sdigitizing only hits in a given plate of a given sector if(thereIsNotASelection || (vol[0]==fSelectedSector && vol[1]==fSelectedPlate)){ @@ -355,10 +512,17 @@ void AliTOFSDigitizer::Exec(Option_t *verboseOption) { for(Int_t indexOfPad=0; indexOfPad=AliTOFGeometry::MatchingWindow()*1E-3) { + AliDebug(2,Form("Time measurement (%f) greater than the matching window (%f)", + tofAfterSimul[indexOfPad], AliTOFGeometry::MatchingWindow()*1E-3)); + continue; + } + + if(timediff>=0.2) nlargeTofDiff++; // greater than 200ps - if(timediff>=0.2) nlargeTofDiff++; - - digit[0] = (Int_t) ((tofAfterSimul[indexOfPad]*1.e+03)/fTdcBin); // TDC bin number (each bin -> 50. ps) + digit[0] = (Int_t) ((tofAfterSimul[indexOfPad]*1.e+03)/AliTOFGeometry::TdcBinWidth()); // TDC bin number (each bin -> 24.4 ps) Float_t landauFactor = gRandom->Landau(fAdcMean, fAdcRms); digit[1] = (Int_t) (qInduced[indexOfPad] * landauFactor); // ADC bins (each bin -> 0.25 (or 0.03) pC) @@ -374,7 +538,7 @@ void AliTOFSDigitizer::Exec(Option_t *verboseOption) { AliTOFSDigit *sdig = static_cast(hitMap->GetHit(vol)); Int_t tdctime = (Int_t) digit[0]; Int_t adccharge = (Int_t) digit[1]; - sdig->Update(fTdcBin,tdctime,adccharge,tracknum); + sdig->Update(AliTOFGeometry::TdcBinWidth(),tdctime,adccharge,tracknum); ntotalupdatesinEv++; ntotalupdates++; } else { @@ -408,15 +572,14 @@ void AliTOFSDigitizer::Exec(Option_t *verboseOption) { if (tof->SDigits()) tof->ResetSDigits(); - if (strstr(verboseOption,"all")) { - cout << "---------------------------------------- \n"; - cout << " \n"; - cout << "After sdigitizing " << nselectedHitsinEv << " hits" << " in event " << iEvent << endl; + if (strstr(verboseOption,"all") || strstr(verboseOption,"partial")) { + AliDebug(2,"----------------------------------------"); + AliDebug(2,Form("After sdigitizing %d hits in event %d", nselectedHitsinEv, iEvent)); //" (" << nHitsFromPrim << " from primaries and " << nHitsFromSec << " from secondaries) TOF hits, " - cout << ntotalsdigitsinEv << " digits have been created \n"; - cout << "(" << nsignalsdigitsinEv << " due to signals and " << nnoisesdigitsinEv << " due to border effect) \n"; - cout << ntotalupdatesinEv << " total updates of the hit map have been performed in current event \n"; - cout << "---------------------------------------- \n"; + AliDebug(1,Form("%d sdigits have been created", ntotalsdigitsinEv)); + AliDebug(2,Form("(%d due to signals and %d due to border effect)", nsignalsdigitsinEv, nnoisesdigitsinEv)); + AliDebug(2,Form("%d total updates of the hit map have been performed in current event", ntotalupdatesinEv)); + AliDebug(2,"----------------------------------------"); } } //event loop on events @@ -433,28 +596,24 @@ void AliTOFSDigitizer::Exec(Option_t *verboseOption) { } nHitsFromSec=nselectedHits-nHitsFromPrim; - if(strstr(verboseOption,"all")){ - cout << "---------------------------------------- \n"; - cout << "---------------------------------------- \n"; - cout << "-----------SDigitization Summary-------- \n"; - cout << " \n"; - cout << "After sdigitizing " << nselectedHits << " hits \n"; - cout << "in " << (fEvent2-fEvent1) << " events \n"; -//" (" << nHitsFromPrim << " from primaries and " << nHitsFromSec << " from secondaries) TOF hits, " - cout << ntotalsdigits << " sdigits have been created \n"; - cout << "(" << nsignalsdigits << " due to signals and " - << nnoisesdigits << " due to border effect) \n"; - cout << ntotalupdates << " total updates of the hit map have been performed \n"; - cout << "in " << nlargeTofDiff << " cases the time of flight difference is greater than 200 ps \n"; + if (strstr(verboseOption,"all") || strstr(verboseOption,"partial")) { + AliDebug(2,"----------------------------------------"); + AliDebug(2,Form("After sdigitizing %d hits in %d events ", nselectedHits, fEvent2-fEvent1)); + //" (" << nHitsFromPrim << " from primaries and " << nHitsFromSec << " from secondaries) TOF hits, " + AliDebug(2,Form("%d sdigits have been created", ntotalsdigits)); + AliDebug(2,Form("(%d due to signals and %d due to border effect)", nsignalsdigits, nnoisesdigits)); + AliDebug(2,Form("%d total updates of the hit map have been performed", ntotalupdates)); + AliDebug(2,Form("in %d cases the time of flight difference is greater than 200 ps", nlargeTofDiff)); + AliDebug(2,"----------------------------------------"); } if(strstr(verboseOption,"tim") || strstr(verboseOption,"all")){ gBenchmark->Stop("TOFSDigitizer"); - cout << "AliTOFSDigitizer: \n"; - cout << " took " << gBenchmark->GetCpuTime("TOFSDigitizer") << " seconds in order to make sdigits " - << gBenchmark->GetCpuTime("TOFSDigitizer")/(fEvent2-fEvent1) << " seconds per event \n"; - cout << " +++++++++++++++++++++++++++++++++++++++++++++++++++ \n"; + AliInfo("AliTOFSDigitizer:"); + AliInfo(Form(" took %f seconds in order to make sdigits " + "%f seconds per event", gBenchmark->GetCpuTime("TOFSDigitizer"), gBenchmark->GetCpuTime("TOFSDigitizer")/(fEvent2-fEvent1))); + AliInfo(" +++++++++++++++++++++++++++++++++++++++++++++++++++ "); } } @@ -462,23 +621,23 @@ void AliTOFSDigitizer::Exec(Option_t *verboseOption) { //__________________________________________________________________ void AliTOFSDigitizer::Print(Option_t* /*opt*/)const { - cout << "------------------- "<< GetName() << " ------------- \n"; + AliInfo(Form(" ------------------- %s ------------- ", GetName())); } //__________________________________________________________________ void AliTOFSDigitizer::SelectSectorAndPlate(Int_t sector, Int_t plate) { + //Select sector and plate Bool_t isaWrongSelection=(sector < 0) || (sector >= AliTOFGeometry::NSectors()) || (plate < 0) || (plate >= AliTOFGeometry::NPlates()); if(isaWrongSelection){ - cout << "You have selected an invalid value for sector or plate " << endl; - cout << "The correct range for sector is [0,"<< AliTOFGeometry::NSectors()-1 <<"]\n"; - cout << "The correct range for plate is [0,"<< AliTOFGeometry::NPlates()-1 <<"]\n"; - cout << "By default we continue sdigitizing all hits in all plates of all sectors \n"; + AliError("You have selected an invalid value for sector or plate "); + AliError(Form("The correct range for sector is [0,%d]", AliTOFGeometry::NSectors()-1)); + AliError(Form("The correct range for plate is [0,%d]", AliTOFGeometry::NPlates()-1)); + AliError("By default we continue sdigitizing all hits in all plates of all sectors"); } else { fSelectedSector=sector; fSelectedPlate =plate; - cout << "SDigitizing only hits in plate " << fSelectedPlate << " of the sector " - << fSelectedSector << endl; + AliInfo(Form("SDigitizing only hits in plate %d of the sector %d", fSelectedPlate, fSelectedSector)); } } @@ -771,36 +930,36 @@ void AliTOFSDigitizer::PrintParameters()const // // Print parameters used for sdigitization // - cout << " ------------------- "<< GetName() << " -------------" << endl ; - cout << " Parameters used for TOF SDigitization " << endl ; + AliInfo(Form(" ------------------- %s -------------", GetName())); + AliInfo(" Parameters used for TOF SDigitization "); // Printing the parameters - cout << " Number of events: " << (fEvent2-fEvent1) << endl; - cout << " from event " << fEvent1 << " to event " << (fEvent2-1) << endl; - cout << " Time Resolution (ns) "<< fTimeResolution <<" Pad Efficiency: "<< fpadefficiency << endl; - cout << " Edge Effect option: "<< fEdgeEffect<< endl; - - cout << " Boundary Effect Simulation Parameters " << endl; - cout << " Hparameter: "<< fHparameter<<" H2parameter:"<< fH2parameter <<" Kparameter:"<< fKparameter<<" K2parameter: "<< fK2parameter << endl; - cout << " Efficiency in the central region of the pad: "<< fEffCenter << endl; - cout << " Efficiency at the boundary region of the pad: "<< fEffBoundary << endl; - cout << " Efficiency value at H2parameter "<< fEff2Boundary << endl; - cout << " Efficiency value at K2parameter "<< fEff3Boundary << endl; - cout << " Resolution (ps) in the central region of the pad: "<< fResCenter << endl; - cout << " Resolution (ps) at the boundary of the pad : "<< fResBoundary << endl; - cout << " Slope (ps/K) for neighbouring pad : "<< fResSlope <