X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TRD%2FAliTRD.cxx;h=ec84e956c036453d2fc17f4fd9ba55846da8e109;hb=2ab0c72500f5baaae8a0a5299ab6566b50c278b4;hp=583cf96403187208d7fb5153695aa3cc53e407a0;hpb=8459a4543e6040b30fa13048e12129b81686552f;p=u%2Fmrichter%2FAliRoot.git diff --git a/TRD/AliTRD.cxx b/TRD/AliTRD.cxx index 583cf964031..ec84e956c03 100644 --- a/TRD/AliTRD.cxx +++ b/TRD/AliTRD.cxx @@ -15,6 +15,73 @@ /* $Log$ +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 @@ -30,29 +97,36 @@ Introduction of the Copyright and cvs Log // // // Transition Radiation Detector // // This class contains the basic functions for the Transition Radiation // -// Detector, as well as the geometry. // -// Functions specific to one particular geometry are contained in the // -// derived classes. // -// // -//Begin_Html -/* - -*/ -//End_Html -// // +// Detector. // // // /////////////////////////////////////////////////////////////////////////////// #include +#include #include #include +#include +#include #include -#include "AliTRD.h" #include "AliRun.h" #include "AliConst.h" +#include "AliDigit.h" +#include "AliMagF.h" +#include "AliMC.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 "AliTRDdigitsManager.h" + ClassImp(AliTRD) //_____________________________________________________________________________ @@ -62,41 +136,21 @@ AliTRD::AliTRD() // Default constructor // - Int_t iplan; - fIshunt = 0; fGasMix = 0; fHits = 0; fDigits = 0; - fHole = 0; - - fClusters = 0; - fNclusters = 0; - - // The chamber dimensions - for (iplan = 0; iplan < kNplan; iplan++) { - fClengthI[iplan] = 0.; - fClengthM1[iplan] = 0.; - fClengthM2[iplan] = 0.; - fClengthO1[iplan] = 0.; - fClengthO2[iplan] = 0.; - fClengthO3[iplan] = 0.; - fCwidth[iplan] = 0.; - } - for (iplan = 0; iplan < kNplan; iplan++) { - for (Int_t icham = 0; icham < kNcham; icham++) { - for (Int_t isect = 0; isect < kNsect; isect++) { - fRowMax[iplan][icham][isect] = 0; - } - } - fColMax[iplan] = 0; - } - fTimeMax = 0; + fRecPoints = 0; + fNRecPoints = 0; + + fGeometry = 0; - fRowPadSize = 0; - fColPadSize = 0; - fTimeBinSize = 0; + fGasDensity = 0; + fFoilDensity = 0; + + fDrawTR = 0; + fDisplayType = 0; } @@ -108,66 +162,63 @@ AliTRD::AliTRD(const char *name, const char *title) // Standard constructor for the TRD // - Int_t iplan; - // Check that FRAME is there otherwise we have no place where to // put TRD - AliModule* FRAME=gAlice->GetModule("FRAME"); - if (!FRAME) { + AliModule* frame = gAlice->GetModule("FRAME"); + if (!frame) { Error("Ctor","TRD needs FRAME to be present\n"); exit(1); } // Define the TRD geometry according to the FRAME geometry - if (FRAME->IsVersion() == 0) - // With hole - fHole = 1; - else - // Without hole - fHole = 0; + if (frame->IsVersion() == 0) { + // Geometry with hole + fGeometry = new AliTRDgeometryHole(); + } + else if (frame->IsVersion() == 1) { + // Geometry without hole + fGeometry = new AliTRDgeometryFull(); + } + else { + Error("Ctor","Could not find valid FRAME version\n"); + exit(1); + } // Allocate the hit array - fHits = new TClonesArray("AliTRDhit" , 405); + fHits = new TClonesArray("AliTRDhit" ,405); + gAlice->AddHitList(fHits); // Allocate the digits array - fDigits = new TClonesArray("AliTRDdigit" ,10000); + fDigits = 0; - // Allocate the cluster array - fClusters = new TClonesArray("AliTRDcluster", 400); - fNclusters = 0; + // Allocate the rec point array + fRecPoints = new TObjArray(400); + fNRecPoints = 0; - fIshunt = 0; - fGasMix = 0; - - // The chamber dimensions - for (iplan = 0; iplan < kNplan; iplan++) { - fClengthI[iplan] = 0.; - fClengthM1[iplan] = 0.; - fClengthM2[iplan] = 0.; - fClengthO1[iplan] = 0.; - fClengthO2[iplan] = 0.; - fClengthO3[iplan] = 0.; - fCwidth[iplan] = 0.; - } - - for (iplan = 0; iplan < kNplan; iplan++) { - for (Int_t icham = 0; icham < kNcham; icham++) { - for (Int_t isect = 0; isect < kNsect; isect++) { - fRowMax[iplan][icham][isect] = 0; - } - } - fColMax[iplan] = 0; - } - fTimeMax = 0; + fIshunt = 0; + fGasMix = 0; - fRowPadSize = 0; - fColPadSize = 0; - fTimeBinSize = 0; + fGasDensity = 0; + fFoilDensity = 0; + + fDrawTR = 0; + fDisplayType = 0; SetMarkerColor(kWhite); } +//_____________________________________________________________________________ +AliTRD::AliTRD(const AliTRD &trd) +{ + // + // Copy constructor + // + + ((AliTRD &) trd).Copy(*this); + +} + //_____________________________________________________________________________ AliTRD::~AliTRD() { @@ -177,45 +228,90 @@ AliTRD::~AliTRD() fIshunt = 0; + delete fGeometry; delete fHits; - delete fDigits; - delete fClusters; + delete fRecPoints; } //_____________________________________________________________________________ -void AliTRD::AddCluster(Int_t *tracks, Int_t *clusters, Float_t *position) +void AliTRD::AddRecPoint(Float_t *pos, Int_t *digits, Int_t det, Float_t amp + , Int_t *tracks) { // - // Add a cluster for the TRD - // + // Add a reconstructed point for the TRD + // + + AliTRDrecPoint *recPoint = new AliTRDrecPoint(); + TVector3 posVec(pos[0],pos[1],pos[2]); + recPoint->SetLocalPosition(posVec); + recPoint->SetDetector(det); + recPoint->SetEnergy(amp); + for (Int_t iDigit = 0; iDigit < 3; iDigit++) { + recPoint->AddDigit(digits[iDigit]); + } + + recPoint->AddTrackIndex(tracks); - TClonesArray &lclusters = *fClusters; - new(lclusters[fNclusters++]) AliTRDcluster(tracks,clusters,position); + recPoint->SetTrackingYZ(0.,0.); // variance values set inside + fRecPoints->Add(recPoint); } +//___________________________________________ +void AliTRD::SDigits2Digits() +{ + // + // Create digits + // + AliTRDdigitizer *Digitizer = new AliTRDdigitizer("digitizer","TRD digitizer class"); + + // Set the parameter + Digitizer->SetDiffusion(); + Digitizer->SetVerbose(1); + + //Digitizer->SetExB(); + //Digitizer->SetElAttach(); + //Digitizer->SetAttachProb(); + + Digitizer->InitDetector(); + + // Create the digits + Digitizer->MakeDigits(); + cout<<"After MakeDigits"<Digits()->MakeBranch(fDigitsFile)) + { + Digitizer->WriteDigits(); + cout<<"After write digits"<Write(); + cout<<"After write digitizer"<GetGeometry()->GetNode("alice"); + top = gAlice->GetGeometry()->GetNode("alice"); - pgon = new TPGON("S_TRD","TRD","void",0,360,kNsect,4); - Float_t ff = TMath::Cos(kDegrad * 180 / kNsect); - Float_t rrmin = kRmin / ff; - Float_t rrmax = kRmax / ff; - pgon->DefineSection(0,-kZmax1,rrmax,rrmax); - pgon->DefineSection(1,-kZmax2,rrmin,rrmax); - pgon->DefineSection(2, kZmax2,rrmin,rrmax); - pgon->DefineSection(3, kZmax1,rrmax,rrmax); - Top->cd(); - Node = new TNode("TRD","TRD","S_TRD",0,0,0,""); - Node->SetLineColor(kColorTRD); - fNodes->Add(Node); + switch (fDisplayType) { + + case 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); + + break; + + case 1: + + Float_t slope = (AliTRDgeometry::Zmax1() - AliTRDgeometry::Zmax2()) + / (AliTRDgeometry::Rmax() - AliTRDgeometry::Rmin()); + + rmin = AliTRDgeometry::Rmin() + AliTRDgeometry::RaThick(); + rmax = rmin + AliTRDgeometry::DrThick(); + zmax2 = AliTRDgeometry::Zmax2() + slope * AliTRDgeometry::RaThick(); + zmax1 = zmax2 + slope * AliTRDgeometry::DrThick(); + Char_t name[7]; + + for (Int_t iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) { + + sprintf(name,"S_TRD%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; + + } + + break; + + }; } //_____________________________________________________________________________ -void AliTRD::CreateGeometry() +void AliTRD::Copy(TObject &trd) { // - // Creates the volumes for the TRD chambers - // - // Author: Christoph Blume (C.Blume@gsi.de) 20/07/99 - // - // The volumes: - // TRD1-3 (Air) --- The TRD mother volumes for one sector. - // To be placed into the spaceframe. - // - // UAFI(/M/O) (Al) --- The aluminum frame of the inner(/middle/outer) chambers (readout) - // UCFI(/M/O) (C) --- The carbon frame of the inner(/middle/outer) chambers - // (driftchamber + radiator) - // UAII(/M/O) (Air) --- The inner part of the readout of the inner(/middle/outer) chambers - // UFII(/M/O) (Air) --- The inner part of the chamner and radiator of the - // inner(/middle/outer) chambers + // Copy function // - // The material layers in one chamber: - // UL01 (G10) --- The gas seal of the radiator - // UL02 (CO2) --- The gas in the radiator - // UL03 (PE) --- The foil stack - // UL04 (Mylar) --- Entrance window to the driftvolume and HV-cathode - // UL05 (Xe) --- The driftvolume - // UL06 (Xe) --- The amplification region - // - // UL07 (Cu) --- The pad plane - // UL08 (G10) --- The Nomex honeycomb support structure - // UL09 (Cu) --- FEE and signal lines - // UL10 (PE) --- The cooling devices - // UL11 (Water) --- The cooling water - // Check that FRAME is there otherwise we have no place where to put the TRD - AliModule* FRAME = gAlice->GetModule("FRAME"); - if (!FRAME) return; - - Int_t iplan; - - const Int_t npar_trd = 4; - const Int_t npar_cha = 3; - - Float_t par_dum[3]; - Float_t par_trd[npar_trd]; - Float_t par_cha[npar_cha]; - - Float_t xpos, ypos, zpos; - - Int_t *idtmed = fIdtmed->GetArray() - 1299; - - // The length of the inner chambers - for (iplan = 0; iplan < kNplan; iplan++) - fClengthI[iplan] = 110.0; - - // The length of the middle chambers - fClengthM1[0] = 123.5; - fClengthM1[1] = 131.0; - fClengthM1[2] = 138.5; - fClengthM1[3] = 146.0; - fClengthM1[4] = 153.0; - fClengthM1[5] = 160.5; - - fClengthM2[0] = 123.5 - 7.0; - fClengthM2[1] = 131.0 - 7.0; - fClengthM2[2] = 138.5 - 7.0; - fClengthM2[3] = 146.0 - 7.0; - fClengthM2[4] = 153.0 - 7.0; - fClengthM2[5] = 160.4 - 7.0; - - // The length of the outer chambers - fClengthO1[0] = 123.5; - fClengthO1[1] = 131.0; - fClengthO1[2] = 134.5; - fClengthO1[3] = 142.0; - fClengthO1[4] = 142.0; - fClengthO1[5] = 134.5; - - fClengthO2[0] = 123.5; - fClengthO2[1] = 131.0; - fClengthO2[2] = 134.5; - fClengthO2[3] = 142.0; - fClengthO2[4] = 142.0; - fClengthO2[5] = 134.5; - - fClengthO3[0] = 86.5; - fClengthO3[1] = 101.5; - fClengthO3[2] = 112.5; - fClengthO3[3] = 127.5; - fClengthO3[4] = 134.5; - fClengthO3[5] = 134.5; - - // The width of the chambers - fCwidth[0] = 99.6; - fCwidth[1] = 104.1; - fCwidth[2] = 108.5; - fCwidth[3] = 112.9; - fCwidth[4] = 117.4; - fCwidth[5] = 121.8; - - // The TRD mother volume for one sector (Air) (dimensions identical to BTR1) - par_trd[0] = kSwidth1/2.; - par_trd[1] = kSwidth2/2.; - par_trd[2] = kSlenTR1/2.; - par_trd[3] = kSheight/2.; - gMC->Gsvolu("TRD1","TRD1",idtmed[1302-1],par_trd,npar_trd); - - // The TRD mother volume for one sector (Air) (dimensions identical to BTR2 + BTR3). - // Only used for the geometry with holes. - if (fHole) { - - par_trd[0] = kSwidth1/2.; - par_trd[1] = kSwidth2/2.; - par_trd[2] = kSlenTR2/2.; - par_trd[3] = kSheight/2.; - gMC->Gsvolu("TRD2","TRD1",idtmed[1302-1],par_trd,npar_trd); - - par_trd[0] = kSwidth1/2.; - par_trd[1] = kSwidth2/2.; - par_trd[2] = kSlenTR3/2.; - par_trd[3] = kSheight/2.; - gMC->Gsvolu("TRD3","TRD1",idtmed[1302-1],par_trd,npar_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; - } - - // The aluminum frames - readout + electronics (Al) - // The inner chambers - gMC->Gsvolu("UAFI","BOX ",idtmed[1301-1],par_dum,0); - // The middle chambers - gMC->Gsvolu("UAFM","BOX ",idtmed[1301-1],par_dum,0); - // The outer chambers - gMC->Gsvolu("UAFO","BOX ",idtmed[1301-1],par_dum,0); - - // The inner part of the aluminum frames (Air) - // The inner chambers - gMC->Gsvolu("UAII","BOX ",idtmed[1302-1],par_dum,0); - // The middle chambers - gMC->Gsvolu("UAIM","BOX ",idtmed[1302-1],par_dum,0); - // The outer chambers - gMC->Gsvolu("UAIO","BOX ",idtmed[1302-1],par_dum,0); - - // The carbon frames - radiator + driftchamber (C) - // The inner chambers - gMC->Gsvolu("UCFI","BOX ",idtmed[1307-1],par_dum,0); - // The middle chambers - gMC->Gsvolu("UCFM","BOX ",idtmed[1307-1],par_dum,0); - // The outer chambers - gMC->Gsvolu("UCFO","BOX ",idtmed[1307-1],par_dum,0); - - // The inner part of the carbon frames (Air) - // The inner chambers - gMC->Gsvolu("UCII","BOX ",idtmed[1302-1],par_dum,0); - // The middle chambers - gMC->Gsvolu("UCIM","BOX ",idtmed[1302-1],par_dum,0); - // The outer chambers - gMC->Gsvolu("UCIO","BOX ",idtmed[1302-1],par_dum,0); - - // The material layers inside the chambers - par_cha[0] = -1.; - par_cha[1] = -1.; - // G10 layer (radiator seal) - par_cha[2] = kSeThick/2; - gMC->Gsvolu("UL01","BOX ",idtmed[1313-1],par_cha,npar_cha); - // CO2 layer (radiator) - par_cha[2] = kRaThick/2; - gMC->Gsvolu("UL02","BOX ",idtmed[1312-1],par_cha,npar_cha); - // PE layer (radiator) - par_cha[2] = kPeThick/2; - gMC->Gsvolu("UL03","BOX ",idtmed[1303-1],par_cha,npar_cha); - // Mylar layer (entrance window + HV cathode) - par_cha[2] = kMyThick/2; - gMC->Gsvolu("UL04","BOX ",idtmed[1308-1],par_cha,npar_cha); - // Xe/Isobutane layer (drift volume, sensitive) - par_cha[2] = kDrThick/2.; - gMC->Gsvolu("UL05","BOX ",idtmed[1309-1],par_cha,npar_cha); - // Xe/Isobutane layer (amplification volume, not sensitive) - par_cha[2] = kAmThick/2.; - gMC->Gsvolu("UL06","BOX ",idtmed[1309-1],par_cha,npar_cha); - - // Cu layer (pad plane) - par_cha[2] = kCuThick/2; - gMC->Gsvolu("UL07","BOX ",idtmed[1305-1],par_cha,npar_cha); - // G10 layer (support structure) - par_cha[2] = kSuThick/2; - gMC->Gsvolu("UL08","BOX ",idtmed[1313-1],par_cha,npar_cha); - // Cu layer (FEE + signal lines) - par_cha[2] = kFeThick/2; - gMC->Gsvolu("UL09","BOX ",idtmed[1305-1],par_cha,npar_cha); - // PE layer (cooling devices) - par_cha[2] = kCoThick/2; - gMC->Gsvolu("UL10","BOX ",idtmed[1303-1],par_cha,npar_cha); - // Water layer (cooling) - par_cha[2] = kWaThick/2; - gMC->Gsvolu("UL11","BOX ",idtmed[1314-1],par_cha,npar_cha); - - // Position the layers in the chambers - xpos = 0; - ypos = 0; - - // G10 layer (radiator seal) - zpos = kSeZpos; - gMC->Gspos("UL01",1,"UCII",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("UL01",2,"UCIM",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("UL01",3,"UCIO",xpos,ypos,zpos,0,"ONLY"); - // CO2 layer (radiator) - zpos = kRaZpos; - gMC->Gspos("UL02",1,"UCII",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("UL02",2,"UCIM",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("UL02",3,"UCIO",xpos,ypos,zpos,0,"ONLY"); - // PE layer (radiator) - zpos = 0; - gMC->Gspos("UL03",1,"UL02",xpos,ypos,zpos,0,"ONLY"); - // Mylar layer (entrance window + HV cathode) - zpos = kMyZpos; - gMC->Gspos("UL04",1,"UCII",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("UL04",2,"UCIM",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("UL04",3,"UCIO",xpos,ypos,zpos,0,"ONLY"); - // Xe/Isobutane layer (drift volume) - zpos = kDrZpos; - gMC->Gspos("UL05",1,"UCII",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("UL05",2,"UCIM",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("UL05",3,"UCIO",xpos,ypos,zpos,0,"ONLY"); - // Xe/Isobutane layer (amplification volume) - zpos = kAmZpos; - gMC->Gspos("UL06",1,"UCII",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("UL06",2,"UCIM",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("UL06",3,"UCIO",xpos,ypos,zpos,0,"ONLY"); - - // Cu layer (pad plane) - zpos = kCuZpos; - gMC->Gspos("UL07",1,"UAII",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("UL07",2,"UAIM",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("UL07",3,"UAIO",xpos,ypos,zpos,0,"ONLY"); - // G10 layer (support structure) - zpos = kSuZpos; - gMC->Gspos("UL08",1,"UAII",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("UL08",2,"UAIM",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("UL08",3,"UAIO",xpos,ypos,zpos,0,"ONLY"); - // Cu layer (FEE + signal lines) - zpos = kFeZpos; - gMC->Gspos("UL09",1,"UAII",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("UL09",2,"UAIM",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("UL09",3,"UAIO",xpos,ypos,zpos,0,"ONLY"); - // PE layer (cooling devices) - zpos = kCoZpos; - gMC->Gspos("UL10",1,"UAII",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("UL10",2,"UAIM",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("UL10",3,"UAIO",xpos,ypos,zpos,0,"ONLY"); - // Water layer (cooling) - zpos = kWaZpos; - gMC->Gspos("UL11",1,"UAII",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("UL11",1,"UAIM",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("UL11",1,"UAIO",xpos,ypos,zpos,0,"ONLY"); - - // Position the chambers in the TRD mother volume - for (iplan = 1; iplan <= kNplan; iplan++) { - - // The inner chambers --------------------------------------------------------------- - - // the aluminum frame - par_cha[0] = fCwidth[iplan-1]/2.; - par_cha[1] = fClengthI[iplan-1]/2.; - par_cha[2] = kCaframe/2.; - xpos = 0.; - ypos = 0.; - zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UAFI",iplan ,"TRD1",xpos,ypos,zpos,0,"MANY",par_cha,npar_cha); - - // the inner part of the aluminum frame - par_cha[0] = fCwidth[iplan-1]/2. - kCathick; - par_cha[1] = fClengthI[iplan-1]/2. - kCathick; - par_cha[2] = kCaframe/2.; - xpos = 0.; - ypos = 0.; - zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UAII",iplan ,"TRD1",xpos,ypos,zpos,0,"ONLY",par_cha,npar_cha); - - // the carbon frame - par_cha[0] = fCwidth[iplan-1]/2.; - par_cha[1] = fClengthI[iplan-1]/2.; - par_cha[2] = kCcframe/2.; - xpos = 0.; - ypos = 0.; - zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UCFI",iplan ,"TRD1",xpos,ypos,zpos,0,"MANY",par_cha,npar_cha); - - // the inner part of the carbon frame - par_cha[0] = fCwidth[iplan-1]/2. - kCcthick; - par_cha[1] = fClengthI[iplan-1]/2. - kCcthick; - par_cha[2] = kCcframe/2.; - xpos = 0.; - ypos = 0.; - zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UCII",iplan ,"TRD1",xpos,ypos,zpos,0,"ONLY",par_cha,npar_cha); - - // The middle chambers -------------------------------------------------------------- - - // the aluminum frame - par_cha[0] = fCwidth[iplan-1]/2.; - par_cha[1] = fClengthM1[iplan-1]/2.; - par_cha[2] = kCaframe/2.; - xpos = 0.; - ypos = fClengthI[iplan-1]/2. + fClengthM1[iplan-1]/2.; - zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UAFM",iplan ,"TRD1",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha); - gMC->Gsposp("UAFM",iplan+ kNplan,"TRD1",xpos,-ypos,zpos,0,"MANY",par_cha,npar_cha); - - // the inner part of the aluminum frame - par_cha[0] = fCwidth[iplan-1]/2. - kCathick; - par_cha[1] = fClengthM1[iplan-1]/2. - kCathick; - par_cha[2] = kCaframe/2.; - xpos = 0.; - ypos = fClengthI[iplan-1]/2. + fClengthM1[iplan-1]/2.; - zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UAIM",iplan ,"TRD1",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha); - gMC->Gsposp("UAIM",iplan+ kNplan,"TRD1",xpos,-ypos,zpos,0,"ONLY",par_cha,npar_cha); - - // the carbon frame - par_cha[0] = fCwidth[iplan-1]/2.; - par_cha[1] = fClengthM1[iplan-1]/2.; - par_cha[2] = kCcframe/2.; - xpos = 0.; - ypos = fClengthI[iplan-1]/2. + fClengthM1[iplan-1]/2.; - zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UCFM",iplan ,"TRD1",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha); - gMC->Gsposp("UCFM",iplan+ kNplan,"TRD1",xpos,-ypos,zpos,0,"MANY",par_cha,npar_cha); - - // the inner part of the carbon frame - par_cha[0] = fCwidth[iplan-1]/2. - kCcthick; - par_cha[1] = fClengthM1[iplan-1]/2. - kCcthick; - par_cha[2] = kCcframe/2.; - xpos = 0.; - ypos = fClengthI[iplan-1]/2. + fClengthM1[iplan-1]/2.; - zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UCIM",iplan ,"TRD1",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha); - gMC->Gsposp("UCIM",iplan+ kNplan,"TRD1",xpos,-ypos,zpos,0,"ONLY",par_cha,npar_cha); - - // Only for the geometry with holes - if (fHole) { - - // the aluminum frame - par_cha[0] = fCwidth[iplan-1]/2.; - par_cha[1] = fClengthM2[iplan-1]/2.; - par_cha[2] = kCaframe/2.; - xpos = 0.; - ypos = fClengthM2[iplan-1]/2. - kSlenTR2/2.; - zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UAFM",iplan+2*kNplan,"TRD2",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha); - - // the inner part of the aluminum frame - par_cha[0] = fCwidth[iplan-1]/2. - kCathick; - par_cha[1] = fClengthM2[iplan-1]/2. - kCathick; - par_cha[2] = kCaframe/2.; - xpos = 0.; - ypos = fClengthM2[iplan-1]/2. - kSlenTR2/2.; - zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UAIM",iplan+2*kNplan,"TRD2",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha); - - // the carbon frame - par_cha[0] = fCwidth[iplan-1]/2.; - par_cha[1] = fClengthM2[iplan-1]/2.; - par_cha[2] = kCcframe/2.; - xpos = 0.; - ypos = fClengthM2[iplan-1]/2. - kSlenTR2/2.; - zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UCFM",iplan+2*kNplan,"TRD2",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha); - - // the inner part of the carbon frame - par_cha[0] = fCwidth[iplan-1]/2. - kCcthick; - par_cha[1] = fClengthM2[iplan-1]/2. - kCcthick; - par_cha[2] = kCcframe/2.; - xpos = 0.; - ypos = fClengthM2[iplan-1]/2. - kSlenTR2/2.; - zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UCIM",iplan+2*kNplan,"TRD2",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha); - - } + //AliDetector::Copy(trd); - // The outer chambers --------------------------------------------------------------- - - // the aluminum frame - par_cha[0] = fCwidth[iplan-1]/2.; - par_cha[1] = fClengthO1[iplan-1]/2.; - par_cha[2] = kCaframe/2.; - xpos = 0.; - ypos = fClengthI[iplan-1]/2. + fClengthM1[iplan-1] + fClengthO1[iplan-1]/2.; - zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UAFO",iplan ,"TRD1",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha); - gMC->Gsposp("UAFO",iplan+ kNplan,"TRD1",xpos,-ypos,zpos,0,"MANY",par_cha,npar_cha); - - // the inner part of the aluminum frame - par_cha[0] = fCwidth[iplan-1]/2. - kCathick; - par_cha[1] = fClengthO1[iplan-1]/2. - kCathick; - par_cha[2] = kCaframe/2.; - xpos = 0.; - ypos = fClengthI[iplan-1]/2. + fClengthM1[iplan-1] + fClengthO1[iplan-1]/2.; - zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UAIO",iplan ,"TRD1",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha); - gMC->Gsposp("UAIO",iplan+ kNplan,"TRD1",xpos,-ypos,zpos,0,"ONLY",par_cha,npar_cha); - - // the carbon frame - par_cha[0] = fCwidth[iplan-1]/2.; - par_cha[1] = fClengthO1[iplan-1]/2.; - par_cha[2] = kCcframe/2.; - xpos = 0.; - ypos = fClengthI[iplan-1]/2. + fClengthM1[iplan-1] + fClengthO1[iplan-1]/2.; - zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UCFO",iplan, "TRD1",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha); - gMC->Gsposp("UCFO",iplan+ kNplan,"TRD1",xpos,-ypos,zpos,0,"MANY",par_cha,npar_cha); - - // the inner part of the carbon frame - par_cha[0] = fCwidth[iplan-1]/2. - kCcthick; - par_cha[1] = fClengthO1[iplan-1]/2. - kCcthick; - par_cha[2] = kCcframe/2.; - xpos = 0.; - ypos = fClengthI[iplan-1]/2. + fClengthM1[iplan-1] + fClengthO1[iplan-1]/2.; - zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UCIO",iplan ,"TRD1",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha); - gMC->Gsposp("UCIO",iplan+ kNplan,"TRD1",xpos,-ypos,zpos,0,"ONLY",par_cha,npar_cha); - - // Only for the geometry with holes - if (fHole) { - - // the aluminum frame - par_cha[0] = fCwidth[iplan-1]/2.; - par_cha[1] = fClengthO2[iplan-1]/2.; - par_cha[2] = kCaframe/2.; - xpos = 0.; - ypos = fClengthM2[iplan-1] + fClengthO2[iplan-1]/2. - kSlenTR2/2.; - zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UAFO",iplan+2*kNplan,"TRD2",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha); - - // the inner part of the aluminum frame - par_cha[0] = fCwidth[iplan-1]/2. - kCathick; - par_cha[1] = fClengthO2[iplan-1]/2. - kCathick; - par_cha[2] = kCaframe/2.; - xpos = 0.; - ypos = fClengthM2[iplan-1] + fClengthO2[iplan-1]/2. - kSlenTR2/2.; - zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UAIO",iplan+2*kNplan,"TRD2",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha); - - // the carbon frame - par_cha[0] = fCwidth[iplan-1]/2.; - par_cha[1] = fClengthO2[iplan-1]/2.; - par_cha[2] = kCcframe/2.; - xpos = 0.; - ypos = fClengthM2[iplan-1] + fClengthO2[iplan-1]/2. - kSlenTR2/2.; - zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UCFO",iplan+2*kNplan,"TRD2",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha); - - // the inner part of the carbon frame - par_cha[0] = fCwidth[iplan-1]/2. - kCcthick; - par_cha[1] = fClengthO2[iplan-1]/2. - kCcthick; - par_cha[2] = kCcframe/2.; - xpos = 0.; - ypos = fClengthM2[iplan-1] + fClengthO2[iplan-1]/2. - kSlenTR2/2.; - zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UCIO",iplan+2*kNplan,"TRD2",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha); - - // the aluminum frame - par_cha[0] = fCwidth[iplan-1]/2.; - par_cha[1] = fClengthO3[iplan-1]/2.; - par_cha[2] = kCaframe/2.; - xpos = 0.; - ypos = fClengthO3[iplan-1]/2. - kSlenTR3/2.; - zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UAFO",iplan+4*kNplan,"TRD3",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha); - - // the inner part of the aluminum frame - par_cha[0] = fCwidth[iplan-1]/2. - kCathick; - par_cha[1] = fClengthO3[iplan-1]/2. - kCathick; - par_cha[2] = kCaframe/2.; - xpos = 0.; - ypos = fClengthO3[iplan-1]/2. - kSlenTR3/2.; - zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UAIO",iplan+4*kNplan,"TRD3",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha); - - // the carbon frame - par_cha[0] = fCwidth[iplan-1]/2.; - par_cha[1] = fClengthO3[iplan-1]/2.; - par_cha[2] = kCcframe/2.; - xpos = 0.; - ypos = fClengthO3[iplan-1]/2. - kSlenTR3/2.; - zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UCFO",iplan+4*kNplan,"TRD3",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha); - - // the inner part of the carbon frame - par_cha[0] = fCwidth[iplan-1]/2. - kCcthick; - par_cha[1] = fClengthO3[iplan-1]/2. - kCcthick; - par_cha[2] = kCcframe/2.; - xpos = 0.; - ypos = fClengthO3[iplan-1]/2. - kSlenTR3/2.; - zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace); - gMC->Gsposp("UCIO",iplan+4*kNplan,"TRD3",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha); +} - } +//_____________________________________________________________________________ +void AliTRD::CreateGeometry() +{ + // + // Creates the volumes for the TRD chambers + // + // Check that FRAME is there otherwise we have no place where to put the TRD + AliModule* frame = gAlice->GetModule("FRAME"); + if (!frame) { + printf(" The TRD needs the FRAME to be defined first\n"); + return; } - if (fHole) { - xpos = 0.; - ypos = 0.; - zpos = 0.; - gMC->Gspos("TRD1",1,"BTR1",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("TRD2",1,"BTR2",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("TRD3",1,"BTR3",xpos,ypos,zpos,0,"ONLY"); - } - else { - xpos = 0.; - ypos = 0.; - zpos = 0.; - gMC->Gspos("TRD1",1,"BTR1",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("TRD1",2,"BTR2",xpos,ypos,zpos,0,"ONLY"); - gMC->Gspos("TRD1",3,"BTR3",xpos,ypos,zpos,0,"ONLY"); - } + fGeometry->CreateGeometry(fIdtmed->GetArray() - 1299); } @@ -773,8 +435,8 @@ void AliTRD::CreateMaterials() // Origin Y.Foka // - Int_t ISXFLD = gAlice->Field()->Integ(); - Float_t SXMGMX = gAlice->Field()->Max(); + Int_t isxfld = gAlice->Field()->Integ(); + Float_t sxmgmx = gAlice->Field()->Max(); // For polyethilene (CH2) Float_t ape[2] = { 12., 1. }; @@ -821,7 +483,8 @@ void AliTRD::CreateMaterials() Float_t stmin = -0.001; Float_t absl, radl, d, buf[1]; - Float_t agm[2], dgm, zgm[2], wgm[2]; + Float_t agm[2], zgm[2], wgm[2]; + Float_t dgm1, dgm2; Int_t nbuf; ////////////////////////////////////////////////////////////////////////// @@ -852,8 +515,8 @@ void AliTRD::CreateMaterials() // Create gas mixture wgm[0] = fxc; wgm[1] = 1. - fxc; - dgm = wgm[0] * dxe + wgm[1] * dco; - AliMixture(10, "Gas mixture 1$", agm, zgm, dgm, 2, wgm); + 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); @@ -862,63 +525,70 @@ void AliTRD::CreateMaterials() // Create gas mixture wgm[0] = fxi; wgm[1] = 1. - fxi; - dgm = wgm[0] * dxe + wgm[1] * dis; - AliMixture(11, "Gas mixture 2$", agm, zgm, dgm, 2, wgm); + dgm2 = wgm[0] * dxe + wgm[1] * dis; + AliMixture(11, "Gas mixture 2$", agm, zgm, dgm2, 2, wgm); ////////////////////////////////////////////////////////////////////////// // Tracking Media Parameters ////////////////////////////////////////////////////////////////////////// // Al Frame - AliMedium(1, "Al Frame$", 1, 0, ISXFLD, SXMGMX + AliMedium(1, "Al Frame$", 1, 0, isxfld, sxmgmx , tmaxfd, stemax, deemax, epsil, stmin); // Air - AliMedium(2, "Air$", 2, 0, ISXFLD, SXMGMX + AliMedium(2, "Air$", 2, 0, isxfld, sxmgmx , tmaxfd, stemax, deemax, epsil, stmin); // Polyethilene - AliMedium(3, "Radiator$", 3, 0, ISXFLD, SXMGMX + AliMedium(3, "Radiator$", 3, 0, isxfld, sxmgmx , tmaxfd, stemax, deemax, epsil, stmin); // Xe - AliMedium(4, "Xe$", 4, 1, ISXFLD, SXMGMX + AliMedium(4, "Xe$", 4, 1, isxfld, sxmgmx , tmaxfd, stemax, deemax, epsil, stmin); // Cu pads - AliMedium(5, "Padplane$", 5, 1, ISXFLD, SXMGMX + AliMedium(5, "Padplane$", 5, 1, isxfld, sxmgmx , tmaxfd, stemax, deemax, epsil, stmin); // Fee + cables - AliMedium(6, "Readout$", 1, 0, ISXFLD, SXMGMX + AliMedium(6, "Readout$", 1, 0, isxfld, sxmgmx , tmaxfd, stemax, deemax, epsil, stmin); // C frame - AliMedium(7, "C Frame$", 6, 0, ISXFLD, SXMGMX + AliMedium(7, "C Frame$", 6, 0, isxfld, sxmgmx , tmaxfd, stemax, deemax, epsil, stmin); // Mylar foils - AliMedium(8, "Mylar$", 7, 0, ISXFLD, SXMGMX + 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 + 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 + 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 + 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 + AliMedium(11, "Kapton$", 7, 0, isxfld, sxmgmx , tmaxfd, stemax, deemax, epsil, stmin); // Gas-filling of the radiator - AliMedium(12, "CO2$", 8, 0, ISXFLD, SXMGMX + AliMedium(12, "CO2$", 8, 0, isxfld, sxmgmx , tmaxfd, stemax, deemax, epsil, stmin); // G10-plates - AliMedium(13, "G10-plates$",12, 0, ISXFLD, SXMGMX + AliMedium(13, "G10-plates$",12, 0, isxfld, sxmgmx , tmaxfd, stemax, deemax, epsil, stmin); // Cooling water - AliMedium(14, "Water$", 13, 0, ISXFLD, SXMGMX + AliMedium(14, "Water$", 13, 0, isxfld, sxmgmx , tmaxfd, stemax, deemax, epsil, stmin); + // Save the density values for the TRD absorbtion + fFoilDensity = dmy; + if (fGasMix == 1) + fGasDensity = dgm1; + else + fGasDensity = dgm2; + } //_____________________________________________________________________________ @@ -935,7 +605,7 @@ void AliTRD::DrawModule() gMC->Gsatt("ALIC","SEEN", 0); // Set the volumes visible - if (fHole) { + if (fGeometry->IsVersion() == 0) { gMC->Gsatt("B071","SEEN", 0); gMC->Gsatt("B074","SEEN", 0); gMC->Gsatt("B075","SEEN", 0); @@ -956,6 +626,10 @@ void AliTRD::DrawModule() 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); } gMC->Gsatt("UCII","SEEN", 0); gMC->Gsatt("UCIM","SEEN", 0); @@ -991,133 +665,205 @@ Int_t AliTRD::DistancetoPrimitive(Int_t , Int_t ) void AliTRD::Init() { // - // Initialise the TRD detector after the geometry has been created + // Initialize the TRD detector after the geometry has been created // Int_t i; - Int_t iplan; - + printf("\n"); - for(i=0;i<35;i++) printf("*"); + for (i = 0; i < 35; i++) printf("*"); printf(" TRD_INIT "); - for(i=0;i<35;i++) printf("*"); + for (i = 0; i < 35; i++) printf("*"); printf("\n"); - - // Here the TRD initialisation code (if any!) - if (fGasMix == 1) - printf(" Gas Mixture: 90%% Xe + 10%% CO2\n"); - else - printf(" Gas Mixture: 97%% Xe + 3%% Isobutane\n"); + printf("\n"); + + if (fGeometry->IsVersion() == 0) { + printf(" Geometry for spaceframe with holes initialized.\n\n"); + } + else if (fGeometry->IsVersion() == 1) { + printf(" Geometry for spaceframe without holes initialized.\n"); + if (fGeometry->GetPHOShole()) + printf(" Leave space in front of PHOS free.\n"); + if (fGeometry->GetRICHhole()) + printf(" Leave space in front of RICH free.\n"); + printf("\n"); + } - if (fHole) - printf(" Geometry with holes\n"); + if (fGasMix == 1) + printf(" Gas Mixture: 90%% Xe + 10%% CO2\n\n"); else - printf(" Full geometry\n"); - - // The default pad dimensions - if (!(fRowPadSize)) fRowPadSize = 4.5; - if (!(fColPadSize)) fColPadSize = 1.0; - if (!(fTimeBinSize)) fTimeBinSize = 0.1; - - // The maximum number of pads - // and the position of pad 0,0,0 - // - // chambers seen from the top: - // +----------------------------+ - // | | - // | | ^ - // | | rphi| - // | | | - // |0 | | - // +----------------------------+ +------> - // z - // chambers seen from the side: ^ - // +----------------------------+ time| - // | | | - // |0 | | - // +----------------------------+ +------> - // z - // - for (iplan = 0; iplan < kNplan; iplan++) { - - // The pad row (z-direction) - for (Int_t isect = 0; isect < kNsect; isect++) { - Float_t clengthI = fClengthI[iplan]; - Float_t clengthM = fClengthM1[iplan]; - Float_t clengthO = fClengthO1[iplan]; - if (fHole) { - switch (isect) { - case 12: - case 13: - case 14: - case 15: - case 16: - clengthM = fClengthM2[iplan]; - clengthO = fClengthO2[iplan]; - break; - case 4: - case 5: - case 6: - clengthO = fClengthO3[iplan]; - break; - }; + printf(" Gas Mixture: 97%% Xe + 3%% Isobutane\n\n"); + +} + +//_____________________________________________________________________________ +void AliTRD::LoadPoints(Int_t track) +{ + // + // Store x, y, z of all hits in memory. + // Hit originating from TR photons are given a different color + // + + 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->GetCharge() >= 0) { + + 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]; } - fRowMax[iplan][0][isect] = 1 + TMath::Nint((clengthO - 2. * kCcthick) - / fRowPadSize - 0.5); - fRowMax[iplan][1][isect] = 1 + TMath::Nint((clengthM - 2. * kCcthick) - / fRowPadSize - 0.5); - fRowMax[iplan][2][isect] = 1 + TMath::Nint((clengthI - 2. * kCcthick) - / fRowPadSize - 0.5); - fRowMax[iplan][3][isect] = 1 + TMath::Nint((clengthM - 2. * kCcthick) - / fRowPadSize - 0.5); - fRowMax[iplan][4][isect] = 1 + TMath::Nint((clengthO - 2. * kCcthick) - / fRowPadSize - 0.5); - fRow0[iplan][0][isect] = -clengthI/2. - clengthM - clengthO + kCcthick; - fRow0[iplan][1][isect] = -clengthI/2. - clengthM + kCcthick; - fRow0[iplan][2][isect] = -clengthI/2. + kCcthick; - fRow0[iplan][3][isect] = clengthI/2. + kCcthick; - fRow0[iplan][4][isect] = clengthI/2. + clengthM + kCcthick; + 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 { + + 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]++; - // The pad column (rphi-direction) - fColMax[iplan] = 1 + TMath::Nint((fCwidth[iplan] - 2. * kCcthick) - / fColPadSize - 0.5); - fCol0[iplan] = -fCwidth[iplan]/2. + kCcthick; + } } - // The time bucket - fTimeMax = 1 + TMath::Nint(kDrThick / fTimeBinSize - 0.5); - for (Int_t iplan = 0; iplan < kNplan; iplan++) { - fTime0[iplan] = kRmin + kCcframe/2. + kDrZpos - 0.5 * kDrThick - + iplan * (kCheight + kCspace); - } + 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); + + } + + } + + delete [] coorE; + delete [] coorT; + delete [] ntrkE; + delete [] ntrkT; + delete [] limiE; + delete [] limiT; } //_____________________________________________________________________________ -void AliTRD::MakeBranch(Option_t* option) +void AliTRD::MakeBranch(Option_t* option, char *file) { // // Create Tree branches for the TRD digits and cluster. // - Int_t buffersize = 4000; - Char_t branchname[15]; + //Int_t buffersize = 4000; + //Char_t branchname[15]; - AliDetector::MakeBranch(option); + AliDetector::MakeBranch(option,file); - Char_t *D = strstr(option,"D"); - sprintf(branchname,"%s",GetName()); - if (fDigits && gAlice->TreeD() && D) { - gAlice->TreeD()->Branch(branchname,&fDigits, buffersize); - printf("* AliTRD::MakeBranch * Making Branch %s for digits in TreeD\n",branchname); - } + //Char_t *r = strstr(option,"R"); + //sprintf(branchname,"%srecPoints",GetName()); + //if (fRecPoints && gAlice->TreeR() && r) { + // MakeBranchInTree(gAlice->TreeR(), + // branchname, &fRecPoints,buffersize, file) ; + //} + +} - sprintf(branchname,"%scluster",GetName()); - if (fClusters && gAlice->TreeD() && D) { - gAlice->TreeD()->Branch(branchname,&fClusters,buffersize); - printf("* AliTRD::MakeBranch * Making Branch %s for cluster in TreeD\n",branchname); +//_____________________________________________________________________________ +void AliTRD::ResetRecPoints() +{ + // + // Reset number of reconstructed points and the point array + // + + if(fRecPoints) { + fNRecPoints = 0; + Int_t nentr = fRecPoints->GetEntriesFast(); + for(Int_t i = 0; i < nentr; i++) delete fRecPoints->RemoveAt(i); } } @@ -1134,13 +880,15 @@ void AliTRD::SetTreeAddress() AliDetector::SetTreeAddress(); TBranch *branch; - TTree *treeD = gAlice->TreeD(); - - if (treeD) { - sprintf(branchname,"%scluster",GetName()); - if (fClusters) { - branch = treeD->GetBranch(branchname); - if (branch) branch->SetAddress(&fClusters); + TTree *treeR = gAlice->TreeR(); + + if (treeR) { + sprintf(branchname,"%srecPoints",GetName()); + if (fRecPoints) { + branch = treeR->GetBranch(branchname); + if (branch) { + branch->SetAddress(&fRecPoints); + } } } @@ -1164,135 +912,36 @@ void AliTRD::SetGasMix(Int_t imix) } -//______________________________________________________________________________ -void AliTRD::Streamer(TBuffer &R__b) -{ - // Stream an object of class AliTRD. - - if (R__b.IsReading()) { - Version_t R__v = R__b.ReadVersion(); if (R__v) { } - AliDetector::Streamer(R__b); - R__b >> fGasMix; - R__b.ReadStaticArray(fClengthI); - R__b.ReadStaticArray(fClengthM1); - R__b.ReadStaticArray(fClengthM2); - R__b.ReadStaticArray(fClengthO1); - R__b.ReadStaticArray(fClengthO2); - R__b.ReadStaticArray(fClengthO3); - R__b.ReadStaticArray(fCwidth); - R__b.ReadStaticArray((int*)fRowMax); - R__b.ReadStaticArray(fColMax); - R__b >> fTimeMax; - R__b.ReadStaticArray((float*)fRow0); - R__b.ReadStaticArray(fCol0); - R__b.ReadStaticArray(fTime0); - R__b >> fRowPadSize; - R__b >> fColPadSize; - R__b >> fTimeBinSize; - R__b >> fHole; - // Stream the pointers but not the TClonesArray - R__b >> fClusters; // diff - //R__b >> fNclusters; - } else { - R__b.WriteVersion(AliTRD::IsA()); - AliDetector::Streamer(R__b); - R__b << fGasMix; - R__b.WriteArray(fClengthI, 6); - R__b.WriteArray(fClengthM1, 6); - R__b.WriteArray(fClengthM2, 6); - R__b.WriteArray(fClengthO1, 6); - R__b.WriteArray(fClengthO2, 6); - R__b.WriteArray(fClengthO3, 6); - R__b.WriteArray(fCwidth, 6); - R__b.WriteArray((int*)fRowMax, 540); - R__b.WriteArray(fColMax, 6); - R__b << fTimeMax; - R__b.WriteArray((float*)fRow0, 540); - R__b.WriteArray(fCol0, 6); - R__b.WriteArray(fTime0, 6); - R__b << fRowPadSize; - R__b << fColPadSize; - R__b << fTimeBinSize; - R__b << fHole; - // Stream the pointers but not the TClonesArrays - R__b << fClusters; // diff - //R__b << fNclusters; - } - -} - -ClassImp(AliTRDhit) - //_____________________________________________________________________________ -AliTRDhit::AliTRDhit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits) - :AliHit(shunt, track) +void AliTRD::SetPHOShole() { // - // Create a TRD hit + // Selects a geometry with a hole in front of the PHOS // - // Store volume hierarchy - fSector = vol[0]; - fChamber = vol[1]; - fPlane = vol[2]; - - // Store position and charge - fX = hits[0]; - fY = hits[1]; - fZ = hits[2]; - fQ = hits[3]; + fGeometry->SetPHOShole(); } -ClassImp(AliTRDdigit) - //_____________________________________________________________________________ -AliTRDdigit::AliTRDdigit(Int_t *tracks, Int_t *digits) - :AliDigit(tracks) +void AliTRD::SetRICHhole() { // - // Create a TRD digit + // Selects a geometry with a hole in front of the RICH // - // Store the volume hierarchy - fSector = digits[0]; - fChamber = digits[1]; - fPlane = digits[2]; - - // Store the row, pad, and time bucket number - fRow = digits[3]; - fCol = digits[4]; - fTime = digits[5]; - - // Store the signal amplitude - fSignal = digits[6]; + fGeometry->SetRICHhole(); } -ClassImp(AliTRDcluster) - //_____________________________________________________________________________ -AliTRDcluster::AliTRDcluster(Int_t *tracks, Int_t *cluster, Float_t* position) - :TObject() +AliTRD &AliTRD::operator=(const AliTRD &trd) { // - // Create a TRD cluster + // Assignment operator // - fSector = cluster[0]; - fChamber = cluster[1]; - fPlane = cluster[2]; - - fTimeSlice = cluster[3]; - fEnergy = cluster[4]; - - fX = position[0]; - fY = position[1]; - fZ = position[2]; - - fTracks[0] = tracks[0]; - fTracks[1] = tracks[1]; - fTracks[2] = tracks[2]; + if (this != &trd) ((AliTRD &) trd).Copy(*this); + return *this; } -