X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TRD%2FAliTRD.cxx;h=727e7085aa80cd4a158d174f1ec51e6fa656ccdb;hb=8f499a6672f05464b96f63d929f0cdf965b3c851;hp=61026210bbce39fab6fcbdcf29ee506e93e7ed20;hpb=40c7ef210868e75b126378a5b4d66aebf0f1d524;p=u%2Fmrichter%2FAliRoot.git diff --git a/TRD/AliTRD.cxx b/TRD/AliTRD.cxx index 61026210bbc..727e7085aa8 100644 --- a/TRD/AliTRD.cxx +++ b/TRD/AliTRD.cxx @@ -13,105 +13,7 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ -/* -$Log$ -Revision 1.30 2001/05/28 17:07:58 hristov -Last minute changes; ExB correction in AliTRDclusterizerV1; taking into account of material in G10 TEC frames and material between TEC planes (C.Blume,S.Sedykh) - -Revision 1.29 2001/05/21 16:45:47 hristov -Last minute changes (C.Blume) - -Revision 1.28 2001/05/16 14:57:27 alibrary -New files for folders and Stack - -Revision 1.27 2001/05/08 07:05:02 hristov -Loop variable declared once (HP, Sun) - -Revision 1.26 2001/05/07 08:03:22 cblume -Generate also hits in the amplification region - -Revision 1.25 2001/03/13 09:30:35 cblume -Update of digitization. Moved digit branch definition to AliTRD - -Revision 1.24 2001/01/26 19:56:49 hristov -Major upgrade of AliRoot code - -Revision 1.23 2000/11/01 14:53:20 cblume -Merge with TRD-develop - -Revision 1.17.2.6 2000/10/15 23:29:08 cblume -Introduced more detailed geometry for the display - -Revision 1.17.2.5 2000/10/06 16:49:46 cblume -Made Getters const - -Revision 1.17.2.4 2000/10/04 16:34:57 cblume -Replace include files by forward declarations - -Revision 1.17.2.3 2000/09/22 14:45:17 cblume -Included changes for the tracking - -Revision 1.17.2.2 2000/09/18 13:25:13 cblume -Included LoadPoints() method to display the TR photons - -Revision 1.22 2000/10/02 21:28:19 fca -Removal of useless dependecies via forward declarations - -Revision 1.21 2000/06/09 11:10:07 cblume -Compiler warnings and coding conventions, next round - -Revision 1.20 2000/06/08 18:32:57 cblume -Make code compliant to coding conventions - -Revision 1.19 2000/06/07 16:25:37 cblume -Try to remove compiler warnings on Sun and HP - -Revision 1.18 2000/05/08 16:17:27 cblume -Merge TRD-develop - -Revision 1.21 2000/06/09 11:10:07 cblume -Compiler warnings and coding conventions, next round - -Revision 1.20 2000/06/08 18:32:57 cblume -Make code compliant to coding conventions - -Revision 1.19 2000/06/07 16:25:37 cblume -Try to remove compiler warnings on Sun and HP - -Revision 1.18 2000/05/08 16:17:27 cblume -Merge TRD-develop - -Revision 1.17.2.1 2000/05/08 14:28:59 cblume -Introduced SetPHOShole() and SetRICHhole(). AliTRDrecPoint container is now a TObjArray - -Revision 1.17 2000/02/28 19:10:26 cblume -Include the new TRD classes - -Revision 1.16.2.2 2000/02/28 17:53:24 cblume -Introduce TRD geometry classes - -Revision 1.16.2.1 2000/02/28 17:04:19 cblume -Include functions and data members for AliTRDrecPoint - -Revision 1.16 2000/01/19 17:17:35 fca -Introducing a list of lists of hits -- more hits allowed for detector now - -Revision 1.15 1999/11/02 17:04:25 fca -Small syntax change for HP compiler - -Revision 1.14 1999/11/02 16:57:02 fca -Avoid non ansi warnings on HP compilers - -Revision 1.13 1999/11/02 16:35:56 fca -New version of TRD introduced - -Revision 1.12 1999/11/01 20:41:51 fca -Added protections against using the wrong version of FRAME - -Revision 1.11 1999/09/29 09:24:34 fca -Introduction of the Copyright and cvs Log - -*/ +/* $Id$ */ /////////////////////////////////////////////////////////////////////////////// // // @@ -121,134 +23,73 @@ Introduction of the Copyright and cvs Log // // /////////////////////////////////////////////////////////////////////////////// -#include -#include - -#include -#include -#include -#include -#include - -#include "AliRun.h" -#include "AliConst.h" -#include "AliDigit.h" -#include "AliMagF.h" -#include "AliMC.h" +#include +#include +#include +#include "AliMC.h" +#include "AliMagF.h" +#include "AliRun.h" +#include "AliLoader.h" + #include "AliTRD.h" -#include "AliTRDhit.h" -#include "AliTRDpoints.h" -#include "AliTRDdigit.h" #include "AliTRDdigitizer.h" -#include "AliTRDclusterizer.h" -#include "AliTRDgeometryHole.h" -#include "AliTRDgeometryFull.h" -#include "AliTRDrecPoint.h" -#include "AliTRDcluster.h" #include "AliTRDdigitsManager.h" -#include "AliTRDdataArrayI.h" -#include "AliTRDsegmentArray.h" +#include "AliTRDgeometry.h" +#include "AliTRDhit.h" +#include "AliTRDrawData.h" +#include "AliTRDCommonParam.h" ClassImp(AliTRD) //_____________________________________________________________________________ AliTRD::AliTRD() + :AliDetector() + ,fGeometry(0) + ,fGasDensity(0) + ,fFoilDensity(0) + ,fGasNobleFraction(0) + ,fPrimaryIonisation(0) { // // Default constructor // - - fIshunt = 0; - fGasMix = 0; - fHits = 0; - fDigits = 0; - - fRecPoints = 0; - fNRecPoints = 0; - - fGeometry = 0; - - fGasDensity = 0; - fFoilDensity = 0; - - fDrawTR = 0; - fDisplayType = 0; - - fDigitsArray = 0; - for (Int_t iDict = 0; iDict < AliTRDdigitsManager::NDict(); iDict++) { - fDictionaryArray[iDict] = 0; - } - + } //_____________________________________________________________________________ AliTRD::AliTRD(const char *name, const char *title) - : AliDetector(name,title) + :AliDetector(name,title) + ,fGeometry(0) + ,fGasDensity(0) + ,fFoilDensity(0) + ,fGasNobleFraction(0) + ,fPrimaryIonisation(0) { // // Standard constructor for the TRD // - // Check that FRAME is there otherwise we have no place where to - // put TRD - AliModule* frame = gAlice->GetModule("FRAME"); + // Check that FRAME is there otherwise we have no place where to put TRD + AliModule *frame = gAlice->GetModule("FRAME"); if (!frame) { - Error("Ctor","TRD needs FRAME to be present\n"); + AliError("TRD needs FRAME to be present\n"); exit(1); } - // Define the TRD geometry according to the FRAME geometry - if (frame->IsVersion() == 0) { - // Geometry with hole - fGeometry = new AliTRDgeometryHole(); - } - else if (frame->IsVersion() == 1) { - // Geometry without hole - fGeometry = new AliTRDgeometryFull(); + // Define the TRD geometry + if ((frame->IsVersion() == 0) || + (frame->IsVersion() == 1)) { + fGeometry = new AliTRDgeometry(); } else { - Error("Ctor","Could not find valid FRAME version\n"); + AliError("Could not find valid FRAME version\n"); exit(1); } // Allocate the hit array - fHits = new TClonesArray("AliTRDhit" ,405); - gAlice->AddHitList(fHits); - - // Allocate the digits array - fDigits = 0; - - // Allocate the rec point array - fRecPoints = new TObjArray(400); - fNRecPoints = 0; - - fIshunt = 0; - fGasMix = 1; - - fGasDensity = 0; - fFoilDensity = 0; - - fDrawTR = 0; - fDisplayType = 0; - - fDigitsArray = 0; - for (Int_t iDict = 0; iDict < AliTRDdigitsManager::NDict(); iDict++) { - fDictionaryArray[iDict] = 0; - } - - SetMarkerColor(kWhite); - -} - -//_____________________________________________________________________________ -AliTRD::AliTRD(const AliTRD &trd) -{ - // - // Copy constructor - // - - ((AliTRD &) trd).Copy(*this); + fHits = new TClonesArray("AliTRDhit",405); + gAlice->GetMCApp()->AddHitList(fHits); } @@ -259,70 +100,15 @@ AliTRD::~AliTRD() // TRD destructor // - fIshunt = 0; - - delete fGeometry; - delete fHits; - delete fRecPoints; - if (fDigitsArray) delete fDigitsArray; - for (Int_t iDict = 0; iDict < AliTRDdigitsManager::NDict(); iDict++) { - if (fDictionaryArray[iDict]) delete fDictionaryArray[iDict]; + if (fGeometry) { + delete fGeometry; + fGeometry = 0; } -} - -//_____________________________________________________________________________ -void AliTRD::AddCluster(Float_t *pos, Int_t *digits, Int_t det, Float_t amp - , Int_t *tracks, Float_t sigmaY2, Int_t iType) -{ - // - // Add a cluster for the TRD - // - - Int_t pla = fGeometry->GetPlane(det); - Int_t cha = fGeometry->GetChamber(det); - Int_t sec = fGeometry->GetSector(det); - - Float_t padRow = pos[0]; - Float_t padCol = pos[1]; - Float_t row0 = fGeometry->GetRow0(pla,cha,sec); - Float_t col0 = fGeometry->GetCol0(pla); - Float_t rowSize = fGeometry->GetRowPadSize(pla,cha,sec); - Float_t colSize = fGeometry->GetColPadSize(pla); - - AliTRDcluster *c = new AliTRDcluster(); - - c->SetDetector(det); - c->AddTrackIndex(tracks); - - c->SetQ(amp); - - c->SetLocalTimeBin(((Int_t) pos[2])); - c->SetY(- (col0 + padCol * colSize)); - c->SetZ( row0 + padRow * rowSize); - - c->SetSigmaY2((sigmaY2 + 1./12.) * colSize*colSize); - c->SetSigmaZ2(rowSize * rowSize / 12.); - - switch (iType) { - case 0: - c->Set2pad(); - break; - case 1: - c->Set3pad(); - break; - case 2: - c->Set4pad(); - break; - case 3: - c->Set5pad(); - break; - case 4: - c->SetLarge(); - break; - }; - - fRecPoints->Add(c); + if (fHits) { + delete fHits; + fHits = 0; + } } @@ -333,29 +119,29 @@ void AliTRD::Hits2Digits() // Create digits // - AliTRDdigitizer *digitizer = new AliTRDdigitizer("TRDdigitizer" - ,"TRD digitizer class"); + AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class"); + AliLog::SetClassDebugLevel("TRDdigitizer",AliDebugLevel()); - // Set the parameter - digitizer->SetDiffusion(); - digitizer->SetExB(); - digitizer->SetEvent(gAlice->GetEvNumber()); // Initialization - digitizer->InitDetector(); + digitizer.InitDetector(); - // Create the digits - digitizer->MakeDigits(); - - // Write the digits into the input file - if (digitizer->Digits()->MakeBranch(fDigitsFile)) { - - digitizer->WriteDigits(); + if (!fLoader->TreeH()) { + fLoader->LoadHits("read"); + } + fLoader->LoadDigits("recreate"); - // Save the digitizer class in the AliROOT - digitizer->Write(); + AliRunLoader *runLoader = fLoader->GetRunLoader(); + for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) { + runLoader->GetEvent(iEvent); + digitizer.Open(runLoader,iEvent); + digitizer.MakeDigits(); + digitizer.WriteDigits(); } + fLoader->UnloadHits(); + fLoader->UnloadDigits(); + } //_____________________________________________________________________________ @@ -365,191 +151,148 @@ void AliTRD::Hits2SDigits() // Create summable digits // - AliTRDdigitizer *digitizer = new AliTRDdigitizer("TRDdigitizer" - ,"TRD digitizer class"); - + AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class"); // For the summable digits - digitizer->SetSDigits(kTRUE); - - // Set the parameter - digitizer->SetDiffusion(); - digitizer->SetExB(); - digitizer->SetEvent(gAlice->GetEvNumber()); + digitizer.SetSDigits(kTRUE); + AliLog::SetClassDebugLevel("TRDdigitizer",AliDebugLevel()); // Initialization - digitizer->InitDetector(); + digitizer.InitDetector(); - // Create the digits - digitizer->MakeDigits(); - - // Write the digits into the input file - if (digitizer->Digits()->MakeBranch(fDigitsFile)) { - - digitizer->WriteDigits(); - - // Save the digitizer class in the AliROOT - digitizer->Write(); - + if (!fLoader->TreeH()) { + fLoader->LoadHits("read"); } + fLoader->LoadSDigits("recreate"); -} + AliRunLoader *runLoader = fLoader->GetRunLoader(); -//_____________________________________________________________________________ -void AliTRD::SDigits2Digits() -{ - // - // Create final digits from summable digits - // + for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) { + runLoader->GetEvent(iEvent); + digitizer.Open(runLoader,iEvent); + digitizer.MakeDigits(); + digitizer.WriteDigits(); + } + fLoader->UnloadHits(); + fLoader->UnloadSDigits(); + } //_____________________________________________________________________________ -void AliTRD::AddDigit(Int_t *digits, Int_t *amp) +AliDigitizer *AliTRD::CreateDigitizer(AliDigitizationInput* digInput) const { // - // Add a digit for the TRD + // Creates a new digitizer object // - TClonesArray &ldigits = *fDigits; - new(ldigits[fNdigits++]) AliTRDdigit(kFALSE,digits,amp); + return new AliTRDdigitizer(digInput); } //_____________________________________________________________________________ -void AliTRD::AddHit(Int_t track, Int_t det, Float_t *hits, Int_t q) +void AliTRD::SDigits2Digits() { // - // Add a hit for the TRD + // Create final digits from summable digits // - TClonesArray &lhits = *fHits; - new(lhits[fNhits++]) AliTRDhit(fIshunt,track,det,hits,q); - -} + // Create the TRD digitizer + AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class"); + AliLog::SetClassDebugLevel("TRDdigitizer",AliDebugLevel()); -//_____________________________________________________________________________ -void AliTRD::BuildGeometry() -{ - // - // Create the ROOT TNode geometry for the TRD - // - - TNode *node, *top; - TPGON *pgon; + // Set the parameter + digitizer.SetEvent(gAlice->GetEvNumber()); - Float_t rmin, rmax; - Float_t zmax1, zmax2; + // Initialization + digitizer.InitDetector(); - Int_t iPlan; + // Read the s-digits via digits manager + AliTRDdigitsManager sdigitsManager; - const Int_t kColorTRD = 46; - - // Find the top node alice - top = gAlice->GetGeometry()->GetNode("alice"); + AliLog::SetClassDebugLevel("TRDdigitisManager",AliDebugLevel()); + sdigitsManager.SetSDigits(kTRUE); + sdigitsManager.CreateArrays(); - if (fDisplayType == 0) { - - pgon = new TPGON("S_TRD","TRD","void",0,360,AliTRDgeometry::Nsect(),4); - rmin = AliTRDgeometry::Rmin(); - rmax = AliTRDgeometry::Rmax(); - pgon->DefineSection(0,-AliTRDgeometry::Zmax1(),rmax,rmax); - pgon->DefineSection(1,-AliTRDgeometry::Zmax2(),rmin,rmax); - pgon->DefineSection(2, AliTRDgeometry::Zmax2(),rmin,rmax); - pgon->DefineSection(3, AliTRDgeometry::Zmax1(),rmax,rmax); - top->cd(); - node = new TNode("TRD","TRD","S_TRD",0,0,0,""); - node->SetLineColor(kColorTRD); - fNodes->Add(node); - + if (!fLoader->TreeS()) { + if (fLoader->LoadSDigits("read")) { + return; + } } - else if (fDisplayType == 1) { - - Char_t name[7]; - - Float_t slope = (AliTRDgeometry::Zmax1() - AliTRDgeometry::Zmax2()) - / (AliTRDgeometry::Rmax() - AliTRDgeometry::Rmin()); - - rmin = AliTRDgeometry::Rmin() + AliTRDgeometry::Ccframe()/2. - + AliTRDgeometry::DrZpos() - - AliTRDgeometry::DrThick()/2.; - rmax = rmin + AliTRDgeometry::DrThick(); - - Float_t thickness = rmin - AliTRDgeometry::Rmin(); - zmax2 = AliTRDgeometry::Zmax2() + slope * thickness; - zmax1 = zmax2 + slope * AliTRDgeometry::DrThick(); + if (!fLoader->TreeS()) { + AliError(Form("Error while reading SDigits for event %d",gAlice->GetEvNumber())); + return; + } + + sdigitsManager.ReadDigits(fLoader->TreeS()); - for (iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) { + // Add the s-digits to the input list + digitizer.AddSDigitsManager(&sdigitsManager); - sprintf(name,"S_TR1%d",iPlan); - pgon = new TPGON(name,"TRD","void",0,360,AliTRDgeometry::Nsect(),4); - pgon->DefineSection(0,-zmax1,rmax,rmax); - pgon->DefineSection(1,-zmax2,rmin,rmax); - pgon->DefineSection(2, zmax2,rmin,rmax); - pgon->DefineSection(3, zmax1,rmax,rmax); - top->cd(); - node = new TNode("TRD","TRD",name,0,0,0,""); - node->SetLineColor(kColorTRD); - fNodes->Add(node); + // Convert the s-digits to normal digits + digitizer.SDigits2Digits(); - Float_t height = AliTRDgeometry::Cheight() + AliTRDgeometry::Cspace(); - rmin = rmin + height; - rmax = rmax + height; - zmax1 = zmax1 + slope * height; - zmax2 = zmax2 + slope * height; + // Store the digits + if (!fLoader->TreeD()) { + fLoader->MakeTree("D"); + } + if (digitizer.MakeBranch(fLoader->TreeD())){ + digitizer.WriteDigits(); + } - } +} - thickness += AliTRDgeometry::DrThick(); - rmin = AliTRDgeometry::Rmin() + thickness; - rmax = rmin + AliTRDgeometry::AmThick(); - zmax2 = AliTRDgeometry::Zmax2() + slope * thickness; - zmax1 = zmax2 + slope * AliTRDgeometry::AmThick(); - - for (iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) { - - sprintf(name,"S_TR2%d",iPlan); - pgon = new TPGON(name,"TRD","void",0,360,AliTRDgeometry::Nsect(),4); - pgon->DefineSection(0,-zmax1,rmax,rmax); - pgon->DefineSection(1,-zmax2,rmin,rmax); - pgon->DefineSection(2, zmax2,rmin,rmax); - pgon->DefineSection(3, zmax1,rmax,rmax); - top->cd(); - node = new TNode("TRD","TRD",name,0,0,0,""); - node->SetLineColor(kColorTRD); - fNodes->Add(node); - - Float_t height = AliTRDgeometry::Cheight() + AliTRDgeometry::Cspace(); - rmin = rmin + height; - rmax = rmax + height; - zmax1 = zmax1 + slope * height; - zmax2 = zmax2 + slope * height; +//_____________________________________________________________________________ +void AliTRD::Digits2Raw() +{ + // + // Convert digits of the current event to raw data + // - } + fLoader->LoadDigits(); + TTree *digits = fLoader->TreeD(); + if (!digits) { + AliError("No digits tree"); + return; + } + AliTRDrawData rawWriter; + if (!rawWriter.Digits2Raw(digits)) { + AliError("The raw writer could not load the digits tree"); } + fLoader->UnloadDigits(); + } - + //_____________________________________________________________________________ -void AliTRD::Copy(TObject &trd) +void AliTRD::AddHit(Int_t track, Int_t det, Float_t *hits, Int_t q + , Float_t time, Bool_t inDrift) { // - // Copy function - // + // Add a hit for the TRD + // - ((AliTRD &) trd).fGasMix = fGasMix; - ((AliTRD &) trd).fGeometry = fGeometry; - ((AliTRD &) trd).fRecPoints = fRecPoints; - ((AliTRD &) trd).fNRecPoints = fNRecPoints; - ((AliTRD &) trd).fGasDensity = fGasDensity; - ((AliTRD &) trd).fFoilDensity = fFoilDensity; - ((AliTRD &) trd).fDrawTR = fDrawTR; - ((AliTRD &) trd).fDisplayType = fDisplayType; + TClonesArray &lhits = *fHits; + AliTRDhit *hit = new(lhits[fNhits++]) AliTRDhit(fIshunt + ,track + ,det + ,hits + ,q + ,time); + + if (inDrift) { + hit->SetDrift(); + } + else { + hit->SetAmplification(); + } - //AliDetector::Copy(trd); + if (q < 0) { + hit->SetTRphoton(); + } } - + //_____________________________________________________________________________ void AliTRD::CreateGeometry() { @@ -558,257 +301,242 @@ void AliTRD::CreateGeometry() // // Check that FRAME is there otherwise we have no place where to put the TRD - AliModule* frame = gAlice->GetModule("FRAME"); + AliModule *frame = gAlice->GetModule("FRAME"); if (!frame) { - printf(" The TRD needs the FRAME to be defined first\n"); - return; + AliFatal("The TRD needs the FRAME to be defined first"); } fGeometry->CreateGeometry(fIdtmed->GetArray() - 1299); } - + //_____________________________________________________________________________ void AliTRD::CreateMaterials() { // // Create the materials for the TRD - // Origin Y.Foka // - Int_t isxfld = gAlice->Field()->Integ(); - Float_t sxmgmx = gAlice->Field()->Max(); - - // For polyethilene (CH2) - Float_t ape[2] = { 12., 1. }; - Float_t zpe[2] = { 6., 1. }; - Float_t wpe[2] = { 1., 2. }; - Float_t dpe = 0.95; - - // For mylar (C5H4O2) - Float_t amy[3] = { 12., 1., 16. }; - Float_t zmy[3] = { 6., 1., 8. }; - Float_t wmy[3] = { 5., 4., 2. }; - Float_t dmy = 1.39; - - // For CO2 - Float_t aco[2] = { 12., 16. }; - Float_t zco[2] = { 6., 8. }; - Float_t wco[2] = { 1., 2. }; - Float_t dco = 0.001977; - - // For water - Float_t awa[2] = { 1., 16. }; - Float_t zwa[2] = { 1., 8. }; - Float_t wwa[2] = { 2., 1. }; - Float_t dwa = 1.0; - - // For isobutane (C4H10) - Float_t ais[2] = { 12., 1. }; - Float_t zis[2] = { 6., 1. }; - Float_t wis[2] = { 4., 10. }; - Float_t dis = 0.00267; - - // For plexiglas (C5H8O2) - Float_t apg[3] = { 12.011 , 1.0 , 15.9994 }; - Float_t zpg[3] = { 6.0 , 1.0 , 8.0 }; - Float_t wpg[3] = { 5.0 , 8.0 , 2.0 }; - Float_t dpg = 1.18; - - // For Xe/CO2-gas-mixture - // Xe-content of the Xe/CO2-mixture (85% / 15%) - Float_t fxc = .85; - // Xe-content of the Xe/Isobutane-mixture (97% / 3%) - Float_t fxi = .97; - Float_t dxe = .005858; - - // General tracking parameter - Float_t tmaxfd = -10.; - Float_t stemax = -1e10; - Float_t deemax = -0.1; - Float_t epsil = 1e-4; - Float_t stmin = -0.001; - - Float_t absl, radl, d, buf[1]; - Float_t agm[2], zgm[2], wgm[2]; - Float_t dgm1, dgm2; - Int_t nbuf; + Int_t isxfld = ((AliMagF *) TGeoGlobalMagField::Instance()->GetField())->Integ(); + Float_t sxmgmx = ((AliMagF *) TGeoGlobalMagField::Instance()->GetField())->Max(); ////////////////////////////////////////////////////////////////////////// // Define Materials ////////////////////////////////////////////////////////////////////////// - AliMaterial( 1, "Al ", 26.98, 13.0, 2.7 , 8.9 , 37.2); - AliMaterial( 2, "Air", 14.61, 7.3, 0.001205, 30420.0 , 67500.0); - AliMaterial( 4, "Xe ", 131.29, 54.0, dxe , 1447.59, 0.0); - AliMaterial( 5, "Cu ", 63.54, 29.0, 8.96 , 1.43, 14.8); - AliMaterial( 6, "C ", 12.01, 6.0, 2.265 , 18.8 , 74.4); - AliMaterial(12, "G10", 20.00, 10.0, 1.7 , 19.4 , 999.0); - - // Mixtures - AliMixture(3, "Polyethilene", ape, zpe, dpe, -2, wpe); - AliMixture(7, "Mylar", amy, zmy, dmy, -3, wmy); - AliMixture(8, "CO2", aco, zco, dco, -2, wco); - AliMixture(9, "Isobutane", ais, zis, dis, -2, wis); - AliMixture(13,"Water", awa, zwa, dwa, -2, wwa); - AliMixture(14,"Plexiglas", apg, zpg, dpg, -3, wpg); - + // Aluminum + AliMaterial( 1,"Al", 26.98, 13.0, 2.7, 8.9, 37.2); + // Copper + AliMaterial( 2,"Cu", 63.54, 29.0, 8.96, 1.43, 14.8); + // Carbon + AliMaterial( 3,"C" , 12.01, 6.0, 2.265, 18.8, 74.4); + // Carbon for fiber mats + AliMaterial( 4,"C2", 12.01, 6.0, 1.75, 18.8, 74.4); + // Zinc + AliMaterial( 5,"Sn", 118.71, 50.0, 7.31, 1.21, 14.8); + // Silicon + AliMaterial( 6,"Si", 28.09, 14.0, 2.33, 9.36, 37.2); + // Iron + AliMaterial( 7,"Fe", 55.85, 26.0, 7.87, 1.76, 14.8); + + // Air + Float_t aAir[4] = { 12.011 , 14.0 , 15.9994 , 36.0 }; + Float_t zAir[4] = { 6.0 , 7.0 , 8.0 , 18.0 }; + Float_t wAir[4] = { 0.000124, 0.755267, 0.231781, 0.012827 }; + Float_t dAir = 1.20479e-03; + AliMixture(51,"Air", aAir, zAir, dAir, 4, wAir ); + // Polyethilene (CH2) + Float_t ape[2] = { 12.011 , 1.0079 }; + Float_t zpe[2] = { 6.0 , 1.0 }; + Float_t wpe[2] = { 1.0 , 2.0 }; + Float_t dpe = 0.95; + AliMixture(52,"Polyethilene", ape, zpe, dpe, -2, wpe ); // Gas mixtures - Char_t namate[21]; - // Xe/CO2-mixture - // Get properties of Xe - gMC->Gfmate((*fIdmate)[4], namate, agm[0], zgm[0], d, radl, absl, buf, nbuf); - // Get properties of CO2 - gMC->Gfmate((*fIdmate)[8], namate, agm[1], zgm[1], d, radl, absl, buf, nbuf); - // Create gas mixture - wgm[0] = fxc; - wgm[1] = 1. - fxc; - dgm1 = wgm[0] * dxe + wgm[1] * dco; - AliMixture(10, "Gas mixture 1", agm, zgm, dgm1, 2, wgm); - // Xe/Isobutane-mixture - // Get properties of Xe - gMC->Gfmate((*fIdmate)[4], namate, agm[0], zgm[0], d, radl, absl, buf, nbuf); - // Get properties of Isobutane - gMC->Gfmate((*fIdmate)[9], namate, agm[1], zgm[1], d, radl, absl, buf, nbuf); - // Create gas mixture - wgm[0] = fxi; - wgm[1] = 1. - fxi; - dgm2 = wgm[0] * dxe + wgm[1] * dis; - AliMixture(11, "Gas mixture 2", agm, zgm, dgm2, 2, wgm); - + // Xe/CO2-gas-mixture (85% / 15%) + Float_t aXeCO2[3] = { 131.29 , 12.0107 , 15.9994 }; + Float_t zXeCO2[3] = { 54.0 , 6.0 , 8.0 }; + Float_t wXeCO2[3] = { 8.5 , 1.5 , 3.0 }; + Float_t fxc = 0.85; + Float_t dxe = 0.00549; // at 20C + Float_t dco = 0.00186; // at 20C + Float_t dgmXe = fxc * dxe + (1.0 - fxc) * dco; + // Ar/CO2-gas-mixture + Float_t aArCO2[3] = { 39.948 , 12.0107 , 15.9994 }; + Float_t zArCO2[3] = { 18.0 , 6.0 , 8.0 }; + Float_t wArCO2[3] = { 8.2 , 1.8 , 3.6 }; + Float_t fac = 0.82; + Float_t dar = 0.00166; // at 20C + Float_t dgmAr = fac * dar + (1.0 - fac) * dco; + if (AliTRDCommonParam::Instance()->IsXenon()) { + AliMixture(53,"XeCO2", aXeCO2, zXeCO2, dgmXe, -3, wXeCO2); + } + else if (AliTRDCommonParam::Instance()->IsArgon()) { + AliInfo("Gas mixture: Ar C02 (80/20)"); + AliMixture(53,"ArCO2", aArCO2, zArCO2, dgmAr, -3, wArCO2); + } + else { + AliFatal("Wrong gas mixture"); + exit(1); + } + // G10 + Float_t aG10[4] = { 1.0079, 12.011 , 15.9994, 28.086 }; + Float_t zG10[4] = { 1.0 , 6.0 , 8.0 , 14.0 }; + Float_t wG10[4] = { 0.023 , 0.194 , 0.443 , 0.340 }; + Float_t dG10 = 2.0; + AliMixture(54,"G10", aG10, zG10, dG10, 4,wG10 ); + // Water + Float_t awa[2] = { 1.0079, 15.9994 }; + Float_t zwa[2] = { 1.0 , 8.0 }; + Float_t wwa[2] = { 2.0 , 1.0 }; + Float_t dwa = 1.0; + AliMixture(55,"Water", awa, zwa, dwa, -2,wwa ); + // Rohacell (C5H8O2), X0 = 535.005cm + Float_t arh[3] = { 12.011 , 1.0079, 15.9994 }; + Float_t zrh[3] = { 6.0 , 1.0 , 8.0 }; + Float_t wrh[3] = { 5.0 , 8.0 , 2.0 }; + Float_t drh = 0.075; + AliMixture(56,"Rohacell", arh, zrh, drh, -3,wrh ); + // Epoxy (C18H19O3) + Float_t aEpoxy[3] = { 15.9994, 1.0079, 12.011 }; + Float_t zEpoxy[3] = { 8.0 , 1.0 , 6.0 }; + Float_t wEpoxy[3] = { 3.0 , 19.0 , 18.0 }; + Float_t dEpoxy = 1.8 ; + AliMixture(57,"Epoxy", aEpoxy,zEpoxy,dEpoxy,-3,wEpoxy); + // Araldite, low density epoxy (C18H19O3) + Float_t aAral[3] = { 15.9994, 1.0079, 12.011 }; + Float_t zAral[3] = { 8.0 , 1.0 , 6.0 }; + Float_t wAral[3] = { 3.0 , 19.0 , 18.0 }; + Float_t dAral = 1.12; // Hardener: 1.15, epoxy: 1.1, mixture: 1/2 + AliMixture(58,"Araldite", aAral, zAral, dAral, -3,wAral ); + // Mylar + Float_t aMy[3] = { 12.011 , 1.0 , 15.9994 }; + Float_t zMy[3] = { 6.0 , 1.0 , 8.0 }; + Float_t wMy[3] = { 5.0 , 4.0 , 2.0 }; + Float_t dMy = 1.39; + AliMixture(59,"Mylar", aMy, zMy, dMy, -3,wMy ); + // Polypropylene (C3H6) for radiator fibers + Float_t app[2] = { 12.011 , 1.0079 }; + Float_t zpp[2] = { 6.0 , 1.0 }; + Float_t wpp[2] = { 3.0 , 6.0 }; + Float_t dpp = 0.068; + AliMixture(60,"Polypropylene",app, zpp, dpp, -2,wpp ); + // Aramide for honeycomb + Float_t aAra[4] = { 1.0079, 12.011 , 15.9994, 14.0067 }; + Float_t zAra[4] = { 1.0 , 6.0 , 8.0 , 7.0 }; + Float_t wAra[4] = { 3.0 , 1.0 , 1.0 , 1.0 }; + Float_t dAra = 0.032; + AliMixture(61,"Aramide", aAra, zAra, dAra, -4,wAra ); + // GFK for Wacosit (Epoxy + Si) + Float_t aGFK[4] = { 1.0079, 12.011 , 15.9994, 28.086 }; + Float_t zGFK[4] = { 1.0 , 6.0 , 8.0 , 14.0 }; + Float_t wGFK[4] = { 0.0445, 0.5031, 0.1118, 0.340 }; + Float_t dGFK = 2.0; + AliMixture(62,"GFK", aGFK, zGFK, dGFK, 4,wGFK ); + ////////////////////////////////////////////////////////////////////////// // Tracking Media Parameters ////////////////////////////////////////////////////////////////////////// + // General tracking parameter + Float_t tmaxfd = -10.0; + Float_t stemax = -1.0e10; + Float_t deemax = -0.1; + Float_t epsil = 1.0e-4; + Float_t stmin = -0.001; + // Al Frame - AliMedium(1, "Al Frame", 1, 0, isxfld, sxmgmx - , tmaxfd, stemax, deemax, epsil, stmin); + AliMedium( 1,"Al Frame" , 1,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); // Air - AliMedium(2, "Air", 2, 0, isxfld, sxmgmx - , tmaxfd, stemax, deemax, epsil, stmin); - // Polyethilene - AliMedium(3, "Radiator", 3, 0, isxfld, sxmgmx - , tmaxfd, stemax, deemax, epsil, stmin); - // Xe - AliMedium(4, "Xe", 4, 1, isxfld, sxmgmx - , tmaxfd, stemax, deemax, epsil, stmin); + AliMedium( 2,"Air" ,51,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // Wires + AliMedium( 3,"Wires" , 2,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // All other ROB materials (caps, etc.) + AliMedium( 4,"ROB Other" , 2,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); // Cu pads - AliMedium(5, "Padplane", 5, 1, isxfld, sxmgmx - , tmaxfd, stemax, deemax, epsil, stmin); + AliMedium( 5,"Padplane" , 2,1,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); // Fee + cables - AliMedium(6, "Readout", 1, 0, isxfld, sxmgmx - , tmaxfd, stemax, deemax, epsil, stmin); - // C frame - AliMedium(7, "C Frame", 6, 0, isxfld, sxmgmx - , tmaxfd, stemax, deemax, epsil, stmin); - // Mylar foils - AliMedium(8, "Mylar", 7, 0, isxfld, sxmgmx - , tmaxfd, stemax, deemax, epsil, stmin); - if (fGasMix == 1) { - // Gas-mixture (Xe/CO2) - AliMedium(9, "Gas-mix", 10, 1, isxfld, sxmgmx - , tmaxfd, stemax, deemax, epsil, stmin); - } - else { - // Gas-mixture (Xe/Isobutane) - AliMedium(9, "Gas-mix", 11, 1, isxfld, sxmgmx - , tmaxfd, stemax, deemax, epsil, stmin); - } - // Nomex-honeycomb (use carbon for the time being) - AliMedium(10, "Nomex", 6, 0, isxfld, sxmgmx - , tmaxfd, stemax, deemax, epsil, stmin); - // Kapton foils (use Mylar for the time being) - AliMedium(11, "Kapton", 7, 0, isxfld, sxmgmx - , tmaxfd, stemax, deemax, epsil, stmin); - // Gas-filling of the radiator - AliMedium(12, "CO2", 8, 0, isxfld, sxmgmx - , tmaxfd, stemax, deemax, epsil, stmin); + AliMedium( 6,"Readout" , 2,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // C frame (Wacosit) + AliMedium( 7,"Wacosit" ,62,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // INOX of cooling bus bars + AliMedium( 8,"Cooling bus", 7,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // Gas-mixture (Xe/CO2) + AliMedium( 9,"Gas-mix" ,53,1,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // Honeycomb + AliMedium(10,"Honeycomb" ,61,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // Araldite glue + AliMedium(11,"Glue" ,58,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); // G10-plates - AliMedium(13, "G10-plates",12, 0, isxfld, sxmgmx - , tmaxfd, stemax, deemax, epsil, stmin); + AliMedium(13,"G10-plates" ,54,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); // Cooling water - AliMedium(14, "Water", 13, 0, isxfld, sxmgmx - , tmaxfd, stemax, deemax, epsil, stmin); - // Rohacell (plexiglas) for the radiator - AliMedium(15, "Rohacell", 14, 0, isxfld, sxmgmx - , tmaxfd, stemax, deemax, epsil, stmin); + AliMedium(14,"Water" ,55,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // Rohacell for the radiator + AliMedium(15,"Rohacell" ,56,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // Al layer in MCMs + AliMedium(16,"MCM-Al" , 1,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // Sn layer in MCMs + AliMedium(17,"MCM-Sn" , 5,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // Cu layer in MCMs + AliMedium(18,"MCM-Cu" , 2,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // G10 layer in MCMs + AliMedium(19,"MCM-G10" ,54,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // Si in readout chips + AliMedium(20,"Chip-Si" , 6,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // Epoxy in readout chips + AliMedium(21,"Chip-Ep" ,57,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // PE in connectors + AliMedium(22,"Conn-PE" ,52,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // Cu in connectors + AliMedium(23,"Chip-Cu" , 2,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // Al of cooling pipes + AliMedium(24,"Cooling" , 1,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // Cu in services + AliMedium(25,"Serv-Cu" , 2,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // Carbon fiber mat + AliMedium(26,"Carbon" , 4,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // Mylar foil + AliMedium(27,"Mylar" ,59,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); + // Polypropylene fibers + AliMedium(28,"Fiber" ,60,0,isxfld,sxmgmx + ,tmaxfd,stemax,deemax,epsil,stmin); // Save the density values for the TRD absorbtion + Float_t dmy = 1.39; fFoilDensity = dmy; - if (fGasMix == 1) - fGasDensity = dgm1; - else - fGasDensity = dgm2; - -} - -//_____________________________________________________________________________ -void AliTRD::DrawModule() -{ - // - // Draw a shaded view of the Transition Radiation Detector version 0 - // - - // Set everything unseen - gMC->Gsatt("*" ,"SEEN",-1); - - // Set ALIC mother transparent - gMC->Gsatt("ALIC","SEEN", 0); - - // Set the volumes visible - if (fGeometry->IsVersion() == 0) { - gMC->Gsatt("B071","SEEN", 0); - gMC->Gsatt("B074","SEEN", 0); - gMC->Gsatt("B075","SEEN", 0); - gMC->Gsatt("B077","SEEN", 0); - gMC->Gsatt("BTR1","SEEN", 0); - gMC->Gsatt("BTR2","SEEN", 0); - gMC->Gsatt("BTR3","SEEN", 0); - gMC->Gsatt("TRD1","SEEN", 0); - gMC->Gsatt("TRD2","SEEN", 0); - gMC->Gsatt("TRD3","SEEN", 0); + if (AliTRDCommonParam::Instance()->IsXenon()) { + fGasDensity = dgmXe; + fGasNobleFraction = fxc; } - else { - gMC->Gsatt("B071","SEEN", 0); - gMC->Gsatt("B074","SEEN", 0); - gMC->Gsatt("B075","SEEN", 0); - gMC->Gsatt("B077","SEEN", 0); - gMC->Gsatt("BTR1","SEEN", 0); - gMC->Gsatt("BTR2","SEEN", 0); - gMC->Gsatt("BTR3","SEEN", 0); - gMC->Gsatt("TRD1","SEEN", 0); - if (fGeometry->GetPHOShole()) - gMC->Gsatt("TRD2","SEEN", 0); - if (fGeometry->GetRICHhole()) - gMC->Gsatt("TRD3","SEEN", 0); + else if (AliTRDCommonParam::Instance()->IsArgon()) { + fGasDensity = dgmAr; + fGasNobleFraction = fac; } - gMC->Gsatt("UCII","SEEN", 0); - gMC->Gsatt("UCIM","SEEN", 0); - gMC->Gsatt("UCIO","SEEN", 0); - gMC->Gsatt("UL02","SEEN", 1); - gMC->Gsatt("UL05","SEEN", 1); - gMC->Gsatt("UL06","SEEN", 1); - - gMC->Gdopt("hide", "on"); - gMC->Gdopt("shad", "on"); - gMC->Gsatt("*", "fill", 7); - gMC->SetClipBox("."); - gMC->SetClipBox("*", 0, 2000, -2000, 2000, -2000, 2000); - gMC->DefaultRange(); - gMC->Gdraw("alic", 40, 30, 0, 12, 9.4, .021, .021); - gMC->Gdhead(1111, "Transition Radiation Detector"); - gMC->Gdman(18, 4, "MAN"); - -} - -//_____________________________________________________________________________ -Int_t AliTRD::DistancetoPrimitive(Int_t , Int_t ) -{ - // - // Distance between the mouse and the TRD detector on the screen - // Dummy routine - - return 9999; } @@ -819,300 +547,118 @@ void AliTRD::Init() // Initialize the TRD detector after the geometry has been created // - Int_t i; - - if(fDebug) { - printf("\n%s: ",ClassName()); - for (i = 0; i < 35; i++) printf("*"); - printf(" TRD_INIT "); - for (i = 0; i < 35; i++) printf("*"); - printf("\n"); - } + AliDebug(1,"++++++++++++++++++++++++++++++++++++++++++++++"); - if (fGeometry->IsVersion() == 0) { - printf("%s: Geometry for spaceframe with holes initialized\n",ClassName()); - } - else if (fGeometry->IsVersion() == 1) { - printf("%s: Geometry for spaceframe without holes initialized\n",ClassName()); - if (fGeometry->GetPHOShole()) - printf("%s: Leave space in front of PHOS free\n",ClassName()); - if (fGeometry->GetRICHhole()) - printf("%s: Leave space in front of RICH free\n",ClassName()); + if (fGeometry->IsVersion() != 1) { + AliError("Not a valid geometry"); } - - if (fGasMix == 1) - printf("%s: Gas Mixture: 85%% Xe + 15%% CO2\n",ClassName()); - else - printf("%s: Gas Mixture: 97%% Xe + 3%% Isobutane\n",ClassName()); } //_____________________________________________________________________________ -void AliTRD::LoadPoints(Int_t track) +void AliTRD::ResetDigits() { // - // Store x, y, z of all hits in memory. - // Hit originating from TR photons are given a different color + // Reset number of digits and the digits array for this detector // - if (!fDrawTR) { - AliDetector::LoadPoints(track); - return; - } - - if (fHits == 0) return; - - Int_t nhits = fHits->GetEntriesFast(); - if (nhits == 0) return; - - Int_t tracks = gAlice->GetNtrack(); - if (fPoints == 0) fPoints = new TObjArray(tracks); - - AliTRDhit *ahit; - - Int_t *ntrkE = new Int_t[tracks]; - Int_t *ntrkT = new Int_t[tracks]; - Int_t *limiE = new Int_t[tracks]; - Int_t *limiT = new Int_t[tracks]; - Float_t **coorE = new Float_t*[tracks]; - Float_t **coorT = new Float_t*[tracks]; - for(Int_t i = 0; i < tracks; i++) { - ntrkE[i] = 0; - ntrkT[i] = 0; - coorE[i] = 0; - coorT[i] = 0; - limiE[i] = 0; - limiT[i] = 0; - } - - AliTRDpoints *points = 0; - Float_t *fp = 0; - Int_t trk; - Int_t chunk = nhits / 4 + 1; - - // Loop over all the hits and store their position - for (Int_t hit = 0; hit < nhits; hit++) { - - ahit = (AliTRDhit *) fHits->UncheckedAt(hit); - - // dEdx hits - if (ahit->FromDrift() || ahit->FromAmplification()) { - - trk = ahit->GetTrack(); - if (ntrkE[trk] == limiE[trk]) { - // Initialise a new track - fp = new Float_t[3*(limiE[trk]+chunk)]; - if (coorE[trk]) { - memcpy(fp,coorE[trk],sizeof(Float_t)*3*limiE[trk]); - delete [] coorE[trk]; - } - limiE[trk] += chunk; - coorE[trk] = fp; - } - else { - fp = coorE[trk]; - } - fp[3*ntrkE[trk] ] = ahit->X(); - fp[3*ntrkE[trk]+1] = ahit->Y(); - fp[3*ntrkE[trk]+2] = ahit->Z(); - ntrkE[trk]++; - - } - // TR photon hits - else if (ahit->FromTRphoton()) { - - trk = ahit->GetTrack(); - if (ntrkT[trk] == limiT[trk]) { - // Initialise a new track - fp = new Float_t[3*(limiT[trk]+chunk)]; - if (coorT[trk]) { - memcpy(fp,coorT[trk],sizeof(Float_t)*3*limiT[trk]); - delete [] coorT[trk]; - } - limiT[trk] += chunk; - coorT[trk] = fp; - } - else { - fp = coorT[trk]; - } - fp[3*ntrkT[trk] ] = ahit->X(); - fp[3*ntrkT[trk]+1] = ahit->Y(); - fp[3*ntrkT[trk]+2] = ahit->Z(); - ntrkT[trk]++; - - } - - } - - for (trk = 0; trk < tracks; ++trk) { - - if (ntrkE[trk] || ntrkT[trk]) { - - points = new AliTRDpoints(); - points->SetDetector(this); - points->SetParticle(trk); - - // Set the dEdx points - if (ntrkE[trk]) { - points->SetMarkerColor(GetMarkerColor()); - points->SetMarkerSize(GetMarkerSize()); - points->SetPolyMarker(ntrkE[trk],coorE[trk],GetMarkerStyle()); - delete [] coorE[trk]; - coorE[trk] = 0; - } - - // Set the TR photon points - if (ntrkT[trk]) { - points->SetTRpoints(ntrkT[trk],coorT[trk]); - delete [] coorT[trk]; - coorT[trk] = 0; - } - - fPoints->AddAt(points,trk); - - } + fNdigits = 0; + if (fDigits) { + fDigits->Clear(); } - delete [] coorE; - delete [] coorT; - delete [] ntrkE; - delete [] ntrkT; - delete [] limiE; - delete [] limiT; - } //_____________________________________________________________________________ -void AliTRD::MakeBranch(Option_t* option, const char *file) +void AliTRD::SetTreeAddress() { // - // Create Tree branches for the TRD digits and cluster. + // Set the branch addresses for the trees. // - //Int_t buffersize = 4000; - //Char_t branchname[15]; - - AliDetector::MakeBranch(option,file); - - Int_t buffersize = 64000; - - fDigitsArray = new AliTRDdataArrayI(); - MakeBranchInTree(gAlice->TreeD() - ,"TRDdigits", fDigitsArray->IsA()->GetName() - ,&fDigitsArray,buffersize,99,file); - - for (Int_t iDict = 0; iDict < AliTRDdigitsManager::NDict(); iDict++) { - Char_t branchname[15]; - sprintf(branchname,"TRDdictionary%d",iDict); - fDictionaryArray[iDict] = new AliTRDdataArrayI(); - MakeBranchInTree(gAlice->TreeD() - ,branchname,fDictionaryArray[iDict]->IsA()->GetName() - ,&fDictionaryArray[iDict],buffersize,99,file); + if (fLoader->TreeH() && + (fHits == 0x0)) { + fHits = new TClonesArray("AliTRDhit",405); } + AliDetector::SetTreeAddress(); + } //_____________________________________________________________________________ -void AliTRD::ResetDigits() +Bool_t AliTRD::Raw2SDigits(AliRawReader *rawReader) { // - // Resets the digits + // Converts RAW data to SDigits // - if (gAlice->TreeD()) { - TBranch *branch; - branch = gAlice->TreeD()->GetBranch("TRDdigits"); - if (branch) { - branch->Reset(); - for (Int_t iDict = 0; iDict < AliTRDdigitsManager::NDict(); iDict++) { - Char_t branchname[15]; - sprintf(branchname,"TRDdictionary%d",iDict); - branch = gAlice->TreeD()->GetBranch(branchname); - branch->Reset(); - } - } + AliLoader *loader = fRunLoader->GetLoader("TRDLoader"); + if (!loader) { + AliError("Can not get TRD loader from Run Loader"); + return kFALSE; + } + + TTree *tree = 0; + tree = loader->TreeS(); + if (!tree) { + loader->MakeTree("S"); + tree = loader->TreeS(); } -} + AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class"); -//_____________________________________________________________________________ -void AliTRD::ResetRecPoints() -{ - // - // Reset number of reconstructed points and the point array - // + AliTRDrawData *rawdata = new AliTRDrawData(); + AliTRDdigitsManager *digitsManager = rawdata->Raw2Digits(rawReader); - if (fRecPoints) { - fNRecPoints = 0; - Int_t nentr = fRecPoints->GetEntriesFast(); - for (Int_t i = 0; i < nentr; i++) delete fRecPoints->RemoveAt(i); - } + // Create the s-digits manager + AliTRDdigitsManager *sdigitsManager = new AliTRDdigitsManager(); -} + if (sdigitsManager) { -//_____________________________________________________________________________ -void AliTRD::SetTreeAddress() -{ - // - // Set the branch addresses for the trees. - // + sdigitsManager->SetSDigits(kTRUE); + sdigitsManager->CreateArrays(); - Char_t branchname[15]; + // Convert the digits into s-digits + digitizer.Digits2SDigits(digitsManager,sdigitsManager); - AliDetector::SetTreeAddress(); + sdigitsManager->MakeBranch(tree); + sdigitsManager->WriteDigits(); - TBranch *branch; - TTree *treeR = gAlice->TreeR(); + delete digitsManager; - if (treeR) { - sprintf(branchname,"%scluster",GetName()); - if (fRecPoints) { - branch = treeR->GetBranch(branchname); - if (branch) { - branch->SetAddress(&fRecPoints); - } - } - } + return kTRUE; -} + } + else { -//_____________________________________________________________________________ -void AliTRD::SetGasMix(Int_t imix) -{ - // - // Defines the gas mixture (imix=0: Xe/Isobutane imix=1: Xe/CO2) - // - - if ((imix < 0) || (imix > 1)) { - printf("Wrong input value: %d\n",imix); - printf("Use standard setting\n"); - fGasMix = 1; - return; - } + return kFALSE; - fGasMix = imix; + } } //_____________________________________________________________________________ -void AliTRD::SetPHOShole() +AliLoader *AliTRD::MakeLoader(const Char_t *topfoldername) { // - // Selects a geometry with a hole in front of the PHOS + // Create a loader for the TRD tracklets // - fGeometry->SetPHOShole(); + fLoader = new AliLoader(GetName(),topfoldername); -} + AliInfo("Adding Tracklets-loader"); -//_____________________________________________________________________________ -void AliTRD::SetRICHhole() -{ - // - // Selects a geometry with a hole in front of the RICH - // + AliDataLoader *dl = new AliDataLoader("TRD.Tracklets.root" + ,"tracklets" + ,"tracklets"); + fLoader->AddDataLoader(dl); - fGeometry->SetRICHhole(); + dl = new AliDataLoader("TRD.GtuTracks.root" + ,"gtutracks" + ,"gtutracks"); + fLoader->AddDataLoader(dl); + + return fLoader; } @@ -1123,7 +669,10 @@ AliTRD &AliTRD::operator=(const AliTRD &trd) // Assignment operator // - if (this != &trd) ((AliTRD &) trd).Copy(*this); + if (this != &trd) { + ((AliTRD &) trd).Copy(*this); + } + return *this; -} +}