X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ITS%2FAliITSv11.cxx;h=cb4a1a6bf0bb7cd477f20f730f50f60195fe4f93;hb=12d3cd377dc08ab5d3f78f9281c07b8536b010ab;hp=9869cc1d2b5d278f4d7ab979074cd811d084389b;hpb=172b0d90cd207e49b4704274243586e38bc71810;p=u%2Fmrichter%2FAliRoot.git diff --git a/ITS/AliITSv11.cxx b/ITS/AliITSv11.cxx index 9869cc1d2b5..cb4a1a6bf0b 100644 --- a/ITS/AliITSv11.cxx +++ b/ITS/AliITSv11.cxx @@ -1,5 +1,5 @@ /************************************************************************** - * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * + * Copyright(c) 2007-2008, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * @@ -13,322 +13,611 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ -/* $Id$ */ - -////////////////////////////////////////////////////////////////////////////// -// // -// Inner Traking System version 11 // -// This class contains the base procedures for the Inner Tracking System // -// // -// Authors: R. Barbera // -// version 6. // -// Created 2000. // -// // -// NOTE: THIS IS THE SYMMETRIC PPR geometry of the ITS. // -// THIS WILL NOT WORK // -// with the geometry or module classes or any analysis classes. You are // -// strongly encouraged to uses AliITSv5. // -// // -////////////////////////////////////////////////////////////////////////////// -// See AliITSv11::StepManager(). -// General C/C++ includes -#include -#include -// General Root includes -#include -#include -#include -#include // only required for Tracking function? -#include + +//************************************************************************ +// +// Inner Traking System geometry v11 +// +// Based on ROOT geometrical modeler +// +// B. Nilsen, L. Gaudichet +//************************************************************************ + #include -#include -#include -// Root Geometry includes #include -#include #include -#include -#include // contaings TGeoTubeSeg -#include -#include -#include -#include -#include -#include -#include "AliITSv11GeometrySupport.h" -// General AliRoot includes -#include "AliRun.h" -#include "AliMagF.h" -#include "AliConst.h" -// ITS specific includes -#include "AliITShit.h" +#include +#include +#include + +#include "AliITS.h" +#include "AliITSCalibrationSDD.h" +#include "AliITSDetTypeSim.h" #include "AliITSgeom.h" -#include "AliITSgeomSPD.h" -#include "AliITSgeomSDD.h" -#include "AliITSgeomSSD.h" -#include "AliITSDetType.h" -#include "AliITSresponseSPD.h" -#include "AliITSresponseSDD.h" -#include "AliITSresponseSSD.h" -#include "AliITSsegmentationSPD.h" +#include "AliITShit.h" #include "AliITSsegmentationSDD.h" +#include "AliITSsegmentationSPD.h" #include "AliITSsegmentationSSD.h" -#include "AliITSsimulationSPD.h" -#include "AliITSsimulationSDD.h" -#include "AliITSsimulationSSD.h" -#include "AliITSClusterFinderSPD.h" -#include "AliITSClusterFinderSDD.h" -#include "AliITSClusterFinderSSD.h" -#include "AliITSBaseGeometry.h" #include "AliITSv11.h" +#include "AliITSv11GeometrySDD.h" +#include "AliITSv11GeometrySPD.h" +#include "AliITSv11GeometrySSD.h" #include "AliITSv11GeometrySupport.h" +#include "AliMC.h" +#include "AliMagF.h" +#include "AliRun.h" +#include "AliTrackReference.h" ClassImp(AliITSv11) - -/* - Some temparary #define's used untill ROOT has addoppted the proper - Getter in it's classes. - These Below are for TGeoPcon functions. -*/ - + //______________________________________________________________________ -AliITSv11::AliITSv11() : AliITS() { - // Standard default constructor for the ITS version 11. - // Inputs: - // none. - // Outputs: - // none. - // Return - // A default constructed AliITSv11 class. +AliITSv11::AliITSv11() : +fByThick(kTRUE), +fMajorVersion(IsVersion()), +fMinorVersion(0), +fSPDgeom(), +fSDDgeom(0), +fSSDgeom(), +fSupgeom(), +fIgm(kv11) +{ + // Standard default constructor for the ITS version 11. - //fITSV = 0; - //fcS = 0; -// fcD = 0; + fIdN = 0; + fIdName = 0; + fIdSens = 0; } -//______________________________________________________________________ -AliITSv11::AliITSv11(const char *title) : AliITS("ITS", title){ - // Standard constructor for the ITS version 11. - // Inputs: - // const char *title The title of for this geometry. - // Outputs: - // none. - // Return - // A Standard constructed AliITSv11 class. - //fITSV = 0; - //fcS = 0; -// fcD = 0; -} -//______________________________________________________________________ -AliITSv11::~AliITSv11() { - // Standard destructor for the ITS version 11. - // Inputs: - // none. - // Outputs: - // none. - // Return - // none. -// if(fITSV!=0) delete fITSV; -// if(fcS!=0) delete fcS; -// if(fcD!=0) delete fcD; -} //______________________________________________________________________ -AliITSv11::AliITSv11(const AliITSv11 &source) : AliITS(source){ - // Copy Constructor for ITS version 11. - // Inputs: - // AliITSv11 &source class to be copied from. - // Outputs: - // none. - // Return - // none. +AliITSv11::AliITSv11(const char *name, const char *title): +AliITS("ITS", title), +fByThick(kTRUE), +fMajorVersion(IsVersion()), +fMinorVersion(0), +fSPDgeom(), +fSDDgeom(0), +fSSDgeom(), +fSupgeom(), +fIgm(kv11) +{ + // Standard constructor for the ITS version 11. - if(&source == this) return; - Error("Copy Constructor","Not allowed to copy AliITSv11"); - return; -} -//______________________________________________________________________ -AliITSv11& AliITSv11::operator=(const AliITSv11 &source){ - // Assignment operator for the ITS version 11. - // Inputs: - // AliITSv11 &source class to be copied from. - // Outputs: - // none. - // Return - // none. + fSDDgeom = new AliITSv11GeometrySDD(0); - if(&source == this) return *this; - Error("= operator","Not allowed to copy AliITSv11"); - return *this; + Int_t i; + fIdN = 6; + fIdName = new TString[fIdN]; + fIdName[0] = name; // removes warning message + fIdName[0] = "ITS1"; + fIdName[1] = "ITS2"; + fIdName[2] = fSDDgeom->GetSenstiveVolumeName3(); + fIdName[3] = fSDDgeom->GetSenstiveVolumeName4(); + fIdName[4] = "ITS5"; + fIdName[5] = "ITS6"; + fIdSens = new Int_t[fIdN]; + for(i=0;iBuildDisplayGeometry(); + // fSPDgeom = new AliITSv11GeometrySPD(debugSPD); + fSDDgeom = new AliITSv11GeometrySDD(debugSDD); + fSDDgeom->SetDebug(debugSDD); + // fSupgeom = new AliITSv11GeometrySupport(debugSUP); + + Int_t i; + fIdN = 6; + fIdName = new TString[fIdN]; + fIdName[0] = fSPDgeom->GetSenstiveVolumeName1(); + fIdName[1] = fSPDgeom->GetSenstiveVolumeName2(); + fIdName[2] = fSDDgeom->GetSenstiveVolumeName3(); + fIdName[3] = fSDDgeom->GetSenstiveVolumeName4(); + fIdName[4] = fSSDgeom->GetSenstiveVolumeName5(); + fIdName[5] = fSSDgeom->GetSenstiveVolumeName6(); + fIdSens = new Int_t[fIdN]; + for(i=0;iGetTopVolume(); + TGeoManager *geoManager = gGeoManager; + TGeoVolume *vALIC = geoManager->GetTopVolume(); + + TGeoPcon *sITS = new TGeoPcon("ITS Top Volume",0.0,360.0,2); - TGeoPcon *itsv = new TGeoPcon("ITS Top Volume, Daughter of ALIC", - 0.0,360.0,2); // DefineSection(section number, Z, Rmin, Rmax). - itsv->DefineSection(0,-300.0*kcm,0.01*kcm,50.0*kcm); - itsv->DefineSection(1,+300.0*kcm,0.01*kcm,50.0*kcm); - TGeoVolume *ITSV = new TGeoVolume("ITSV",itsv,0); - //mgr->AddVolume(ITSV); - ITSV->SetVisibility(kFALSE); - ALIC->AddNode(ITSV,1,0); - // - AliITSv11GeometrySupport *sup = new AliITSv11GeometrySupport(GetDebug()); - //sup->SPDCone(ITSV); - //sup->SDDCone(ITSV); - sup->SSDCone(ITSV); - //sup->ServicesCableSupport(ITSV); + const Double_t kcm = 1.0; + sITS->DefineSection(0,-300.0*kcm,0.01*kcm,50.0*kcm); + sITS->DefineSection(1,+300.0*kcm,0.01*kcm,50.0*kcm); + + TGeoMedium *air = gGeoManager->GetMedium("ITS_AIR$"); + TGeoVolume *vITS = new TGeoVolume("ITSV",sITS,air); + vITS->SetVisibility(kFALSE); + const Int_t length=100; + Char_t vstrng[length]; + if(fIgm.WriteVersionString(vstrng,length,(AliITSVersion_t)IsVersion(), + fMinorVersion,cvsDate,cvsRevision)) + vITS->SetTitle(vstrng); + //printf("Title set to %s\n",vstrng); + vALIC->AddNode(vITS,1,0); + +// fSPDgeom->CenteralSPD(vITS); + + fSDDgeom->Layer3(vITS); + fSDDgeom->Layer4(vITS); + +// fSupgeom->SPDCone(vITS); +// fSupgeom->SPDThermalSheald(vITS); +// fSupgeom->SDDCone(vITS); +// fSupgeom->SSDCone(vITS); +// fSupgeom->ServicesCableSupport(vITS); + } //______________________________________________________________________ void AliITSv11::CreateMaterials(){ - // Create ITS materials - // This function defines the default materials used in the Geant - // Monte Carlo simulations for the geometries AliITSv11. - // In general it is automatically replaced by + // Create Standard ITS Materials // Inputs: - // none. + // none. // Outputs: - // none. - // Return - // none. - - //TGeoMaterial *C = new TGeoMaterial("ITSCarbon",12.0,6.0,2.265); - TGeoMaterial *Al = new TGeoMaterial("ITSAluminum",26.981539,13.0,2.07); - TGeoMixture *Cfiber = new TGeoMixture("ITSCarbonFiber",6,1.930); - TGeoMixture *Rohacell = new TGeoMixture("ITSRohacell",6,1.930); - TGeoMixture *Staselite = new TGeoMixture("ITSStaselite4411w",6,1.930); - TGeoMixture *Air = new TGeoMixture("ITSAir",6,1.205*1.E-3); - TGeoMixture *Stainless = new TGeoMixture("ITSStainless",6,1.930); - // - Double_t SPDcone[20]; - SPDcone[0] = 1.0; // imat - SPDcone[1] = 0.0; // isvol - SPDcone[2] = gAlice->Field()->Integ(); // ifield - SPDcone[3] = gAlice->Field()->Max(); // fieldm - SPDcone[4] = 1.0; // tmaxfd [degrees] - SPDcone[5] = 1.0; // stemax [cm] - SPDcone[6] = 0.5; // deemax [fraction] - SPDcone[7] = 1.0E-3; // epsil [cm] - SPDcone[8] = 0.0; // stmin [cm] - new TGeoMedium("ITSspdCarbonFiber",1,Cfiber,SPDcone); - SPDcone[0] += 1.0; - new TGeoMedium("ITSspdStaselite4411w",2,Staselite,SPDcone); - SPDcone[0] += 1.0; - new TGeoMedium("ITSspdRohacell50A",3,Rohacell,SPDcone); - SPDcone[0] += 1.0; - new TGeoMedium("ITSspdStainlesSteal",4,Stainless,SPDcone); - SPDcone[0] += 1.0; - new TGeoMedium("ITSspdAir",5,Air,SPDcone); - SPDcone[0] += 1.0; - new TGeoMedium("ITSspdAl",6,Al,SPDcone); + // none. + // Return: + // none. + + // - Double_t SSDcone[20]; - SSDcone[0] = 1.0; // imat - SSDcone[1] = 0.0; // isvol - SSDcone[2] = gAlice->Field()->Integ(); // ifield - SSDcone[3] = gAlice->Field()->Max(); // fieldm - SSDcone[4] = 1.0; // tmaxfd [degrees] - SSDcone[5] = 1.0; // stemax [cm] - SSDcone[6] = 0.5; // deemax [fraction] - SSDcone[7] = 1.0E-3; // epsil [cm] - SSDcone[8] = 0.0; // stmin [cm] - new TGeoMedium("ITSssdCarbonFiber",1,Cfiber,SSDcone); - SSDcone[0] += 1.0; - new TGeoMedium("ITSssdStaselite4411w",2,Staselite,SSDcone); - SSDcone[0] += 1.0; - new TGeoMedium("ITSssdRohacell50A",3,Rohacell,SSDcone); - SSDcone[0] += 1.0; - new TGeoMedium("ITSssdStainlesSteal",4,Stainless,SSDcone); - SSDcone[0] += 1.0; - new TGeoMedium("ITSssdAir",5,Air,SSDcone); - SSDcone[0] += 1.0; - new TGeoMedium("ITSssdAl",6,Al,SSDcone); + fSPDgeom->AliITSv11Geometry::CreateDefaultMaterials(); + // Detector specific material definistions + fSPDgeom->CreateMaterials(); + fSDDgeom->CreateMaterials(); + fSSDgeom->CreateMaterials(); + fSupgeom->CreateMaterials(); } +/* //______________________________________________________________________ void AliITSv11::InitAliITSgeom(){ - // Based on the geometry tree defined in Geant 3.21, this - // routine initilizes the Class AliITSgeom from the Geant 3.21 ITS - // geometry sturture. - // Inputs: - // none. - // Outputs: - // none. - // Return - // none. + // + // Fill fITSgeom with the 3 sub-detector geometries + // + + if (gGeoManager) gGeoManager->Export("geometry.root"); + + const Int_t knlayers = 6; + const Int_t kndeep = 3; + const AliITSDetector kidet[knlayers]={kSPD,kSPD,kSDD,kSDD,kSSD,kSSD}; + const TString knames[knlayers] = { + "AliITSv11:spd missing", // lay=1 + "AliITSv11:spd missing", // lay=2 + "/ALIC_1/ITSV_1/ITSsddLayer3_1/ITSsddLadd_%d/ITSsddSensor_%d/ITSsddWafer_%d", // lay=3 + "/ALIC_1/ITSV_1/ITSsddLayer4_1/ITSsddLadd_%d/ITSsddSensor_%d/ITSsddWafer_%d", // lay=4 + "AliITSv11:ssd missing", // lay=5 + "AliITSv11:ssd missing" // lay=6 + }; + + const Int_t kitsGeomTreeCopys[knlayers][kndeep]= {{10, 2, 4},// lay=1 + {10, 4, 4}, // lay=2 + {14, 6, 1}, // lay=3 + {22, 8, 1}, // lay=4 + {34,22, 1}, // lay=5 + {38,25, 1}};// lay=6 + Int_t nlad[knlayers],ndet[knlayers]; + Int_t mod,lay,lad=0,det=0,i,j,k,cp0,cp1,cp2; + TString path,shapeName; + TGeoHMatrix materix; + Double_t trans[3]={3*0.0},rot[10]={9*0.0,1.0}; + TArrayD shapePar; + TArrayF shapeParF; + Bool_t shapeDefined[3]={kFALSE,kFALSE,kFALSE}; + + AliDebug(1,"Reading Geometry transformation directly from Modler."); + mod = 0; + for(i=0;iGetTransformation(path.Data(),materix); + gMC->GetShape(path.Data(),shapeName,shapePar); + shapeParF.Set(shapePar.GetSize()); + for(i=0;iCreateMatrix(mod,lay,lad,det,kidet[lay-1],trans,rot); + geom->SetTrans(mod,materix.GetTranslation()); + geom->SetRotMatrix(mod,materix.GetRotationMatrix()); + geom->GetGeomMatrix(mod)->SetPath(path.Data()); + switch (lay){ + case 1: case 2: + if(!shapeDefined[kSPD]){ + geom->ReSetShape(kSPD,new AliITSgeomSPD425Short( + shapeParF.GetSize(),shapeParF.GetArray())); + shapeDefined[kSPD] = kTRUE; + }break; + case 3: case 4: + if(!shapeDefined[kSDD]){ + geom->ReSetShape(kSDD,new AliITSgeomSDD256( + shapeParF.GetSize(),shapeParF.GetArray())); + shapeDefined[kSDD] = kTRUE; + }break; + case 5: case 6: + if(!shapeDefined[kSSD]){ + geom->ReSetShape(kSSD,new AliITSgeomSSD75and275( + shapeParF.GetSize(),shapeParF.GetArray())); + shapeDefined[kSSD] = kTRUE; + }break; + default:{ + }break; + } // end switch + mod++; + } /// end for cp2 + } // end for cp1 + } // end for cp0 + } // end for lay + +// fSDDgeom->ExportSensorGeometry(GetITSgeom(), +3, 0); //SDD } +*/ //______________________________________________________________________ void AliITSv11::Init(){ - // Initialise the ITS after it has been created. - // Inputs: - // none. - // Outputs: - // none. - // Return - // none. + // + // Initialise the ITS after it has been created. + // + + //AliInfo(Form("Minor version %d",fMinorVersion)); + // + UpdateInternalGeometry(); + AliITS::Init(); + + // +/* + if(GetITSgeom()!=0) SetITSgeom(0x0); + AliITSgeom* geom = new AliITSgeom(); + SetITSgeom(geom); + AliITS::Init(); +*/ // } + + //______________________________________________________________________ void AliITSv11::SetDefaults(){ - // Sets the default segmentation, response, digit and raw cluster - // classes to be used. These defaults can be overwritten in the - // macros that do these later steps. Defaults are give hear for the - // general user. - // Inputs: - // none. - // Outputs: - // none. - // Return - // none. + // + // Set response and segmentation models for SPD, SDD and SSD + // + +// if(!fDetTypeSim) fDetTypeSim = new AliITSDetTypeSim(); +// fDetTypeSim->SetITSgeom(GetITSgeom()); + if(!fDetTypeSim) { + Warning("SetDefaults","Error fDetTypeSim not defined"); + return; + } + + fDetTypeSim->ResetCalibrationArray(); + fDetTypeSim->ResetSegmentation(); + fDetTypeSim->SetDefaults(); + + if(fgkNTYPES>3){ + Warning("SetDefaults", + "Only the four basic detector types are initialised!"); + }// end if + + + return; } + + + + + //______________________________________________________________________ -void AliITSv11::DrawModule(){ - // Draw a standard set of shaded view of the ITS version 11. - // Inputs: - // none. - // Outputs: - // none. - // Return - // none. +void AliITSv11::DrawModule() const{ + } + +// //______________________________________________________________________ +// void AliITSv11::StepManager(){ +// // +// // Called for every step in the ITS, then calles the AliITShit class +// // creator with the information to be recoreded about that hit. +// // +// Int_t copy, id; +// TLorentzVector position, momentum; +// static TLorentzVector position0; +// static Int_t stat0=0; + +// if(!(this->IsActive())){ +// return; +// } // end if !Active volume. + +// if(!(gMC->TrackCharge())) return; + +// id=gMC->CurrentVolID(copy); + +// Bool_t sensvol = kFALSE; +// for(Int_t kk=0;kk<6;kk++)if(id == fIdSens[kk])sensvol=kTRUE; +// if(sensvol && (gMC->IsTrackExiting())){ +// copy = fTrackReferences->GetEntriesFast(); +// TClonesArray &lTR = *fTrackReferences; +// // Fill TrackReference structure with this new TrackReference. +// new(lTR[copy]) AliTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber()); +// } // if Outer ITS mother Volume + + +// Int_t copy1,copy2; +// Int_t vol[5]; +// TClonesArray &lhits = *fHits; +// // +// // Track status +// vol[3] = 0; +// vol[4] = 0; +// if(gMC->IsTrackInside()) vol[3] += 1; +// if(gMC->IsTrackEntering()) vol[3] += 2; +// if(gMC->IsTrackExiting()) vol[3] += 4; +// if(gMC->IsTrackOut()) vol[3] += 8; +// if(gMC->IsTrackDisappeared()) vol[3] += 16; +// if(gMC->IsTrackStop()) vol[3] += 32; +// if(gMC->IsTrackAlive()) vol[3] += 64; +// // +// // Fill hit structure. +// if(!(gMC->TrackCharge())) return; +// // +// // Only entering charged tracks +// if((id = gMC->CurrentVolID(copy)) == fIdSens[0]) { +// vol[0] = 1; +// id = gMC->CurrentVolOffID(2,copy); +// //detector copy in the ladder = 1<->4 (ITS1 < I101 < I103 < I10A) +// vol[1] = copy; +// gMC->CurrentVolOffID(3,copy1); +// //ladder copy in the module = 1<->2 (I10A < I12A) +// gMC->CurrentVolOffID(4,copy2); +// //module copy in the layer = 1<->10 (I12A < IT12) +// vol[2] = copy1+(copy2-1)*2;//# of ladders in one module = 2 +// } else if(id == fIdSens[1]){ +// vol[0] = 2; +// id = gMC->CurrentVolOffID(2,copy); +// //detector copy in the ladder = 1<->4 (ITS2 < I1D1 < I1D3 < I20A) +// vol[1] = copy; +// gMC->CurrentVolOffID(3,copy1); +// //ladder copy in the module = 1<->4 (I20A < I12A) +// gMC->CurrentVolOffID(4,copy2); +// //module copy in the layer = 1<->10 (I12A < IT12) +// vol[2] = copy1+(copy2-1)*4;//# of ladders in one module = 4 +// } else if(id == fIdSens[2]){ +// vol[0] = 3; +// id = gMC->CurrentVolOffID(1,copy); +// //detector copy in the ladder = 1<->6 (ITS3 < I302 < I004) +// vol[1] = copy; +// id = gMC->CurrentVolOffID(2,copy); +// //ladder copy in the layer = 1<->14 (I004 < IT34) +// vol[2] = copy; +// } else if(id == fIdSens[3]){ +// vol[0] = 4; +// id = gMC->CurrentVolOffID(1,copy); +// //detector copy in the ladder = 1<->8 (ITS4 < I402 < I005) +// vol[1] = copy; +// id = gMC->CurrentVolOffID(2,copy); +// //ladder copy in the layer = 1<->22 (I005 < IT34)) +// vol[2] = copy; +// }else if(id == fIdSens[4]){ +// vol[0] = 5; +// id = gMC->CurrentVolOffID(1,copy); +// //detector copy in the ladder = 1<->22 (ITS5 < I562 < I565) +// vol[1] = copy; +// id = gMC->CurrentVolOffID(2,copy); +// //ladder copy in the layer = 1<->34 (I565 < IT56) +// vol[2] = copy; +// }else if(id == fIdSens[5]){ +// vol[0] = 6; +// id = gMC->CurrentVolOffID(1,copy); +// //detector copy in the ladder = 1<->25 (ITS6 < I566 < I569) +// vol[1] = copy; +// id = gMC->CurrentVolOffID(2,copy); +// //ladder copy in the layer = 1<->38 (I569 < IT56) +// vol[2] = copy; +// } else { +// return; // not an ITS volume? +// } // end if/else if (gMC->CurentVolID(copy) == fIdSens[i]) +// // +// gMC->TrackPosition(position); +// gMC->TrackMomentum(momentum); +// vol[4] = stat0; +// if(gMC->IsTrackEntering()){ +// position0 = position; +// stat0 = vol[3]; +// return; +// } // end if IsEntering +// // Fill hit structure with this new hit. + +// new(lhits[fNhits++]) AliITShit(fIshunt,gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, +// gMC->Edep(),gMC->TrackTime(),position, +// position0,momentum); + +// position0 = position; +// stat0 = vol[3]; + +// return; +// } + + //______________________________________________________________________ void AliITSv11::StepManager(){ - // Called for every step in the ITS, then calles the AliITShit class - // creator with the information to be recoreded about that hit. - // The value of the macro ALIITSPRINTGEOM if set to 1 will allow the - // printing of information to a file which can be used to create a .det - // file read in by the routine CreateGeometry(). If set to 0 or any other - // value except 1, the default behavior, then no such file is created nor - // is the extra variables and the like used in the printing allocated. + // + // Called for every step in the ITS, then calles the AliITShit class + // creator with the information to be recoreded about that hit. + // + Int_t copy, id; + TLorentzVector position, momentum; + static TLorentzVector position0; + static Int_t stat0=0; + + if(!(this->IsActive())){ + return; + } // end if !Active volume. + + if(!(gMC->TrackCharge())) return; + + id=gMC->CurrentVolID(copy); + + Bool_t sensvol = kFALSE; + for(Int_t kk=0;kk<6;kk++)if(id == fIdSens[kk])sensvol=kTRUE; + if(sensvol && (gMC->IsTrackExiting())){ + AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber(), AliTrackReference::kITS); + } // if Outer ITS mother Volume + + + Int_t copy1,copy2; + Int_t vol[5]; + TClonesArray &lhits = *fHits; + // + // Track status + vol[3] = 0; + vol[4] = 0; + if(gMC->IsTrackInside()) vol[3] += 1; + if(gMC->IsTrackEntering()) vol[3] += 2; + if(gMC->IsTrackExiting()) vol[3] += 4; + if(gMC->IsTrackOut()) vol[3] += 8; + if(gMC->IsTrackDisappeared()) vol[3] += 16; + if(gMC->IsTrackStop()) vol[3] += 32; + if(gMC->IsTrackAlive()) vol[3] += 64; + // + // Fill hit structure. + if(!(gMC->TrackCharge())) return; + + // Only entering charged tracks + if((id = gMC->CurrentVolID(copy)) == fIdSens[0]) { + vol[0] = 1; + id = gMC->CurrentVolOffID(2,copy); + //detector copy in the ladder = 1<->4 (ITS1 < I101 < I103 < I10A) + vol[1] = copy; + gMC->CurrentVolOffID(3,copy1); + //ladder copy in the module = 1<->2 (I10A < I12A) + gMC->CurrentVolOffID(4,copy2); + //module copy in the layer = 1<->10 (I12A < IT12) + vol[2] = copy1+(copy2-1)*2;//# of ladders in one module = 2 + + } else if(id == fIdSens[1]){ + vol[0] = 2; + id = gMC->CurrentVolOffID(2,copy); + //detector copy in the ladder = 1<->4 (ITS2 < I1D1 < I1D3 < I20A) + vol[1] = copy; + gMC->CurrentVolOffID(3,copy1); + //ladder copy in the module = 1<->4 (I20A < I12A) + gMC->CurrentVolOffID(4,copy2); + //module copy in the layer = 1<->10 (I12A < IT12) + vol[2] = copy1+(copy2-1)*4;//# of ladders in one module = 4 + + } else if(id == fIdSens[2]){ + vol[0] = 3; + id = gMC->CurrentVolOffID(1,copy); + //detector copy in the ladder = 1<->6 (ITS3 < I302 < I004) + vol[1] = copy; + id = gMC->CurrentVolOffID(2,copy); + //ladder copy in the layer = 1<->14 (I004 < IT34) + vol[2] = copy; + + } else if(id == fIdSens[3]){ + vol[0] = 4; + id = gMC->CurrentVolOffID(1,copy); + //detector copy in the ladder = 1<->8 (ITS4 < I402 < I005) + vol[1] = copy; + id = gMC->CurrentVolOffID(2,copy); + //ladder copy in the layer = 1<->22 (I005 < IT34)) + vol[2] = copy; + + }else if(id == fIdSens[4]){ + vol[0] = 5; + id = gMC->CurrentVolOffID(1,copy); + //detector copy in the ladder = 1<->22 (ITS5 < I562 < I565) + vol[1] = copy; + id = gMC->CurrentVolOffID(2,copy); + //ladder copy in the layer = 1<->34 (I565 < IT56) + vol[2] = copy; + + }else if(id == fIdSens[5]){ + vol[0] = 6; + id = gMC->CurrentVolOffID(1,copy); + //detector copy in the ladder = 1<->25 (ITS6 < I566 < I569) + vol[1] = copy; + id = gMC->CurrentVolOffID(2,copy); + //ladder copy in the layer = 1<->38 (I569 < IT56) + vol[2] = copy; + } else { + return; // not an ITS volume? + } // end if/else if (gMC->CurentVolID(copy) == fIdSens[i]) + // + gMC->TrackPosition(position); + gMC->TrackMomentum(momentum); + vol[4] = stat0; + if(gMC->IsTrackEntering()){ + position0 = position; + stat0 = vol[3]; + return; + } // end if IsEntering + // Fill hit structure with this new hit. + + new(lhits[fNhits++]) AliITShit(fIshunt,gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, + gMC->Edep(),gMC->TrackTime(),position, + position0,momentum); + + position0 = position; + stat0 = vol[3]; + + return; } - +