X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TPC%2FAliTPC.cxx;h=a06c280e3447274b4bb0fd2bcb277280f4682738;hb=7d886edad3da50d64dc5c488d0efb9dc7cf9f39f;hp=0a419aeb6af2f42e68f9ca3e3ea9310b9a8183d7;hpb=051c6d66270632e157a2c5a42b817f10335212c9;p=u%2Fmrichter%2FAliRoot.git diff --git a/TPC/AliTPC.cxx b/TPC/AliTPC.cxx index 0a419aeb6af..a06c280e344 100644 --- a/TPC/AliTPC.cxx +++ b/TPC/AliTPC.cxx @@ -72,42 +72,69 @@ #include "AliTPCTrackHitsV2.h" #include "AliTrackReference.h" #include "AliMC.h" +#include "AliStack.h" #include "AliTPCDigitizer.h" #include "AliTPCBuffer.h" #include "AliTPCDDLRawData.h" #include "AliLog.h" - +#include "AliTPCcalibDB.h" +#include "AliTPCCalPad.h" +#include "AliTPCCalROC.h" +#include "AliTPCExB.h" +#include "AliRawReader.h" +#include "AliTPCRawStream.h" ClassImp(AliTPC) //_____________________________________________________________________________ -AliTPC::AliTPC() + AliTPC::AliTPC():AliDetector(), + fDefaults(0), + fSens(0), + fNsectors(0), + fDigitsArray(0), + fTPCParam(0), + fTrackHits(0), + fHitType(0), + fDigitsSwitch(0), + fSide(0), + fPrimaryIonisation(0), + fNoiseDepth(0), + fNoiseTable(0), + fCurrentNoise(0), + fActiveSectors(0) + + { // // Default constructor // fIshunt = 0; - fHits = 0; - fDigits = 0; - fNsectors = 0; - fDigitsArray = 0; - fDefaults = 0; - fTrackHits = 0; + // fTrackHitsOld = 0; #if ROOT_VERSION_CODE >= ROOT_VERSION(4,0,1) fHitType = 4; // ROOT containers #else fHitType = 2; //default CONTAINERS - based on ROOT structure #endif - fTPCParam = 0; - fNoiseTable = 0; - fActiveSectors =0; - fSens = 0; - } //_____________________________________________________________________________ AliTPC::AliTPC(const char *name, const char *title) - : AliDetector(name,title) + : AliDetector(name,title), + fDefaults(0), + fSens(0), + fNsectors(0), + fDigitsArray(0), + fTPCParam(0), + fTrackHits(0), + fHitType(0), + fDigitsSwitch(0), + fSide(0), + fPrimaryIonisation(0), + fNoiseDepth(0), + fNoiseTable(0), + fCurrentNoise(0), + fActiveSectors(0) + { // // Standard constructor @@ -117,8 +144,6 @@ AliTPC::AliTPC(const char *name, const char *title) // Initialise arrays of hits and digits fHits = new TClonesArray("AliTPChit", 176); gAlice->GetMCApp()->AddHitList(fHits); - fDigitsArray = 0; - fDefaults = 0; // fTrackHits = new AliTPCTrackHitsV2; fTrackHits->SetHitPrecision(0.002); @@ -130,23 +155,20 @@ AliTPC::AliTPC(const char *name, const char *title) //fTrackHitsOld->SetStepPrecision(0.003); //fTrackHitsOld->SetMaxDistance(100); - fNoiseTable =0; #if ROOT_VERSION_CODE >= ROOT_VERSION(4,0,1) fHitType = 4; // ROOT containers #else fHitType = 2; #endif - fActiveSectors = 0; - // - // Initialise counters - fNsectors = 0; + + // fIshunt = 0; // // Initialise color attributes - SetMarkerColor(kYellow); + //PH SetMarkerColor(kYellow); // // Set TPC parameters @@ -159,16 +181,9 @@ AliTPC::AliTPC(const char *name, const char *title) AliWarning("In Config.C you must set non-default parameters."); fTPCParam=0; } - fSens = 0; - } //_____________________________________________________________________________ -AliTPC::AliTPC(const AliTPC& t):AliDetector(t){ - // - // dummy copy constructor - // -} AliTPC::~AliTPC() { // @@ -181,7 +196,10 @@ AliTPC::~AliTPC() delete fTPCParam; delete fTrackHits; //MI 15.09.2000 // delete fTrackHitsOld; //MI 10.12.2001 - if (fNoiseTable) delete [] fNoiseTable; + + fDigitsArray = 0x0; + delete [] fNoiseTable; + delete [] fActiveSectors; } @@ -371,7 +389,7 @@ void AliTPC::CreateMaterials() AliMixture(12,"Ne-CO2-N-1",amat,zmat,density,4,wmat); AliMixture(13,"Ne-CO2-N-2",amat,zmat,density,4,wmat); - + AliMixture(30,"Ne-CO2-N-3",amat,zmat,density,4,wmat); //---------------------------------------------------------------------- // solid materials //---------------------------------------------------------------------- @@ -645,7 +663,7 @@ void AliTPC::CreateMaterials() AliMedium(1, "Ne-CO2-N-1", 12, 0, iSXFLD, sXMGMX, 10., 999.,.1,.001, .001); AliMedium(2, "Ne-CO2-N-2", 13, 1, iSXFLD, sXMGMX, 10., 999.,.1,.001, .001); AliMedium(3,"CO2",10,0, iSXFLD, sXMGMX, 10., 999.,.1, .001, .001); - + AliMedium(20, "Ne-CO2-N-3", 30, 1, iSXFLD, sXMGMX, 10., 999.,.1,.001, .001); //----------------------------------------------------------- // tracking media for solids //----------------------------------------------------------- @@ -712,8 +730,7 @@ void AliTPC::SetActiveSectors(Int_t * sectors, Int_t n) { // activate interesting sectors SetTreeAddress();//just for security - if (fActiveSectors) delete [] fActiveSectors; - fActiveSectors = new Bool_t[fTPCParam->GetNSector()]; + if (!fActiveSectors) fActiveSectors = new Bool_t[fTPCParam->GetNSector()]; for (Int_t i=0;iGetNSector();i++) fActiveSectors[i]=kFALSE; for (Int_t i=0;i=0) && sectors[i]GetNSector()) fActiveSectors[sectors[i]]=kTRUE; @@ -727,8 +744,7 @@ void AliTPC::SetActiveSectors(Int_t flag) //loop over tracks SetTreeAddress();//just for security if (fHitType==0) return; // if Clones hit - not short volume ID information - if (fActiveSectors) delete [] fActiveSectors; - fActiveSectors = new Bool_t[fTPCParam->GetNSector()]; + if (!fActiveSectors) fActiveSectors = new Bool_t[fTPCParam->GetNSector()]; if (flag) { for (Int_t i=0;iGetNSector();i++) fActiveSectors[i]=kTRUE; return; @@ -755,8 +771,17 @@ void AliTPC::SetActiveSectors(Int_t flag) br1->GetEvent(track); br2->GetEvent(track); Int_t *volumes = fTrackHits->GetVolumes(); - for (Int_t j=0;jGetNVolumes(); j++) - fActiveSectors[volumes[j]]=kTRUE; + for (Int_t j=0;jGetNVolumes(); j++) { + if (volumes[j]>-1 && volumes[j]GetNSector()) { + fActiveSectors[volumes[j]]=kTRUE; + } + else { + AliError(Form("Volume %d -> sector number %d is outside (0..%d)", + j, + volumes[j], + fTPCParam->GetNSector())); + } + } } // @@ -780,7 +805,6 @@ void AliTPC::Digits2Raw() // convert digits of the current event to raw data static const Int_t kThreshold = 0; - static const Bool_t kCompress = kTRUE; fLoader->LoadDigits(); TTree* digits = fLoader->TreeD(); @@ -866,14 +890,145 @@ void AliTPC::Digits2Raw() rawWriter.RawData(fileName); gSystem->Unlink(fileName); - if (kCompress) { - AliInfo("Compressing raw data"); - rawWriter.RawDataCompDecompress(kTRUE); - gSystem->Unlink("Statistics"); - } } +//_____________________________________________________________________________ +Bool_t AliTPC::Raw2SDigits(AliRawReader* rawReader){ + // Converts the TPC raw data into summable digits + // The method is used for merging simulated and + // real data events + if (fLoader->TreeS() == 0x0 ) { + fLoader->MakeTree("S"); + } + + if(fDefaults == 0) SetDefaults(); // check if the parameters are set + + //setup TPCDigitsArray + if(GetDigitsArray()) delete GetDigitsArray(); + + AliTPCDigitsArray *arr = new AliTPCDigitsArray; + arr->SetClass("AliSimDigits"); + arr->Setup(fTPCParam); + arr->MakeTree(fLoader->TreeS()); + + SetDigitsArray(arr); + + // set zero suppression to "0" + fTPCParam->SetZeroSup(0); + + // Loop over sectors + const Int_t kmaxTime = fTPCParam->GetMaxTBin(); + const Int_t kNIS = fTPCParam->GetNInnerSector(); + const Int_t kNOS = fTPCParam->GetNOuterSector(); + const Int_t kNS = kNIS + kNOS; + + Short_t** allBins = NULL; //array which contains the data for one sector + + for(Int_t iSector = 0; iSector < kNS; iSector++) { + + Int_t nRows = fTPCParam->GetNRow(iSector); + Int_t nDDLs = 0, indexDDL = 0; + if (iSector < kNIS) { + nDDLs = 2; + indexDDL = iSector * 2; + } + else { + nDDLs = 4; + indexDDL = (iSector-kNIS) * 4 + kNIS * 2; + } + + // Loas the raw data for corresponding DDLs + rawReader->Reset(); + AliTPCRawStream input(rawReader); + rawReader->Select("TPC",indexDDL,indexDDL+nDDLs-1); + + // Alocate and init the array with the sector data + allBins = new Short_t*[nRows]; + for (Int_t iRow = 0; iRow < nRows; iRow++) { + Int_t maxPad = fTPCParam->GetNPads(iSector,iRow); + Int_t maxBin = kmaxTime*maxPad; + allBins[iRow] = new Short_t[maxBin]; + memset(allBins[iRow],0,sizeof(Short_t)*maxBin); + } + + // Begin loop over altro data + while (input.Next()) { + + if (input.GetSector() != iSector) + AliFatal(Form("Sector index mismatch ! Expected (%d), but got (%d) !",iSector,input.GetSector())); + + Int_t iRow = input.GetRow(); + if (iRow < 0 || iRow >= nRows) + AliFatal(Form("Pad-row index (%d) outside the range (%d -> %d) !", + iRow, 0, nRows -1)); + Int_t iPad = input.GetPad(); + + Int_t maxPad = fTPCParam->GetNPads(iSector,iRow); + + if (iPad < 0 || iPad >= maxPad) + AliFatal(Form("Pad index (%d) outside the range (%d -> %d) !", + iPad, 0, maxPad -1)); + + Int_t iTimeBin = input.GetTime(); + if ( iTimeBin < 0 || iTimeBin >= kmaxTime) + AliFatal(Form("Timebin index (%d) outside the range (%d -> %d) !", + iTimeBin, 0, kmaxTime -1)); + + Int_t maxBin = kmaxTime*maxPad; + + if (((iPad*kmaxTime+iTimeBin) >= maxBin) || + ((iPad*kmaxTime+iTimeBin) < 0)) + AliFatal(Form("Index outside the allowed range" + " Sector=%d Row=%d Pad=%d Timebin=%d" + " (Max.index=%d)",iSector,iRow,iPad,iTimeBin,maxBin)); + + allBins[iRow][iPad*kmaxTime+iTimeBin] = input.GetSignal(); + + } // End loop over altro data + + // Now fill the digits array + if (fDigitsArray->GetTree()==0) { + AliFatal("Tree not set in fDigitsArray"); + } + + for (Int_t iRow = 0; iRow < nRows; iRow++) { + AliDigits * dig = fDigitsArray->CreateRow(iSector,iRow); + + Int_t maxPad = fTPCParam->GetNPads(iSector,iRow); + for(Int_t iPad = 0; iPad < maxPad; iPad++) { + for(Int_t iTimeBin = 0; iTimeBin < kmaxTime; iTimeBin++) { + Short_t q = allBins[iRow][iPad*kmaxTime + iTimeBin]; + if (q <= 0) continue; + q *= 16; + dig->SetDigitFast((Short_t)q,iTimeBin,iPad); + } + } + fDigitsArray->StoreRow(iSector,iRow); + Int_t ndig = dig->GetDigitSize(); + + AliDebug(10, + Form("*** Sector, row, compressed digits %d %d %d ***\n", + iSector,iRow,ndig)); + + fDigitsArray->ClearRow(iSector,iRow); + + } // end of the sector digitization + + for (Int_t iRow = 0; iRow < nRows; iRow++) + delete [] allBins[iRow]; + + delete [] allBins; + + } + + fLoader->WriteSDigits("OVERWRITE"); + + if(GetDigitsArray()) delete GetDigitsArray(); + SetDigitsArray(0x0); + + return kTRUE; +} //______________________________________________________________________ AliDigitizer* AliTPC::CreateDigitizer(AliRunDigitizer* manager) const @@ -954,7 +1109,7 @@ void AliTPC::SDigits2Digits2(Int_t /*eventnumber*/) Short_t * pamp1 = digrow->GetDigits(); Int_t * ptracks1 = digrow->GetTracks(); Int_t nelems =nrows*ncols; - Int_t saturation = fTPCParam->GetADCSat(); + Int_t saturation = fTPCParam->GetADCSat() - 1; //use internal structure of the AliDigits - for speed reason //if you cahnge implementation //of the Alidigits - it must be rewriten - @@ -1061,13 +1216,19 @@ void AliTPC::Hits2Digits() // // creates digits from hits // + if (!fTPCParam->IsGeoRead()){ + // + // read transformation matrices for gGeoManager + // + fTPCParam->ReadGeoMatrices(); + } fLoader->LoadHits("read"); fLoader->LoadDigits("recreate"); AliRunLoader* runLoader = fLoader->GetRunLoader(); for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) { - runLoader->GetEvent(iEvent); + //PH runLoader->GetEvent(iEvent); SetActiveSectors(); Hits2Digits(iEvent); } @@ -1206,6 +1367,13 @@ void AliTPC::Hits2SDigits() // summable digits - 16 bit "ADC", no noise, no saturation //----------------------------------------------------------- + if (!fTPCParam->IsGeoRead()){ + // + // read transformation matrices for gGeoManager + // + fTPCParam->ReadGeoMatrices(); + } + fLoader->LoadHits("read"); fLoader->LoadSDigits("recreate"); AliRunLoader* runLoader = fLoader->GetRunLoader(); @@ -1378,7 +1546,7 @@ void AliTPC::DigitizeRow(Int_t irow,Int_t isec,TObjArray **rows) q+=GetNoise(); if(q <=fzerosup) continue; // do not fill zeros q = TMath::Nint(q); - if(q > fTPCParam->GetADCSat()) q = fTPCParam->GetADCSat(); // saturation + if(q >= fTPCParam->GetADCSat()) q = fTPCParam->GetADCSat() - 1; // saturation } @@ -1451,7 +1619,7 @@ Float_t AliTPC::GetSignal(TObjArray *p1, Int_t ntr, TVector &v = *tv; Float_t label = v(0); - Int_t centralPad = (fTPCParam->GetNPads(fCurrentIndex[1],fCurrentIndex[3]-1)-1)/2; + Int_t centralPad = (fTPCParam->GetNPads(fCurrentIndex[1],fCurrentIndex[3]-1))/2; Int_t nElectrons = (tv->GetNrows()-1)/5; indexRange[0]=9999; // min pad @@ -1597,9 +1765,35 @@ void AliTPC::MakeSector(Int_t isec,Int_t nrows,TTree *TH, // contains the track label and the position of electrons. //----------------------------------------------------------------- + // + // The trasport of the electrons through TPC drift volume + // Drift (drift velocity + velocity map(not yet implemented))) + // Application of the random processes (diffusion, gas gain) + // Systematic effects (ExB effect in drift volume + ROCs) + // + // Algorithm: + // Loop over primary electrons: + // Creation of the secondary electrons + // Loop over electrons (primary+ secondaries) + // Global coordinate frame: + // 1. Skip electrons if attached + // 2. ExB effect in drift volume + // a.) Simulation calib->GetExB()->CorrectInverse(dxyz0,dxyz1); + // b.) Reconstruction - calib->GetExB()->CorrectInverse(dxyz0,dxyz1); + // 3. Generation of gas gain (Random - Exponential distribution) + // 4. TransportElectron function (diffusion) + // + // 5. Conversion to the local coordinate frame pad-row, pad, timebin + // 6. Apply Time0 shift - AliTPCCalPad class + // a.) Plus sign in simulation + // b.) Minus sign in reconstruction + // end of loop + // //----------------------------------------------------------------- // Origin: Marek Kowalski IFJ, Krakow, Marek.Kowalski@ifj.edu.pl + // Origin: Marian Ivanov, marian.ivanov@cern.ch //----------------------------------------------------------------- + AliTPCcalibDB* const calib=AliTPCcalibDB::Instance(); Float_t gasgain = fTPCParam->GetGasGain(); Int_t i; @@ -1661,6 +1855,13 @@ void AliTPC::MakeSector(Int_t isec,Int_t nrows,TTree *TH, continue; } + // Remove hits which arrive before the TPC opening gate signal + if(((fTPCParam->GetZLength(isec)-TMath::Abs(tpcHit->Z())) + /fTPCParam->GetDriftV()+tpcHit->Time())GetGateDelay()) { + tpcHit = (AliTPChit*) NextHit(); + continue; + } + currentTrack = tpcHit->Track(); // track number if(currentTrack != previousTrack){ @@ -1696,7 +1897,7 @@ void AliTPC::MakeSector(Int_t isec,Int_t nrows,TTree *TH, //--------------------------------------------------- - Float_t time = 1.e6*(fTPCParam->GetZLength()-TMath::Abs(tpcHit->Z())) + Float_t time = 1.e6*(fTPCParam->GetZLength(isec)-TMath::Abs(tpcHit->Z())) /fTPCParam->GetDriftV(); // in microseconds! Float_t attProb = fTPCParam->GetAttCoef()* @@ -1710,19 +1911,49 @@ void AliTPC::MakeSector(Int_t isec,Int_t nrows,TTree *TH, for(Int_t nel=0;nelRndm(0)) < attProb) continue; // electron lost! - xyz[0]=tpcHit->X(); - xyz[1]=tpcHit->Y(); - xyz[2]=tpcHit->Z(); + + // + // ExB effect + // + Double_t dxyz0[3],dxyz1[3]; + dxyz0[0]=tpcHit->X(); + dxyz0[1]=tpcHit->Y(); + dxyz0[2]=tpcHit->Z(); + if (calib->GetExB()){ + calib->GetExB()->CorrectInverse(dxyz0,dxyz1); + }else{ + AliError("Not valid ExB calibration"); + dxyz1[0]=tpcHit->X(); + dxyz1[1]=tpcHit->Y(); + dxyz1[2]=tpcHit->Z(); + } + xyz[0]=dxyz1[0]; + xyz[1]=dxyz1[1]; + xyz[2]=dxyz1[2]; + // + // // // protection for the nonphysical avalanche size (10**6 maximum) // Double_t rn=TMath::Max(gRandom->Rndm(0),1.93e-22); xyz[3]= (Float_t) (-gasgain*TMath::Log(rn)); index[0]=1; - + TransportElectron(xyz,index); Int_t rowNumber; fTPCParam->GetPadRow(xyz,index); + // + // Add Time0 correction due unisochronity + // xyz[0] - pad row coordinate + // xyz[1] - pad coordinate + // xyz[2] - is in now time bin coordinate system + Float_t correction =0; + if (calib->GetPadTime0()){ + if (!calib->GetPadTime0()->GetCalROC(isec)) continue; + correction = calib->GetPadTime0()->GetCalROC(isec)->GetValue(TMath::Nint(xyz[0]),TMath::Nint(xyz[1])); + } + xyz[2]+=correction; + // // Electron track time (for pileup simulation) xyz[4] = tpcHit->Time()/fTPCParam->GetTSample(); // row 0 - cross talk from the innermost row @@ -1894,14 +2125,32 @@ void AliTPC::TransportElectron(Float_t *xyz, Int_t *index) Float_t dx = fTPCParam->Transform2to2NearestWire(xyz,index); xyz[1]+=dx*(fTPCParam->GetOmegaTau()); } - //add nonisochronity (not implemented yet) + //add nonisochronity (not implemented yet) + + } ClassImp(AliTPChit) - + //______________________________________________________________________ + AliTPChit::AliTPChit() + :AliHit(), + fSector(0), + fPadRow(0), + fQ(0), + fTime(0) +{ + // + // default + // + +} //_____________________________________________________________________________ -AliTPChit::AliTPChit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits): -AliHit(shunt,track) +AliTPChit::AliTPChit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits) + :AliHit(shunt,track), + fSector(0), + fPadRow(0), + fQ(0), + fTime(0) { // // Creates a TPC hit object @@ -2129,7 +2378,7 @@ void AliTPC::RemapTrackHitIDs(Int_t *map) TClonesArray * arr = fTrackHits->GetArray();; for (Int_t i=0;iGetEntriesFast();i++){ AliTrackHitsParamV2 * info = (AliTrackHitsParamV2 *)(arr->At(i)); - info->fTrackID = map[info->fTrackID]; + info->SetTrackID(map[info->GetTrackID()]); } } } @@ -2239,11 +2488,11 @@ void AliTPC::LoadPoints2(Int_t) for(trk=0; trkSetMarkerColor(GetMarkerColor()); - points->SetMarkerSize(GetMarkerSize()); + points->SetMarkerColor(kYellow); //PH kYellow it the default in TPC + points->SetMarkerSize(1);//PH Default size=1 points->SetDetector(this); points->SetParticle(trk); - points->SetPolyMarker(ntrk[trk],coor[trk],GetMarkerStyle()); + points->SetPolyMarker(ntrk[trk],coor[trk],1); // Default style=1 fPoints->AddAt(points,trk); delete [] coor[trk]; coor[trk]=0; @@ -2322,7 +2571,7 @@ void AliTPC::LoadPoints3(Int_t) for(trk=0; trkSetMarkerColor(GetMarkerColor()+1); + points->SetMarkerColor(kMagenta); //PH kYellow + 1 is kMagenta points->SetMarkerStyle(5); points->SetMarkerSize(0.2); points->SetDetector(this);