#include "AliTPCCalROC.h"
#include "AliTPCExB.h"
#include "AliRawReader.h"
-#include "AliTPCRawStream.h"
+#include "AliTPCRawStreamV3.h"
#include "TTreeStream.h"
ClassImp(AliTPC)
// Default constructor
//
fIshunt = 0;
+ for(Int_t i=0;i<4;i++) fCurrentIndex[i]=0;
// fTrackHitsOld = 0;
#if ROOT_VERSION_CODE >= ROOT_VERSION(4,0,1)
fHitType = 2;
#endif
-
+ for(Int_t i=0;i<4;i++) fCurrentIndex[i]=0;
//
fIshunt = 0;
}
}
-
+void AliTPC::CreateDebugStremer(){
+ //
+ // Create Debug streamer to check simulation
+ //
+ fDebugStreamer = new TTreeSRedirector("TPCSimdebug.root");
+}
//_____________________________________________________________________________
AliTPC::~AliTPC()
{
//
// Drift gases 1 - nonsensitive, 2 - sensitive
- // Ne-CO2-N2 (90-10-5) (volume) values at 20deg and 1 atm.
- // rho(Ne) = 0.839 g/cm^3, rho(CO2) = 1.842 g/cm^3, rho(N2) = 1.165 g/cm^3
- // for the calculation - everything is normalized to 1
+ // Ne-CO2 (90-10) (volume) values at 20deg and 1 atm.
+ // rho(Ne) = 0.839 g/cm^3, rho(CO2) = 1.842 g/cm^3
+
amat[0]= 20.18;
amat[1]=12.011;
amat[2]=15.9994;
- amat[3]=14.007;
+ // amat[3]=14.007;
zmat[0]= 10.;
zmat[1]=6.;
zmat[2]=8.;
- zmat[3]=7.;
-
- wmat[0]=0.756992632;
- wmat[1]=0.056235789;
- wmat[2]=0.128469474;
- wmat[3]=0.058395789;
+ // zmat[3]=7.;
+
+ //wmat[0]=0.756992632;
+ wmat[0]=0.8038965;
+ //wmat[1]=0.056235789;
+ wmat[1]= 0.053519;
+ //wmat[2]=0.128469474;
+ wmat[2]= 0.1425743;
+ // wmat[3]=0.058395789;
- density=0.000904929;
+ density=0.0009393;
- 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);
+ AliMixture(12,"Ne-CO2-1",amat,zmat,density,3,wmat);
+ AliMixture(13,"Ne-CO2-2",amat,zmat,density,3,wmat);
+ AliMixture(35,"Ne-CO2-3",amat,zmat,density,3,wmat);
//----------------------------------------------------------------------
// solid materials
//----------------------------------------------------------------------
//----------------------------------------------------------
AliMedium(0, "Air", 11, 0, iSXFLD, sXMGMX, 10., 999., .1, .01, .1);
- 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(1, "Ne-CO2-1", 12, 0, iSXFLD, sXMGMX, 10., 999.,.1,.001, .001);
+ AliMedium(2, "Ne-CO2-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);
+ AliMedium(20, "Ne-CO2-3", 35, 1, iSXFLD, sXMGMX, 10., 999.,.1,.001, .001);
//-----------------------------------------------------------
// tracking media for solids
//-----------------------------------------------------------
return;
}
for (Int_t i=0;i<fTPCParam->GetNSector();i++) fActiveSectors[i]=kFALSE;
- TBranch * branch=0;
+ //TBranch * branch=0;
if (fLoader->TreeH() == 0x0)
{
AliFatal("Can not find TreeH in folder");
return;
}
- if (fHitType>1) branch = fLoader->TreeH()->GetBranch("TPC2");
- else branch = fLoader->TreeH()->GetBranch("TPC");
+ //if (fHitType>1) branch = fLoader->TreeH()->GetBranch("TPC2");
+ if (fHitType>1) fLoader->TreeH()->GetBranch("TPC2");
+ //else branch = fLoader->TreeH()->GetBranch("TPC");
+ else fLoader->TreeH()->GetBranch("TPC");
Stat_t ntracks = fLoader->TreeH()->GetEntries();
// loop over all hits
- AliDebug(1,Form("Got %d tracks",ntracks));
+ AliDebug(1,Form("Got %d tracks", (Int_t) ntracks));
for(Int_t track=0;track<ntracks;track++) {
ResetHits();
return;
}
+ //
AliSimDigits digarr;
AliSimDigits* digrow = &digarr;
digits->GetBranch("Segment")->SetAddress(&digrow);
const Int_t kNOS = fTPCParam->GetNOuterSector();
const Int_t kNS = kNIS + kNOS;
- Short_t** allBins = NULL; //array which contains the data for one sector
-
+ // Setup storage
+ AliTPCROC * roc = AliTPCROC::Instance();
+ Int_t nRowsMax = roc->GetNRows(roc->GetNSector()-1);
+ Int_t nPadsMax = roc->GetNPads(roc->GetNSector()-1,nRowsMax-1);
+ Short_t** allBins = new Short_t*[nRowsMax];
+ for (Int_t iRow = 0; iRow < nRowsMax; iRow++) {
+ Int_t maxBin = kmaxTime*nPadsMax;
+ allBins[iRow] = new Short_t[maxBin];
+ memset(allBins[iRow],0,sizeof(Short_t)*maxBin);
+ }
+
for(Int_t iSector = 0; iSector < kNS; iSector++) {
Int_t nRows = fTPCParam->GetNRow(iSector);
indexDDL = (iSector-kNIS) * 4 + kNIS * 2;
}
- // Loas the raw data for corresponding DDLs
+ // Load the raw data for corresponding DDLs
rawReader->Reset();
- AliTPCRawStream input(rawReader);
+
+ AliTPCAltroMapping** mapping =AliTPCcalibDB::Instance()->GetMapping();
+ AliTPCRawStreamV3 input(rawReader,(AliAltroMapping**)mapping);
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];
+ // Clean storage
+ for (Int_t iRow = 0; iRow < nRowsMax; iRow++) {
+ Int_t maxBin = kmaxTime*nPadsMax;
memset(allBins[iRow],0,sizeof(Short_t)*maxBin);
}
// Begin loop over altro data
- while (input.Next()) {
+ while (input.NextDDL()) {
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();
+ //loop over pads
+ while ( input.NextChannel() ) {
+
+ 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));
+
+ //loop over bunches
+ while ( input.NextBunch() ){
+ Int_t startTbin = (Int_t)input.GetStartTimeBin();
+ Int_t bunchlength = (Int_t)input.GetBunchLength();
+ const UShort_t *sig = input.GetSignals();
+ for (Int_t iTime = 0; iTime<bunchlength; iTime++){
+ Int_t iTimeBin=startTbin-iTime;
+ if ( iTimeBin < 0 || iTimeBin >= kmaxTime) {
+ continue;
+ //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] = sig[iTime];
+ }
+ }
+ } // End loop over altro data
+ }
- } // 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++) {
fDigitsArray->ClearRow(iSector,iRow);
} // end of the sector digitization
-
- for (Int_t iRow = 0; iRow < nRows; iRow++)
- delete [] allBins[iRow];
-
- delete [] allBins;
-
}
+ // get LHC clock phase from the digits tree
- fLoader->WriteSDigits("OVERWRITE");
+ TParameter<float> *ph;
+ Float_t phase;
+ TTree *digtree = fLoader->TreeD();
+ //
+ if(digtree){ // if TreeD exists
+ ph = (TParameter<float>*)digtree->GetUserInfo()->FindObject("lhcphase0");
+ phase = ph->GetVal();
+ }
+ else{ //TreeD does not exist
+ phase = 0.;
+ }
+ //
+ // store lhc clock phase in S-digits tree
+ //
+ fLoader->TreeS()->GetUserInfo()->Add(new TParameter<float>("lhcphase0",phase));
+ //
+ fLoader->WriteSDigits("OVERWRITE");
if(GetDigitsArray()) delete GetDigitsArray();
SetDigitsArray(0x0);
+ // cleanup storage
+ for (Int_t iRow = 0; iRow < nRowsMax; iRow++)
+ delete [] allBins[iRow];
+ delete [] allBins;
+
return kTRUE;
}
//
AliRunLoader* rl = (AliRunLoader*)fLoader->GetEventFolder()->FindObject(AliRunLoader::GetRunLoaderName());
rl->CdGAFile();
- AliTPCParamSR *param=(AliTPCParamSR*)gDirectory->Get("75x40_100x60");
- // if(param){
-// AliInfo("You are using 2 pad-length geom hits with 3 pad-lenght geom digits...");
-// delete param;
-// param = new AliTPCParamSR();
-// }
-// else {
-// param=(AliTPCParamSR*)gDirectory->Get("75x40_100x60_150x60");
-// }
- param = (AliTPCParamSR*)AliTPCcalibDB::Instance()->GetParameters();
+ //AliTPCParamSR *param=(AliTPCParamSR*)gDirectory->Get("75x40_100x60");
+ //gDirectory->Get("75x40_100x60");
+ AliTPCParamSR *param = (AliTPCParamSR*)AliTPCcalibDB::Instance()->GetParameters();
+ if(!param){
+ AliFatal("No TPC parameters found");
+ return;
+ }
if (!param->IsGeoRead()){
//
// read transformation matrices for gGeoManager
//
param->ReadGeoMatrices();
}
- if(!param){
- AliFatal("No TPC parameters found");
- }
+
AliTPCPRF2D * prfinner = new AliTPCPRF2D;
// Use gamma 4
//
char strgamma4[1000];
- sprintf(strgamma4,"AliTPCRF1D::Gamma4((x-0.135+%f)*%f,55,160)",3*param->GetZSigma(), 1000000000*param->GetTSample()/param->GetZWidth());
+ //sprintf(strgamma4,"AliTPCRF1D::Gamma4((x-0.135+%f)*%f,55,160)",3*param->GetZSigma(), 1000000000*param->GetTSample()/param->GetZWidth());
+ snprintf(strgamma4,1000,"AliTPCRF1D::Gamma4((x-0.135+%f)*%f,55,160)",3*param->GetZSigma(), 1000000000*param->GetTSample()/param->GetZWidth());
TF1 * fgamma4 = new TF1("fgamma4",strgamma4, -1,1);
AliTPCRF1D * rf = new AliTPCRF1D(kTRUE,1000);
rf->SetParam(fgamma4,param->GetZWidth(), 1,0.2);
//
for(Int_t isec=0;isec<fTPCParam->GetNSector();isec++)
if (IsSectorActive(isec)) {
- AliDebug(1,Form("Hits2Digits","Sector %d is active.",isec));
+ AliDebug(1,Form("Hits2Digits: Sector %d is active.",isec));
Hits2DigitsSector(isec);
}
else {
- AliDebug(1,Form("Hits2Digits","Sector %d is NOT active.",isec));
+ AliDebug(1,Form("Hits2Digits: Sector %d is NOT active.",isec));
}
fLoader->WriteDigits("OVERWRITE");
//-----------------------------------------------------------
// summable digits - 16 bit "ADC", no noise, no saturation
//-----------------------------------------------------------
- if (0) fDebugStreamer = new TTreeSRedirector("TPCSimdebug.root");
if (!fTPCParam->IsGeoRead()){
//
Stat_t ntracks = tH->GetEntries();
-
-
- TObjArray **row;
-
Int_t nrows =fTPCParam->GetNRow(isec);
- row= new TObjArray* [nrows+2]; // 2 extra rows for cross talk
+ TObjArray **row=new TObjArray* [nrows+2]; // 2 extra rows for cross talk
+ for(Int_t j=0;j<nrows+2;j++) row[j]=0;
MakeSector(isec,nrows,tH,ntracks,row);
AliDebug(1,"");
if (fHitType<2) return;
char branchname[10];
- sprintf(branchname,"%s2",GetName());
+ //sprintf(branchname,"%s2",GetName());
+ snprintf(branchname,10,"%s2",GetName());
//
// Get the pointer to the header
const char *cH = strstr(option,"H");
TBranch *branch;
char branchname[20];
- sprintf(branchname,"%s2",GetName());
+ //sprintf(branchname,"%s2",GetName());
+ snprintf(branchname,20,"%s2",GetName());
//
// Branch address for hit tree
TTree *treeH = fLoader->TreeH();
// and one has to decide where to store the TPC parameters
// M.Kowalski
char paramName[50];
- sprintf(paramName,"75x40_100x60_150x60");
+ //sprintf(paramName,"75x40_100x60_150x60");
+ snprintf(paramName,50,"75x40_100x60_150x60");
AliTPCParam *paramTPC=(AliTPCParam*)file->Get(paramName);
if (paramTPC) {
AliDebugClass(1,Form("TPC parameters %s found.",paramName));