#include <TNode.h>
#include <TTUBE.h>
#include <TVirtualMC.h>
+#include "TGeoManager.h"
+#include "TGeoPgon.h"
+#include "TGeoTube.h"
+#include "TGeoCompositeShape.h"
+#include <TGraph.h>
#include "AliLog.h"
#include "AliMagF.h"
//--------------------------------------------------------------------
AliSTARTv1::AliSTARTv1(const char *name, const char *title):
- AliSTART(name,title)
+ AliSTART(name,title),
+ fIdSens1(0)
{
//
// Standart constructor for START Detector version 0
//
- fIdSens1=0;
fIshunt = 2;
+ AliSTARTParameters* param = AliSTARTParameters::Instance();
+ for (Int_t i=0; i<24; i++){
+ TGraph* grEff = param ->GetPMTeff(i);
+ fEffPMT.AddAtAndExpand(grEff,i);
+ }
}
//_____________________________________________________________________________
Int_t *idtmed = fIdtmed->GetArray();
-
- AliSTARTParameters* param = AliSTARTParameters::Instance();
- param->Init();
+ /*
+ AliSTARTParameters* param = AliSTARTParameters::Instance();
+ param->Init();
Float_t zdetC = param->GetZposition(0);
Float_t zdetA = param->GetZposition(1);
-
+ */
+ Float_t zdetC = 69.7;
+ Float_t zdetA = 373.;
+
Int_t is;
Int_t idrotm[999];
Float_t x,y,z;
-
+ //C T0 mother volume
Float_t pstartR[18]={0., 360., 5.,
- -76.5+0.00+69.7, 4.25, 10.,
- -76.5+6.05+69.7, 4.5, 10.,
- -76.5+8.05+69.7, 4.5, 10.,
- -76.5+8.05+69.7, 5.1, 10.,
- -62.9+0.00+69.7, 5.1, 10.};
+ -6.8, 4.25, 10., //-76.5+0.00+69.7
+ -0.75 , 4.5, 10., // -76.5+6.05+69.7
+ 1.25 , 4.5, 10., //-76.5+8.05+69.7
+ 1.25 , 5.1, 10., //-76.5+8.05+69.7
+ 6.8 , 5.1, 10.}; //-62.9+0.00+69.7
- Float_t pstart[3]={4.29, 12.5,6.95};
+ Float_t pstart[3]={4., 12.5,6.8};
Float_t pinstart[3]={0.,1.6,6.5};
Float_t ppmt[3]={0.,1.5,3.5};
Float_t ptop[3]={0.,1.,1.0};
Float_t preg[3]={0., 1.0, 0.005}; //photcathode dobavil bogdanov
- Float_t ptopout[3]={1.,1.01,1.5};
+ Float_t ptopout[3]={1.,1.01, 1.}; //metal air around raiator for photos reflection
Float_t pbot[3]={0.6,1.2,0.1};
Float_t pglass[3]={1.2,1.3,2.};
Float_t pcer[3]={0.9,1.1,1.35};
ppcon[1] = 360;
ppcon[2] = 13;
// 1:
- ppcon[3] = 14.1/2;
+ ppcon[3] = 7.2;
ppcon[4] = 4.4;
ppcon[5] = 4.5;
// 2
- ppcon[6] = ppcon[3]+1.;
- ppcon[7] = 4.4;
- ppcon[8] = 4.5;
+ ppcon[6] = 8.2;
+ ppcon[7] = 4.4;
+ ppcon[8] = 4.5;
// 3
- ppcon[9] = ppcon[6];
- ppcon[10] = 4.4;
- ppcon[11] = 5.1;
+ ppcon[9] = 8.2;
+ ppcon[10] = 4.4;
+ ppcon[11] = 5.1;
// 4
- ppcon[12] = ppcon[9]+0.1;
- ppcon[13] = 4.4;
- ppcon[14] = 5.1;
+ ppcon[12] = 8.3;
+ ppcon[13] = 4.4;
+ ppcon[14] = 5.1;
// 5
- ppcon[15] = ppcon[12];
- ppcon[16] = 4.9;
- ppcon[17] = 5.1;
+ ppcon[15] = 8.3;
+ ppcon[16] = 4.9;
+ ppcon[17] = 5.1;
// 6
-// ppcon[18] = ppcon[15]+7.05;
- ppcon[18] = ppcon[15]+6.9;
- ppcon[19] = 4.9;
- ppcon[20] = 5.1;
+ ppcon[18] = 15.;
+ ppcon[19] = 4.9;
+ ppcon[20] = 5.1;
// 7
- ppcon[21] = ppcon[18];
- ppcon[22] = 4.9;
- ppcon[23] = 5.1;
+ ppcon[21] = 15.;
+ ppcon[22] = 3.15 ;
+ ppcon[23] = 5.1;
/// 8
- ppcon[24] = ppcon[21]+0.01;
- ppcon[25] = 3.15;
- ppcon[26] = 3.25;
-
+ ppcon[24] = 15.01;
+ ppcon[25] = 3.15;
+ ppcon[26] = 5.1;
+
/// 9
- ppcon[27] = ppcon[24];
- ppcon[28] = 3.15;
- ppcon[29] = 3.25;
+ ppcon[27] = 15.01;
+ ppcon[28] = 3.15;
+ ppcon[29] = 3.25;
+
+/// 9
+ ppcon[30] = 19.71;
+ ppcon[31] = 3.15;
+ ppcon[32] = 3.25;
// 10
- ppcon[30] = ppcon[27]+4.5;
- ppcon[31] = 3.15;
- ppcon[32] = 3.25;
-
-// 11
- ppcon[33] = ppcon[30];
- ppcon[34] = 3.15;
- ppcon[35] = 3.25;
-
-// 12
- ppcon[36] = ppcon[33];
- ppcon[37] = 3.15;
- ppcon[38] = 7.6;
-
-// 13
- ppcon[39] = ppcon[33]+0.4;
- ppcon[40] = 3.15;
- ppcon[41] = 7.6;
-
-// 14
-// ppcon[39] = ppcon[36];
-// ppcon[40] = 3.15;
-// ppcon[41] = 7.6;
+ ppcon[33] = 19.8;
+ ppcon[34] = 3.15;
+ ppcon[35] = 3.25;
+ // 11
+ ppcon[36] = 19.8;
+ ppcon[37] = 3.15;
+ ppcon[38] = 7.6;
+
+ // 14
+ ppcon[39] = 19.91;
+ ppcon[40] = 3.15;
+ ppcon[41] = 7.6;
gMC->Gsvolu("0SUP", "PCON", idtmed[kAir], ppcon,42);
- z=-zdetC;
+ z = -zdetC;
gMC->Gspos("0SUP",1,"ALIC",0.,0.,z,idrotm[901],"ONLY");
-
- //-------------------------------------------------------------------
+
+//-------------------------------------------------------------------
// START volume
//-------------------------------------------------------------------
gMC->Gsvolu("0STR","PCON",idtmed[kAir],pstartR,18);
gMC->Gsvolu("0STL","TUBE",idtmed[kAir],pstart,3);
- gMC->Gspos("0STR",1,"ALIC",0.,0.,-zdetC-pstart[2],idrotm[901],"ONLY");
- gMC->Gspos("0STL",1,"ALIC",0.,0.,zdetA+pstart[2],0,"ONLY");
+ gMC->Gspos("0STR",1,"ALIC",0.,0.,-zdetC+pstartR[3],idrotm[901],"ONLY");
+ // gMC->Gspos("0STL",1,"ALIC",0.,0.,zdetA+pstart[2],0,"ONLY");
//START interior
gMC->Gsvolu("0INS","TUBE",idtmed[kAir],pinstart,3);
gMC->Gsvolu("0SU6","TUBE",idtmed[kC],psupport5,3);// stakanchik dlai feu C
gMC->Gsvolu("0SU7","TUBE",idtmed[kAl],psupport6,3);//kryshechka stakanchika Al
gMC->Gsvolu("0SU8","TUBE",idtmed[kAl],psupport7,3);//kolechko snaruzhu stakanchika Al
-
+
+
+
+ //non-absorber side support and T0A !!!!!!!!
+
+ TGeoPgon * supPgon = new TGeoPgon("supPgon",0.,360.,360,4);
+ supPgon->DefineSection(0, 0, 4.1, 5.5);
+ supPgon->DefineSection(1, 10.5 , 4.1, 5.5);
+ supPgon->DefineSection(2, 10.5 , 4.1, 4.9);
+ supPgon->DefineSection(3, 12.5 , 4.1, 4.9);
+ TGeoTranslation *trPgon = new TGeoTranslation("trPgon",0,0,0);
+ trPgon->RegisterYourself();
+
+ TGeoVolumeAssembly * stlin = new TGeoVolumeAssembly("OSTL");//empty segment
+ TGeoVolume *ins = gGeoManager->GetVolume("0INS");
+
+ Double_t phimin = TMath::ACos((16-4.8)/16.) * (180 / TMath::Pi()) ;
+ // TGeoTubeSeg *hole = new TGeoTubeSeg("hole", 0, 1.6, 0, -phimin+90, phimin+90);
+ TGeoTube*hole = new TGeoTube("hole", 0, 1.61, 6.5);
+ TGeoTranslation *tr [12];
+ Float_t angle = 2 * TMath::Pi() / 12;
+ Char_t nameTr[4];
+ for (Int_t itr=0; itr<12; itr++) {
+ sprintf (nameTr,"tr%i",itr+1);
+ x = 6.5 * TMath::Sin(itr * angle);
+ y = 6.5 * TMath::Cos(itr * angle);
+ tr[itr] = new TGeoTranslation(nameTr,x,y,6.5);
+ tr[itr]->RegisterYourself();
+ stlin->AddNode(ins,itr+13,tr[itr]);
+ }
+ TGeoCompositeShape *supsh = new TGeoCompositeShape("supsh","supPgon:trPgon-(hole:tr1+hole:tr2+hole:tr3+hole:tr4+hole:tr5+hole:tr6+hole:tr7+hole:tr8+hole:tr9+hole:tr10+hole:tr11+hole:tr12)");
+
+ TGeoMedium *medal = gGeoManager->GetMedium("START_Aluminium$");
+ TGeoVolume *supA = new TGeoVolume("0SUA",supsh,medal);
+ stlin->AddNode(supA,1,new TGeoTranslation(0,0,0));
+
+ TGeoVolume *alice = gGeoManager->GetVolume("ALIC");
+ alice->AddNode(stlin,1,new TGeoTranslation(0,0, zdetA ));
+
+ // T0A finished
+
+ //T0C
// first ring: 12 units of Scintillator+PMT+divider
Float_t theta = (180 / TMath::Pi()) * TMath::ATan(6.5 / zdetC);
- Float_t angle = 2 * TMath::Pi() / 12;
Float_t phi[3];
-
for (is=0; is<12; is++)
{
theta, phi[2]);
z=-pstart[2]+pinstart[2]+0.2;
gMC->Gspos ("0INS", is + 1, "0STR", x, y, z, idrotm[902 + is], "ONLY");
- gMC->Gspos ("0INS", is + 13, "0STL", x, y, z, 0, "ONLY");
- }
-
-
+ }
+
x=0;
y=0;
z=-pinstart[2]+ppmt[2]+psupport6[2]*2;
gMC->Gsvolu("0TOP","TUBE",idtmed[kOpGlass],ptop,3); //glass
z=-ppmt[2]+ptop[2];
gMC->Gspos("0TOP",1,"0PMT",0,0,z,0,"ONLY");
- //metal volume to simulate reclection
- gMC->Gsvolu("0TOO","TUBE",idtmed[kOpAir],ptopout,3); //glass
+ //"metal" air volume to simulate reclection
+ gMC->Gsvolu("0TOO","TUBE",idtmed[kOpAir],ptopout,3);
gMC->Gspos("0TOO",1,"0PMT",0,0,z,0,"ONLY");
//Fotokatod
z +=psteel[2]+pcer[2];
gMC->Gspos("0STE",1,"0PMT",0,0,z,0,"ONLY");
- //Support left side
+ //Support absorber (C) side
z=-pstart[2]+psupport1[2]+0.1;
gMC->Gspos("0SU1",1,"0STR",0,0,z,0,"ONLY"); //C kozhuh snaruzhi
gMC->Gspos("0SU2",1,"0STR",0,0,z,0,"ONLY"); //C kozhuh vnutri
z=z+par[2];
par[0]=4.9;
par[1]=5.0;
- par[2]=6.9/2;
+ par[2]=6.7/2;
gMC->Gsvolu("0SC2","TUBE",idtmed[kC],par,3);
z += par[2];
gMC->Gspos("0SC2",1,"0SUP",0,0,z,0,"ONLY");
z += par[2];
- par[0]=3.15;
+ par[0]=3.15;
par[1]=4.9;
par[2]=0.1/2;
gMC->Gsvolu("0SA1","TUBE",idtmed[kAl],par,3);
z += par[2];
+ cout<<" z 0SA1 "<<z<<endl;
gMC->Gspos("0SA1",1,"0SUP",0,0,z,0,"ONLY");
z=z+par[2];
par[0]=3.15;
par[1]=3.16;
- par[2]=4.5/2;
+ par[2]=4.7/2;
+ cout<<" z 0SA2 "<<z<<endl;
gMC->Gsvolu("0SA2","TUBE",idtmed[kAl],par,3);
z += par[2];
gMC->Gspos("0SA2",1,"0SUP",0,0,z,0,"ONLY");
z=z+par[2];
par[0]=3.16; // eta chast' prikruchena k absorberu
par[1]=7.5;
- par[2]=0.2;
+ par[2]=0.1;
+ cout<<" z 0SA23"<<z<<endl;
gMC->Gsvolu("0SA3","TUBE",idtmed[kAl],par,3);
z += par[2];
gMC->Gspos("0SA3",1,"0SUP",0,0,z,0,"ONLY");
par[0]=3.16; // gvozdi eta chast' prikruchena k absorberu
par[1]=7.5;
par[2]=0.01;
+ cout<<" z 0SN2 "<<z<<endl;
gMC->Gsvolu("0SN2","TUBE",idtmed[kSteel],par,3);
gMC->Gspos("0SN2",1,"0SUP",0,0,z,0,"ONLY");
-
+
+
+
}
//------------------------------------------------------------------------
+void AliSTARTv1::AddAlignableVolumes() const
+{
+ //
+ // Create entries for alignable volumes associating the symbolic volume
+ // name with the corresponding volume path. Needs to be syncronized with
+ // eventual changes in the geometry.
+ //
+
+ TString volPath;
+ TString symName, sn;
+
+ TString vpA = "/ALIC_1/0STL_1/0INS_";
+ TString vpC = "/ALIC_1/0STR_1/0INS_";
+ TString vpInside = "/0PMT_1/0TOP_1";
+
+
+ for (Int_t imod=0; imod<24; imod++)
+ {
+ if (imod < 12)
+ {volPath = vpC; sn="START/C/PMT";}
+ else
+ {volPath = vpA; sn="START/A/PMT";}
+ volPath += imod+1;
+ volPath += vpInside;
+
+ symName = sn;
+ symName += imod+1;
+
+ AliDebug(2,"--------------------------------------------");
+ AliDebug(2,Form("Alignable object %d", imod));
+ AliDebug(2,Form("volPath=%s\n",volPath.Data()));
+ AliDebug(2,Form("symName=%s\n",symName.Data()));
+ AliDebug(2,"--------------------------------------------");
+ gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data());
+ // if(!gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data()))
+ // AliFatal(Form("Alignable entry %s not created. Volume path %s not valid",
+ // symName.Data(),volPath.Data()));
+
+ }
+}
+//------------------------------------------------------------------------
void AliSTARTv1::CreateMaterials()
{
Int_t isxfld = gAlice->Field()->Integ();
if(!gMC->IsTrackAlive()) return; // particle has disappeared
-// If particles is photon then ...
+
+ // If particles is photon then ...
if (gMC->TrackPid() == 50000050)
{
// Check the sensetive volume
if(id==fIdSens1 ) {
if(gMC->IsTrackEntering()) {
- gMC->CurrentVolOffID(2,copy);
- vol[1]=copy;
- gMC->CurrentVolOffID(3,copy1);
- vol[0]=copy1;
- gMC->TrackPosition(pos);
- hits[0] = pos[0];
- hits[1] = pos[1];
- hits[2] = pos[2];
- if(pos[2]<0) vol[0]=2;
- if(pos[2]>=0) vol[0]=1;
-
- Float_t etot=gMC->Etot();
- hits[3]=etot;
- Int_t iPart= gMC->TrackPid();
- Int_t partID=gMC->IdFromPDG(iPart);
- hits[4]=partID;
- Float_t ttime=gMC->TrackTime();
- hits[5]=ttime*1e12;
- AddHit(fIshunt,vol,hits);
+ gMC->CurrentVolOffID(2,copy);
+ vol[1]=copy;
+ gMC->CurrentVolOffID(3,copy1);
+ vol[0]=copy1;
+ gMC->TrackPosition(pos);
+ hits[0] = pos[0];
+ hits[1] = pos[1];
+ hits[2] = pos[2];
+ if(pos[2]<0) vol[0]=2;
+ if(pos[2]>=0) vol[0]=1;
+
+ Float_t etot=gMC->Etot();
+ hits[3]=etot;
+ Int_t iPart= gMC->TrackPid();
+ Int_t partID=gMC->IdFromPDG(iPart);
+ hits[4]=partID;
+ Float_t ttime=gMC->TrackTime();
+ hits[5]=ttime*1e12;
+ if(RegisterPhotoE(vol[1]-1,hits[3]))
+ AddHit(fIshunt,vol,hits);
+
+ }
// cout<< gAlice->GetMCApp()->GetCurrentTrackNumber()<<" hit added "<<endl;
- }
+
/*
printf("track(%i) alive(%i) disap(%i) enter(%i) exit(%i) inside(%i) out(%i) stop(%i) new(%i) \n",
gAlice->GetMCApp()->GetCurrentTrackNumber(),
+//------------------------------------------------------------------------
+Bool_t AliSTARTv1::RegisterPhotoE(Int_t ipmt,Double_t energy)
+{
+
+
+ // Float_t hc=197.326960*1.e6; //mev*nm
+ Double_t hc=1.973*1.e-6; //gev*nm
+ Float_t lambda=hc/energy;
+ Float_t eff = ((TGraph*) fEffPMT.At(ipmt))->Eval(lambda);
+ Double_t p = gRandom->Rndm();
+
+ if (p > eff)
+ return kFALSE;
+
+ return kTRUE;
+}
+
+//----------------------------------------------------------------------------
+