#include "AliHMPIDRawStream.h" //Digits2Raw(), Raw2SDigits()
#include "AliRawReader.h" //Raw2SDigits()
#include "AliTrackReference.h"
-#include <TVirtualMC.h> //StepManager() for gMC
+#include <TVirtualMC.h> //StepManager() for TVirtualMC::GetMC()
#include <TPDGCode.h> //StepHistory()
#include <AliStack.h> //StepManager(),Hits2SDigits()78.6
#include <AliLoader.h> //Hits2SDigits()
#include <AliMC.h> //StepManager()
#include <AliRun.h> //CreateMaterials()
#include <AliMagF.h> //CreateMaterials()
+#include "AliGeomManager.h" //AddAlignableVolumes()
+#include <AliCDBEntry.h> //CreateMaterials()
+#include <AliCDBManager.h> //CreateMaterials()
#include <TF1.h> //DefineOpticalProperties()
#include <TF2.h> //DefineOpticalProperties()
-#include <TLorentzVector.h> //IsLostByFresnel()
-#include <AliCDBManager.h> //CreateMaterials()
-#include <AliCDBEntry.h> //CreateMaterials()
+#include <TGeoCompositeShape.h> //CradleBaseVolume()
+#include <TGeoGlobalMagField.h>
#include <TGeoPhysicalNode.h> //AddAlignableVolumes()
#include <TGeoXtru.h> //CradleBaseVolume()
-#include <TGeoCompositeShape.h> //CradleBaseVolume()
+#include <TLorentzVector.h> //IsLostByFresnel()
#include <TString.h> //StepManager()
+#include <TTree.h>
+
ClassImp(AliHMPIDv3)
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void AliHMPIDv3::AddAlignableVolumes()const
// Arguments: none
// Returns: none
+ AliGeomManager::ELayerID idHMPID = AliGeomManager::kHMPID;
+ Int_t modUID, modnum = 0;
+
TGeoHMatrix *pGm = new TGeoHMatrix;
Double_t trans[3]={0.5*131.24,0.5*126.16,0}; //translation from LORS to TGeo RS (half size AllX, half size allY,0)
pGm->SetTranslation(trans);
Double_t ph[7]={10.,10., 30.,30.,30. ,50.,50};
for(Int_t iCh=AliHMPIDParam::kMinCh;iCh<=AliHMPIDParam::kMaxCh;iCh++) {
- gGeoManager->SetAlignableEntry(Form("/HMPID/Chamber%i",iCh),Form("ALIC_1/Hmp%i_0",iCh)); //aligment without AliCluster3D
- //Get Tracking To Local matrcies for alignment with AliCluster3D
- TGeoPNEntry *eCh = gGeoManager->GetAlignableEntry(Form("/HMPID/Chamber%i",iCh));
- if (eCh) {
- const char *path = eCh->GetTitle();
- if (!gGeoManager->cd(path)) {
- AliFatal(Form("Volume path %s not valid!",path));
- }
- TGeoHMatrix *globMatrix = gGeoManager->GetCurrentMatrix();
- //Double_t phi = 20.0 * ((iCh+1) / 3) + 10.0;
- Double_t phi = ph[iCh];
- TGeoHMatrix *t2l = new TGeoHMatrix();
- t2l->RotateZ(phi);
- t2l->MultiplyLeft(&(globMatrix->Inverse()));
- eCh->SetMatrix(t2l);
- }//eCh
- else {
- AliError(Form("Alignable entry /HMPID/Chamber%i is not valid!",iCh));
- }
- }//iCh loop
+ modUID = AliGeomManager::LayerToVolUID(idHMPID,modnum++);
+ if(!gGeoManager->SetAlignableEntry(Form("/HMPID/Chamber%i",iCh),Form("ALIC_1/Hmp%i_0",iCh),modUID))
+ AliError("AliHMPIDv3::Unable to set alignable entry!!"); //aligment without AliCluster3D
+ //Get Tracking To Local matricies for alignment with AliCluster3D
+ TGeoPNEntry *eCh = gGeoManager->GetAlignableEntryByUID(modUID);
+ TGeoHMatrix *globMatrix = eCh->GetGlobalOrig();
+
+ //Double_t phi = 20.0 * ((iCh+1) / 3) + 10.0;
+ Double_t phi = ph[iCh];
+ TGeoHMatrix *t2l = new TGeoHMatrix();
+ t2l->RotateZ(phi);
+ t2l->MultiplyLeft(&(globMatrix->Inverse()));
+ eCh->SetMatrix(t2l);
+ }//iCh loop
+
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void AliHMPIDv3::CreateMaterials()
Int_t matId=0; //tmp material id number
Int_t unsens = 0, sens=1; //sensitive or unsensitive medium
- Int_t itgfld = gAlice->Field()->Integ(); //type of field intergration 0 no field -1 user in guswim 1 Runge Kutta 2 helix 3 const field along z
- Float_t maxfld = gAlice->Field()->Max(); //max field value
+ Int_t itgfld = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Integ(); //type of field intergration 0 no field -1 user in guswim 1 Runge Kutta 2 helix 3 const field along z
+ Float_t maxfld = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Max(); //max field value
Float_t tmaxfd = -10.0; //max deflection angle due to magnetic field in one step
Float_t deemax = - 0.2; //max fractional energy loss in one step
Float_t stemax = - 0.1; //max step allowed [cm]
AliMaterial(++matId,"W" ,aW ,zW ,dW ,radW ,absW ); AliMedium(kW ,"W" , matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
AliMaterial(++matId,"Al" ,aAl ,zAl ,dAl ,radAl ,absAl ); AliMedium(kAl ,"Al" , matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
AliMaterial(++matId,"Ar" ,aAr ,zAr ,dAr ,radAr ,absAr ); AliMedium(kAr ,"Ar" , matId, unsens, itgfld, maxfld, tmaxfd, stemax, deemax, epsil, stmin);
-
- InitProperties();
}//void AliHMPID::CreateMaterials()
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-void AliHMPIDv3::InitProperties()
-{
+//void AliHMPIDv3::InitProperties()
+//{
/*
* HMPID
* ====
HMPID 6 1.e-5 1.e-5 1.e-4 -1. 1.e-4 -1. -1. 5.e-5 5.e-5 -1. -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
* PCB backplane (> 50 keV delta-electrons)
HMPID 12 1.e-5 1.e-5 1.e-4 -1. 1.e-4 -1. -1. 5.e-5 5.e-5 -1. -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
-*/
+
Int_t *idtmed = fIdtmed->GetArray();
Int_t imed;
imed = kSiO2; // * Quarz Window (>1000 keV delta-electrons)
- gMC->Gstpar(idtmed[imed], "CUTGAM",1.e-4);
- gMC->Gstpar(idtmed[imed], "CUTELE",1.e-4);
- gMC->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
- gMC->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
- gMC->Gstpar(idtmed[imed], "DCUTE" ,1.e-3);
- gMC->Gstpar(idtmed[imed], "CUTHAD",1.e-3);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTGAM",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTELE",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DCUTE" ,1.e-3);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTHAD",1.e-3);
- gMC->Gstpar(idtmed[imed], "DRAY",1);
- gMC->Gstpar(idtmed[imed], "LOSS",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DRAY",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "LOSS",1);
imed = kC6F14; // * Freon Radiator (> 500 keV delta-electrons)
- gMC->Gstpar(idtmed[imed], "CUTGAM",1.e-4);
- gMC->Gstpar(idtmed[imed], "CUTELE",1.e-4);
- gMC->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
- gMC->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
- gMC->Gstpar(idtmed[imed], "DCUTE" ,5.e-4);
- gMC->Gstpar(idtmed[imed], "CUTHAD",5.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTGAM",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTELE",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DCUTE" ,5.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTHAD",5.e-4);
- gMC->Gstpar(idtmed[imed], "DRAY",1);
- gMC->Gstpar(idtmed[imed], "LOSS",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DRAY",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "LOSS",1);
imed = kCH4; // * Methane Gap (> 100 keV delta-electrons)
- gMC->Gstpar(idtmed[imed], "CUTGAM",5.e-5);
- gMC->Gstpar(idtmed[imed], "CUTELE",5.e-5);
- gMC->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
- gMC->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
- gMC->Gstpar(idtmed[imed], "DCUTE" ,1.e-4);
- gMC->Gstpar(idtmed[imed], "CUTHAD",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTGAM",5.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTELE",5.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DCUTE" ,1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTHAD",1.e-4);
- gMC->Gstpar(idtmed[imed], "DRAY",1);
- gMC->Gstpar(idtmed[imed], "LOSS",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DRAY",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "LOSS",1);
imed = kCsI; // * CSI (> 50 keV delta-electrons)
- gMC->Gstpar(idtmed[imed], "CUTGAM",1.e-5);
- gMC->Gstpar(idtmed[imed], "CUTELE",1.e-5);
- gMC->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
- gMC->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
- gMC->Gstpar(idtmed[imed], "DCUTE" ,5.e-5);
- gMC->Gstpar(idtmed[imed], "CUTHAD",5.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTGAM",1.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTELE",1.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DCUTE" ,5.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTHAD",5.e-5);
- gMC->Gstpar(idtmed[imed], "DRAY",1);
- gMC->Gstpar(idtmed[imed], "LOSS",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DRAY",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "LOSS",1);
imed = kAl; // * Alluminium (> 50 keV delta-electrons)
- gMC->Gstpar(idtmed[imed], "CUTGAM",1.e-5);
- gMC->Gstpar(idtmed[imed], "CUTELE",1.e-5);
- gMC->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
- gMC->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
- gMC->Gstpar(idtmed[imed], "DCUTE" ,5.e-5);
- gMC->Gstpar(idtmed[imed], "CUTHAD",5.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTGAM",1.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTELE",1.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DCUTE" ,5.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTHAD",5.e-5);
- gMC->Gstpar(idtmed[imed], "DRAY",1);
- gMC->Gstpar(idtmed[imed], "LOSS",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DRAY",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "LOSS",1);
imed = kCu; // * Copper (> 50 keV delta-electrons)
- gMC->Gstpar(idtmed[imed], "CUTGAM",1.e-5);
- gMC->Gstpar(idtmed[imed], "CUTELE",1.e-5);
- gMC->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
- gMC->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
- gMC->Gstpar(idtmed[imed], "DCUTE" ,5.e-5);
- gMC->Gstpar(idtmed[imed], "CUTHAD",5.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTGAM",1.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTELE",1.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DCUTE" ,5.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTHAD",5.e-5);
- gMC->Gstpar(idtmed[imed], "DRAY",1);
- gMC->Gstpar(idtmed[imed], "LOSS",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DRAY",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "LOSS",1);
imed = kW; // * Tungsten (> 50 keV delta-electrons)
- gMC->Gstpar(idtmed[imed], "CUTGAM",1.e-5);
- gMC->Gstpar(idtmed[imed], "CUTELE",1.e-5);
- gMC->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
- gMC->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
- gMC->Gstpar(idtmed[imed], "DCUTE" ,5.e-5);
- gMC->Gstpar(idtmed[imed], "CUTHAD",5.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTGAM",1.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTELE",1.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTNEU",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTMUO",1.e-4);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DCUTE" ,5.e-5);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "CUTHAD",5.e-5);
- gMC->Gstpar(idtmed[imed], "DRAY",1);
- gMC->Gstpar(idtmed[imed], "LOSS",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "DRAY",1);
+ TVirtualMC::GetMC()->Gstpar(idtmed[imed], "LOSS",1);
-}
+}*/
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void AliHMPIDv3::CreateGeometry()
{
//includind the HMPID cradle
AliDebug(1,"Start main.");
- if(!gMC->IsRootGeometrySupported()) return;
+ if(!TVirtualMC::GetMC()->IsRootGeometrySupported()) return;
TGeoVolume *hmpcradle = CreateCradle();
TString title=GetTitle();
TGeoVolume *proxgap1 = gGeoManager->MakeBox("Hproxgap1",ch4,1407*mm/2 , 1366.00*mm/2 ,(9.-7.5)*mm/2.);//methane volume between quartz and fr4
- TGeoVolume *proxgap2 = gGeoManager->MakeBox("Hproxgap2",ch4,1407*mm/2 , 1366.00*mm/2 ,(81.7-6.2-9.-7.5)*mm/2.);//methane volume between fr4 and Hgap
-
+ TGeoVolume *proxgap2 = gGeoManager->MakeBox("Hproxgap2",ch4,1407*mm/2 , 1366.00*mm/2 ,(81.7-6.2-34.-9.-7.5)*mm/2.);//methane volume between fr4 and Hgap(tot height(81.7) - Hsec (6.2) - proxygap2 (34) - upper bound of fr4 (9+7.5))
+
// ^ Y z= z=-12mm z=98.25mm ALIC->7xHmp (virtual)-->1xHsbo (virtual) --->2xHcov (real) 2072P1
// | ____________________________________ | |-->1xHhon (real) 2072P1
fr1->AddNode(fr1perUpBig,1,new TGeoTranslation(0.,-(1385-37-35)*mm/2.,(58.3*mm-20.00*2*mm-10.0*mm)/2.));
fr1->AddNode(fr1perUpSma,1,new TGeoTranslation(-(1426-37-35)*mm/2.,0.,(58.3*mm-20.00*2*mm-10.0*mm)/2.));
- fr1->AddNode(fr1perDowBig,0,new TGeoTranslation(0.,(1385-37-46)*mm/2.,(-58.3*mm+2.3*mm)/2.));
- fr1->AddNode(fr1perDowSma,0,new TGeoTranslation((1426-37-46)*mm/2.,0.,(-58.3*mm+2.3*mm)/2.));
- fr1->AddNode(fr1perDowBig,1,new TGeoTranslation(0.,-(1385-37-46)*mm/2.,(-58.3*mm+2.3*mm)/2.));
- fr1->AddNode(fr1perDowSma,1,new TGeoTranslation(-(1426-37-46)*mm/2.,0.,(-58.3*mm+2.3*mm)/2.));
-
+ fr1->AddNode(fr1perDowBig,0,new TGeoTranslation(0.,(1385-37)*mm/2.,(-58.3*mm+2.3*mm)/2.));
+ fr1->AddNode(fr1perDowSma,0,new TGeoTranslation((1426-37)*mm/2.,0.,(-58.3*mm+2.3*mm)/2.));
+ fr1->AddNode(fr1perDowBig,1,new TGeoTranslation(0.,-(1385-37)*mm/2.,(-58.3*mm+2.3*mm)/2.));
+ fr1->AddNode(fr1perDowSma,1,new TGeoTranslation(-(1426-37)*mm/2.,0.,(-58.3*mm+2.3*mm)/2.));
fr1->AddNode(ppf,4,new TGeoTranslation(-335*mm,433*mm,(-58.3+38.3)*mm/2.)); fr1->AddNode(ppf,5,new TGeoTranslation(335*mm,433*mm,(-58.3+38.3)*mm/2.));
fr1->AddNode(ppf,2,new TGeoTranslation(-335*mm,0.,(-58.3+38.3)*mm/2.)); fr1->AddNode(ppf,3,new TGeoTranslation(335*mm,0.,(-58.3+38.3)*mm/2.));
TGeoVolume *busext = gGeoManager->MakeTubs("Hbusext",csi,29*mm,30*mm,40*mm/2.,0.,180); //in Hext
TGeoVolume *ext = new TGeoVolumeAssembly("Hext");
+ rect->AddNode(gassipl2,1,new TGeoTranslation(0.,0.,0));
+
for(Int_t hor=0; hor< 10; hor++){
for(Int_t vert=0; vert < 8; vert++){
cufoil->AddNode(rect,hor+vert*10,new TGeoTranslation(offsetx+ 48.*mm/2 + hor*interdistx-662.*mm/2,offsety + 19.*mm/2 + vert*interdisty-425.*mm/2.,0.));
- cufoil->AddNode(gassipl2,hor+vert*10,new TGeoTranslation(offsetx+ 48.*mm/2 + hor*interdistx-662.*mm/2,offsety + 19.*mm/2 + vert*interdisty-425.*mm/2.,0.));
fr1upcard->AddNode(gassipl3,hor+vert*10,new TGeoTranslation(offsetx+ 48.*mm/2 + hor*interdistx-662.*mm/2,offsety + 19.*mm/2 + vert*interdisty-425.*mm/2.,0.));
ext->AddNode(gassipl4,hor+vert*10,new TGeoTranslation(offsetx+ 48.*mm/2 + hor*interdistx-662.*mm/2,offsety + 19.*mm/2 +
vert*interdisty-425.*mm/2.,0));
hmp->AddNode(proxgap1,0,new TGeoTranslation(0.,0.,(9.-7.5)*mm/2.));//due to the TGeoVolumeAssembly definition the ch4 volume must be inserted around the collecting wires
- hmp->AddNode(proxgap2,0,new TGeoTranslation(0.,0.,(9+7.5)*mm + (81.7-6.2-9.-7.5)*mm/2.));
+ hmp->AddNode(proxgap2,0,new TGeoTranslation(0.,0.,(9+7.5 +34)*mm + (81.7-6.2-34.-9.-7.5)*mm/2.));// tot height(81.7) - Hsec - proxygap2 - top edge fr4 at (9+7.5) mm
// ^ Y single cell 5.5mm CH4 = 1*mm CsI + 4.45*mm CsI x cath +0.05*mm safety margin
// | ______________________________
ppf->AddNode(smo,7,new TGeoTranslation(+ 65.0*mm,+151.875*mm, 0.*mm));
-hmp->AddNode(fr3,1,new TGeoTranslation(0.,0.,(80.-29.)*mm-34.*mm/2));
+//hmp->AddNode(fr3,1,new TGeoTranslation(0.,0.,(81.7-29.)*mm-34.*mm/2));
+ hmp->AddNode(fr3,1,new TGeoTranslation(0.,0.,(9.+7.5)*mm+34.*mm/2));
fr3->AddNode( fr3up,1, new TGeoTranslation(0., 0., 7*mm));
fr3->AddNode(fr3down,1,new TGeoTranslation(0., 0., -10*mm));
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void AliHMPIDv3::Init()
{
-// This method defines ID for sensitive volumes, i.e. such geometry volumes for which there are if(gMC->CurrentVolID()==XXX)
+// This method defines ID for sensitive volumes, i.e. such geometry volumes for which there are if(TVirtualMC::GetMC()->CurrentVolID()==XXX)
// statements in StepManager()
// Arguments: none
// Returns: none
AliDebug(1,"Start v2 HMPID.");
- fIdPad = gMC->VolId("Hpad");
- fIdCell = gMC->VolId("Hcel");
+ //InitProperties();
AliDebug(1,"Stop v2 HMPID.");
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void AliHMPIDv3::DefineOpticalProperties()
{
+ AliDebug(1,"");
+
// Optical properties definition.
- const Int_t kNbins=30; //number of photon energy points
- Float_t emin=5.5,emax=8.5; //Photon energy range,[eV]
+ const Int_t kNbins=30; //number of photon energy points
+ Float_t emin=5.5,emax=8.5; //Photon energy range,[eV]
+ Float_t deltaE = (emax - emin)/kNbins;
Float_t aEckov [kNbins];
Double_t dEckov [kNbins];
Float_t aAbsRad[kNbins], aAbsWin[kNbins], aAbsGap[kNbins], aAbsMet[kNbins];
Bool_t isFlatIdx=title.Contains("FlatIdx");
for(Int_t i=0;i<kNbins;i++){
- Float_t eV=emin+0.1*i; //Ckov energy in eV
+ Float_t eV=emin+deltaE*i; //Ckov energy in eV
aEckov [i] =1e-9*eV; //Ckov energy in GeV
dEckov [i] = aEckov[i];
aAbsRad[i]=pRaAF->Eval(eV); (isFlatIdx)? aIdxRad[i]=1.292: aIdxRad[i]=pRaIF->Eval(eV,20);
aQeAll[i] =1; //QE for all other materials except for PC must be 1.
aAbsMet[i] =0.0001; aIdxMet[i]=0; //metal ref idx must be 0 in order to reflect photon
aIdxPc [i]=1; aQePc [i]=pQeF->Eval(eV); //PC ref idx must be 1 in order to apply photon to QE conversion
- dQePc [i]=pQeF->Eval(eV);
+ dQePc [i]= pQeF->Eval(eV);
dReflMet[i] = 0.; // no reflection on the surface of the pc (?)
}
- gMC->SetCerenkov((*fIdtmed)[kC6F14] , kNbins, aEckov, aAbsRad , aQeAll , aIdxRad );
- gMC->SetCerenkov((*fIdtmed)[kSiO2] , kNbins, aEckov, aAbsWin , aQeAll , aIdxWin );
- gMC->SetCerenkov((*fIdtmed)[kCH4] , kNbins, aEckov, aAbsGap , aQeAll , aIdxGap );
- gMC->SetCerenkov((*fIdtmed)[kCu] , kNbins, aEckov, aAbsMet , aQeAll , aIdxMet );
- gMC->SetCerenkov((*fIdtmed)[kW] , kNbins, aEckov, aAbsMet , aQeAll , aIdxMet ); //n=0 means reflect photons
- gMC->SetCerenkov((*fIdtmed)[kCsI] , kNbins, aEckov, aAbsMet , aQePc , aIdxPc ); //n=1 means convert photons
- gMC->SetCerenkov((*fIdtmed)[kAl] , kNbins, aEckov, aAbsMet , aQeAll , aIdxMet );
+ TVirtualMC::GetMC()->SetCerenkov((*fIdtmed)[kC6F14] , kNbins, aEckov, aAbsRad , aQeAll , aIdxRad );
+ TVirtualMC::GetMC()->SetCerenkov((*fIdtmed)[kSiO2] , kNbins, aEckov, aAbsWin , aQeAll , aIdxWin );
+ TVirtualMC::GetMC()->SetCerenkov((*fIdtmed)[kCH4] , kNbins, aEckov, aAbsGap , aQeAll , aIdxGap );
+ TVirtualMC::GetMC()->SetCerenkov((*fIdtmed)[kCu] , kNbins, aEckov, aAbsMet , aQeAll , aIdxMet );
+ TVirtualMC::GetMC()->SetCerenkov((*fIdtmed)[kW] , kNbins, aEckov, aAbsMet , aQeAll , aIdxMet ); //n=0 means reflect photons
+ TVirtualMC::GetMC()->SetCerenkov((*fIdtmed)[kCsI] , kNbins, aEckov, aAbsMet , aQePc , aIdxPc ); //n=1 means convert photons
+ TVirtualMC::GetMC()->SetCerenkov((*fIdtmed)[kAl] , kNbins, aEckov, aAbsMet , aQeAll , aIdxMet );
// Define a skin surface for the photocatode to enable 'detection' in G4
- gMC->DefineOpSurface("surfPc", kGlisur /*kUnified*/,kDielectric_metal,kPolished, 0.);
- gMC->SetMaterialProperty("surfPc", "EFFICIENCY", kNbins, dEckov, dQePc);
- gMC->SetMaterialProperty("surfPc", "REFLECTIVITY", kNbins, dEckov, dReflMet);
- gMC->SetSkinSurface("skinPc", "Rpc", "surfPc");
+ for(Int_t i=0; i<7; i++){
+ TVirtualMC::GetMC()->DefineOpSurface(Form("surfPc%i",i), kGlisur /*kUnified*/,kDielectric_metal,kPolished, 0.);
+ TVirtualMC::GetMC()->SetMaterialProperty(Form("surfPc%i",i), "EFFICIENCY", kNbins, dEckov, dQePc);
+ TVirtualMC::GetMC()->SetMaterialProperty(Form("surfPc%i",i), "REFLECTIVITY", kNbins, dEckov, dReflMet);
+ TVirtualMC::GetMC()->SetSkinSurface(Form("skinPc%i",i), Form("Hpad%i",i),Form("surfPc%i",i)); }
delete pRaAF;delete pWiAF;delete pGaAF; delete pRaIF; delete pWiIF; delete pGaIF; delete pQeF;
}
// Calculate probability for the photon to be lost by Fresnel reflection.
TLorentzVector p4;
Double_t mom[3],localMom[3];
- gMC->TrackMomentum(p4); mom[0]=p4(1); mom[1]=p4(2); mom[2]=p4(3);
+ TVirtualMC::GetMC()->TrackMomentum(p4); mom[0]=p4(1); mom[1]=p4(2); mom[2]=p4(3);
localMom[0]=0; localMom[1]=0; localMom[2]=0;
- gMC->Gmtod(mom,localMom,2);
+ TVirtualMC::GetMC()->Gmtod(mom,localMom,2);
Double_t localTc = localMom[0]*localMom[0]+localMom[2]*localMom[2];
Double_t localTheta = TMath::ATan2(TMath::Sqrt(localTc),localMom[1]);
Double_t cotheta = TMath::Abs(TMath::Cos(localTheta));
- if(gMC->GetRandom()->Rndm() < Fresnel(p4.E()*1e9,cotheta,1)){
+ if(TVirtualMC::GetMC()->GetRandom()->Rndm() < Fresnel(p4.E()*1e9,cotheta,1)){
AliDebug(1,"Photon lost");
return kTRUE;
}else
// Generate FeedBack photons for the current particle. To be invoked from StepManager().
// eloss=0 means photon so only pulse height distribution is to be analysed.
TLorentzVector x4;
- gMC->TrackPosition(x4);
- Int_t iNphotons=gMC->GetRandom()->Poisson(0.02*qtot); //# of feedback photons is proportional to the charge of hit
+ TVirtualMC::GetMC()->TrackPosition(x4);
+ Int_t iNphotons=TVirtualMC::GetMC()->GetRandom()->Poisson(0.02*qtot); //# of feedback photons is proportional to the charge of hit
AliDebug(1,Form("N photons=%i",iNphotons));
Int_t j;
Float_t cthf, phif, enfp = 0, sthf, e1[3], e2[3], e3[3], vmod, uswop,dir[3], phi,pol[3], mom[4];
//Generate photons
for(Int_t i=0;i<iNphotons;i++){//feedbacks loop
Double_t ranf[2];
- gMC->GetRandom()->RndmArray(2,ranf); //Sample direction
+ TVirtualMC::GetMC()->GetRandom()->RndmArray(2,ranf); //Sample direction
cthf=ranf[0]*2-1.0;
if(cthf<0) continue;
- sthf = TMath::Sqrt((1 - cthf) * (1 + cthf));
+ sthf = TMath::Sqrt((1. - cthf) * (1. + cthf));
phif = ranf[1] * 2 * TMath::Pi();
- if(Double_t randomNumber=gMC->GetRandom()->Rndm()<=0.57)
+ if(Double_t randomNumber=TVirtualMC::GetMC()->GetRandom()->Rndm()<=0.57)
enfp = 7.5e-9;
else if(randomNumber<=0.7)
enfp = 6.4e-9;
dir[0] = sthf * TMath::Sin(phif); dir[1] = cthf; dir[2] = sthf * TMath::Cos(phif);
- gMC->Gdtom(dir, mom, 2);
+ TVirtualMC::GetMC()->Gdtom(dir, mom, 2);
mom[0]*=enfp; mom[1]*=enfp; mom[2]*=enfp;
mom[3] = TMath::Sqrt(mom[0]*mom[0]+mom[1]*mom[1]+mom[2]*mom[2]);
vmod=0; for(j=0;j<3;j++) vmod+=e1[j]*e1[j]; vmod=TMath::Sqrt(1/vmod); for(j=0;j<3;j++) e1[j]*=vmod;
vmod=0; for(j=0;j<3;j++) vmod+=e2[j]*e2[j]; vmod=TMath::Sqrt(1/vmod); for(j=0;j<3;j++) e2[j]*=vmod;
- phi = gMC->GetRandom()->Rndm()* 2 * TMath::Pi();
+ phi = TVirtualMC::GetMC()->GetRandom()->Rndm()* 2 * TMath::Pi();
for(j=0;j<3;j++) pol[j]=e1[j]*TMath::Sin(phi)+e2[j]*TMath::Cos(phi);
- gMC->Gdtom(pol, pol, 2);
+ TVirtualMC::GetMC()->Gdtom(pol, pol, 2);
Int_t outputNtracksStored;
gAlice->GetMCApp()->PushTrack(1, //transport
gAlice->GetMCApp()->GetCurrentTrackNumber(),//parent track
//FORMULAE FROM HANDBOOK OF OPTICS, 33.23 OR
//W.R. HUNTER, J.O.S.A. 54 (1964),15 , J.O.S.A. 55(1965),1197
- Float_t sinin=TMath::Sqrt(1-pdoti*pdoti);
+ Float_t sinin=TMath::Sqrt((1.-pdoti)*(1.+pdoti));
Float_t tanin=sinin/pdoti;
Float_t c1=cn*cn-ck*ck-sinin*sinin;
// This methode is invoked from StepManager() in order to print out
static Int_t iStepN;
const char *sParticle;
- switch(gMC->TrackPid()){
+ switch(TVirtualMC::GetMC()->TrackPid()){
case kProton: sParticle="PROTON" ;break;
case kNeutron: sParticle="neutron" ;break;
case kGamma: sParticle="gamma" ;break;
}
TString flag="fanny combination";
- if(gMC->IsTrackAlive())
- if(gMC->IsTrackEntering()) flag="enters to";
- else if(gMC->IsTrackExiting()) flag="exits from";
- else if(gMC->IsTrackInside()) flag="inside";
- else
- if(gMC->IsTrackStop()) flag="stoped in";
+ if(TVirtualMC::GetMC()->IsTrackAlive()) {
+ if(TVirtualMC::GetMC()->IsTrackEntering()) flag="enters to";
+ else if(TVirtualMC::GetMC()->IsTrackExiting()) flag="exits from";
+ else if(TVirtualMC::GetMC()->IsTrackInside()) flag="inside";
+ } else {
+ if(TVirtualMC::GetMC()->IsTrackStop()) flag="stopped in";
+ }
Int_t vid=0,copy=0;
- TString path=gMC->CurrentVolName(); path.Prepend("-");path.Prepend(gMC->CurrentVolOffName(1));//current volume and his mother are always there
- vid=gMC->CurrentVolOffID(2,copy); if(vid) {path.Prepend("-");path.Prepend(gMC->VolName(vid));}
- vid=gMC->CurrentVolOffID(3,copy); if(vid) {path.Prepend("-");path.Prepend(gMC->VolName(vid));}
+ TString path=TVirtualMC::GetMC()->CurrentVolName(); path.Prepend("-");path.Prepend(TVirtualMC::GetMC()->CurrentVolOffName(1));//current volume and his mother are always there
+ vid=TVirtualMC::GetMC()->CurrentVolOffID(2,copy); if(vid) {path.Prepend("-");path.Prepend(TVirtualMC::GetMC()->VolName(vid));}
+ vid=TVirtualMC::GetMC()->CurrentVolOffID(3,copy); if(vid) {path.Prepend("-");path.Prepend(TVirtualMC::GetMC()->VolName(vid));}
- Printf("Step %i: %s (%i) %s %s m=%.6f GeV q=%.1f dEdX=%.4f Etot=%.4f",iStepN,sParticle,gMC->TrackPid(),flag.Data(),path.Data(),gMC->TrackMass(),gMC->TrackCharge(),gMC->Edep()*1e9,gMC->Etot());
+ Printf("Step %i: %s (%i) %s %s m=%.6f GeV q=%.1f dEdX=%.4f Etot=%.4f",iStepN,sParticle,TVirtualMC::GetMC()->TrackPid(),flag.Data(),path.Data(),TVirtualMC::GetMC()->TrackMass(),TVirtualMC::GetMC()->TrackCharge(),TVirtualMC::GetMC()->Edep()*1e9,TVirtualMC::GetMC()->Etot());
- Double_t gMcTrackPos[3]; gMC->TrackPosition(gMcTrackPos[0],gMcTrackPos[1],gMcTrackPos[2]);
- Double_t gMcTrackPosLoc[3]; gMC->Gmtod(gMcTrackPos,gMcTrackPosLoc,1);
- Printf("gMC Track Position (MARS) x: %5.3lf, y: %5.3lf, z: %5.3lf (r: %5.3lf) ---> (LOC) x: %5.3f, y: %5.3f, z: %5.3f",gMcTrackPos[0],gMcTrackPos[1],gMcTrackPos[2],TMath::Sqrt(gMcTrackPos[0]*gMcTrackPos[0]+gMcTrackPos[1]*gMcTrackPos[1]+gMcTrackPos[2]*gMcTrackPos[2]),gMcTrackPosLoc[0],gMcTrackPosLoc[1],gMcTrackPosLoc[2]);
+ Double_t gMcTrackPos[3]; TVirtualMC::GetMC()->TrackPosition(gMcTrackPos[0],gMcTrackPos[1],gMcTrackPos[2]);
+ Double_t gMcTrackPosLoc[3]; TVirtualMC::GetMC()->Gmtod(gMcTrackPos,gMcTrackPosLoc,1);
+ Printf("TVirtualMC::GetMC() Track Position (MARS) x: %5.3lf, y: %5.3lf, z: %5.3lf (r: %5.3lf) ---> (LOC) x: %5.3f, y: %5.3f, z: %5.3f",gMcTrackPos[0],gMcTrackPos[1],gMcTrackPos[2],TMath::Sqrt(gMcTrackPos[0]*gMcTrackPos[0]+gMcTrackPos[1]*gMcTrackPos[1]+gMcTrackPos[2]*gMcTrackPos[2]),gMcTrackPosLoc[0],gMcTrackPosLoc[1],gMcTrackPosLoc[2]);
Printf("Step %i: tid=%i flags alive=%i disap=%i enter=%i exit=%i inside=%i out=%i stop=%i new=%i",
iStepN, gAlice->GetMCApp()->GetCurrentTrackNumber(),
- gMC->IsTrackAlive(), gMC->IsTrackDisappeared(),gMC->IsTrackEntering(), gMC->IsTrackExiting(),
- gMC->IsTrackInside(),gMC->IsTrackOut(), gMC->IsTrackStop(), gMC->IsNewTrack());
+ TVirtualMC::GetMC()->IsTrackAlive(), TVirtualMC::GetMC()->IsTrackDisappeared(),TVirtualMC::GetMC()->IsTrackEntering(), TVirtualMC::GetMC()->IsTrackExiting(),
+ TVirtualMC::GetMC()->IsTrackInside(),TVirtualMC::GetMC()->IsTrackOut(), TVirtualMC::GetMC()->IsTrackStop(), TVirtualMC::GetMC()->IsNewTrack());
Float_t a,z,den,rad,abs; a=z=den=rad=abs=-1;
- Int_t mid=gMC->CurrentMaterial(a,z,den,rad,abs);
+ Int_t mid=TVirtualMC::GetMC()->CurrentMaterial(a,z,den,rad,abs);
Printf("Step %i: mid=%i a=%7.2f z=%7.2f den=%9.4f rad=%9.2f abs=%9.2f\n\n",iStepN,mid,a,z,den,rad,abs);
- TArrayI proc; gMC->StepProcesses(proc);
+ TArrayI proc; TVirtualMC::GetMC()->StepProcesses(proc);
Printf("Processes in this step:");
for ( int i = 0 ; i < proc.GetSize(); i++)
{
// StepHistory(); return; //uncomment to print tracks history
// StepCount(); return; //uncomment to count photons
- TString volname = gMC->CurrentVolName();
+ TString volname = TVirtualMC::GetMC()->CurrentVolName();
//Treat photons
- if((gMC->TrackPid()==50000050||gMC->TrackPid()==50000051)&&volname.Contains("Hpad")){ //photon (Ckov or feedback) hits on module PC (Hpad)
- if(gMC->Edep()>0){ //photon survided QE test i.e. produces electron
- if(IsLostByFresnel()){ gMC->StopTrack(); return;} //photon lost due to fersnel reflection on PC
- Int_t tid= gMC->GetStack()->GetCurrentTrackNumber(); //take TID
- Int_t pid= gMC->TrackPid(); //take PID
- Float_t etot= gMC->Etot(); //total hpoton energy, [GeV]
- Double_t x[3]; gMC->TrackPosition(x[0],x[1],x[2]); //take MARS position at entrance to PC
- TString tmpname = volname; tmpname.Remove(0,4); Int_t idch = tmpname.Atoi(); //retrieve the chamber number
- Float_t xl,yl; AliHMPIDParam::Instance()->Mars2Lors(idch,x,xl,yl); //take LORS position
- new((*fHits)[fNhits++])AliHMPIDHit(idch,etot,pid,tid,xl,yl,x); //HIT for photon, position at P, etot will be set to Q
+ if((TVirtualMC::GetMC()->TrackPid()==50000050||TVirtualMC::GetMC()->TrackPid()==50000051)&&volname.Contains("Hpad")){ //photon (Ckov or feedback) hits on module PC (Hpad)
+ if(TVirtualMC::GetMC()->Edep()>0){ //photon survided QE test i.e. produces electron
+ if(IsLostByFresnel()){ TVirtualMC::GetMC()->StopTrack(); return;} //photon lost due to fersnel reflection on PC
+ Int_t tid= TVirtualMC::GetMC()->GetStack()->GetCurrentTrackNumber(); //take TID
+ Int_t pid= TVirtualMC::GetMC()->TrackPid(); //take PID
+ Float_t etot= TVirtualMC::GetMC()->Etot(); //total hpoton energy, [GeV]
+ Double_t x[3]; TVirtualMC::GetMC()->TrackPosition(x[0],x[1],x[2]); //take MARS position at entrance to PC
+ Float_t hitTime= (Float_t)TVirtualMC::GetMC()->TrackTime(); //hit formation time
+ TString tmpname = volname; tmpname.Remove(0,4); Int_t idch = tmpname.Atoi(); //retrieve the chamber number
+ Float_t xl,yl; AliHMPIDParam::Instance()->Mars2Lors(idch,x,xl,yl); //take LORS position
+ new((*fHits)[fNhits++])AliHMPIDHit(idch,etot,pid,tid,xl,yl,hitTime,x); //HIT for photon, position at P, etot will be set to Q
if(fDoFeed) GenFee(etot); //generate feedback photons etot is modified in hit ctor to Q of hit
}//photon hit PC and DE >0
}//photon hit PC
static Float_t eloss; //need to store mip parameters between different steps
static Double_t in[3];
- if(gMC->IsTrackEntering() && gMC->TrackCharge() && volname.Contains("Hpad")) //Trackref stored when entering in the pad volume
- AddTrackReference(gMC->GetStack()->GetCurrentTrackNumber(), AliTrackReference::kHMPID); //for acceptance calculations
+ if(TVirtualMC::GetMC()->IsTrackEntering() && TVirtualMC::GetMC()->TrackCharge() && volname.Contains("Hpad")) //Trackref stored when entering in the pad volume
+ AddTrackReference(TVirtualMC::GetMC()->GetStack()->GetCurrentTrackNumber(), AliTrackReference::kHMPID); //for acceptance calculations
- if(gMC->TrackCharge() && volname.Contains("Hcel")){ //charged particle in amplification gap (Hcel)
- if(gMC->IsTrackEntering()||gMC->IsNewTrack()) { //entering or newly created
+ if(TVirtualMC::GetMC()->TrackCharge() && volname.Contains("Hcel")){ //charged particle in amplification gap (Hcel)
+ if(TVirtualMC::GetMC()->IsTrackEntering()||TVirtualMC::GetMC()->IsNewTrack()) { //entering or newly created
eloss=0; //reset Eloss collector
- gMC->TrackPosition(in[0],in[1],in[2]); //take position at the entrance
- }else if(gMC->IsTrackExiting()||gMC->IsTrackStop()||gMC->IsTrackDisappeared()){ //exiting or disappeared
- eloss +=gMC->Edep(); //take into account last step Eloss
- Int_t tid= gMC->GetStack()->GetCurrentTrackNumber(); //take TID
- Int_t pid= gMC->TrackPid(); //take PID
- Double_t out[3]; gMC->TrackPosition(out[0],out[1],out[2]); //take MARS position at exit
+ TVirtualMC::GetMC()->TrackPosition(in[0],in[1],in[2]); //take position at the entrance
+ }else if(TVirtualMC::GetMC()->IsTrackExiting()||TVirtualMC::GetMC()->IsTrackStop()||TVirtualMC::GetMC()->IsTrackDisappeared()){ //exiting or disappeared
+ eloss +=TVirtualMC::GetMC()->Edep(); //take into account last step Eloss
+ Int_t tid= TVirtualMC::GetMC()->GetStack()->GetCurrentTrackNumber(); //take TID
+ Int_t pid= TVirtualMC::GetMC()->TrackPid(); //take PID
+ Double_t out[3]; TVirtualMC::GetMC()->TrackPosition(out[0],out[1],out[2]); //take MARS position at exit
+ Float_t hitTime= (Float_t)TVirtualMC::GetMC()->TrackTime(); //hit formation time
out[0]=0.5*(out[0]+in[0]); //
out[1]=0.5*(out[1]+in[1]); //take hit position at the anod plane
out[2]=0.5*(out[2]+in[2]);
TString tmpname = volname; tmpname.Remove(0,4); Int_t idch = tmpname.Atoi(); //retrieve the chamber number
Float_t xl,yl;AliHMPIDParam::Instance()->Mars2Lors(idch,out,xl,yl); //take LORS position
if(eloss>0) {
- new((*fHits)[fNhits++])AliHMPIDHit(idch,eloss,pid,tid,xl,yl,out); //HIT for MIP, position near anod plane, eloss will be set to Q
+ new((*fHits)[fNhits++])AliHMPIDHit(idch,eloss,pid,tid,xl,yl,hitTime,out); //HIT for MIP, position near anod plane, eloss will be set to Q
if(fDoFeed) GenFee(eloss); //generate feedback photons
}
}else //just going inside
- eloss += gMC->Edep(); //collect this step eloss
+ eloss += TVirtualMC::GetMC()->Edep(); //collect this step eloss
}//MIP in GAP
}//StepManager()
Double_t params[10]={0.5,10.,24.,-1,5.2,1.5,3.5,8.5,3.8,0.};
TGeoMedium *med =gGeoManager->GetMedium("HMPID_Al");
- TGeoMedium *air =gGeoManager->GetMedium("HMPID_Air");
TGeoVolume *cradle=new TGeoVolumeAssembly("Hcradle");
- Double_t baselong[7]={6037*mm-2*60*mm, 6037*mm-2*60*mm,60*mm,0.,100*mm,10*mm,10*mm};//2CRE2112P3
+ //Double_t baselong[7]={6037*mm-2*60*mm, 6037*mm-2*60*mm,60*mm,0.,100*mm,10*mm,10*mm};//2CRE2112P3
+ Double_t baselong[7]={6037*mm-2*100*mm, 6037*mm-2*100*mm,60*mm,0.,100*mm,10*mm,10*mm};//2CRE2112P3
TGeoVolume *lbase = CradleBaseVolume(med,baselong,"cradleLbase");
lbase->SetLineColor(kGray);
Double_t height = 30.*mm; //30 = 2*(1488/2-729) (2CRE2112P3)
Double_t tubeheight = 50.*mm; Double_t heightred = 5.*mm; Double_t zred = 5.*mm;
Double_t oneshift = tubeheight/TMath::Tan(TMath::DegToRad()*20.)+(1458.-35)*mm/2 - (1607-35)*mm/2;
- Double_t linclined[7] = {1458.*mm-params[6],1607.*mm-params[6],tubeheight,oneshift, height ,heightred,zred}; //3.5 is for not correct measurements in 2CRE2112P3<=> 597!=inclined*sin(20)
+ Double_t linclined[7] = {1458.*mm-params[6]-0.5,1607.*mm-params[6]-0.5,tubeheight,oneshift, height ,heightred,zred}; //3.5 is for not correct measurements in 2CRE2112P3<=> 597!=inclined*sin(20)
TGeoVolume *inclin = CradleBaseVolume(med,linclined,"inclinedbar");
inclin->SetLineColor(kGray);
Double_t lhorizontal[7] = {1641.36*mm+params[7],1659.*mm+params[7],tubeheight,0, height ,heightred,zred};
horiz->SetLineColor(kGray);
//inner bars, they are named as the numbering in 2CRE2112P3
- Double_t fourshift = tubeheight/TMath::Tan(TMath::DegToRad()*55.);
- Double_t lfour[7] = {594*mm,594*mm,tubeheight,fourshift,height,heightred,zred};
+ Double_t fourshift = tubeheight/TMath::Tan(TMath::DegToRad()*55.);
+ Double_t lfour[7] = {592*mm,592*mm,tubeheight,fourshift,height,heightred,zred};
TGeoVolume *four = CradleBaseVolume(med,lfour,"bar4");
four->SetLineColor(kGray);
Double_t fiveshift = tubeheight/TMath::Tan(TMath::DegToRad()*75);
- Double_t lfive[7] = {503.7*mm,503.7*mm,tubeheight,fiveshift,height,heightred,zred};
+ Double_t lfive[7] = {500.*mm,500.*mm,tubeheight,fiveshift,height,heightred,zred};
TGeoVolume *five = CradleBaseVolume(med,lfive,"bar5");
five->SetLineColor(kGray);
- Double_t sixshift = tubeheight/TMath::Tan(TMath::DegToRad()*55)+459*mm/2-480*mm/2;
- Double_t lsix[7] = {459*mm,480*mm,tubeheight,sixshift,height,heightred,zred};
+ Double_t sixshift = tubeheight/TMath::Tan(TMath::DegToRad()*55)+459*mm/2-480*mm/2;
+ Double_t lsix[7] = {456*mm,477*mm,tubeheight,sixshift,height,heightred,zred};
TGeoVolume *six = CradleBaseVolume(med,lsix,"bar6");
six->SetLineColor(kGray);
eight->SetLineColor(kGray);
Double_t nineshift = -tubeheight/TMath::Tan(TMath::DegToRad()*71)+83.*mm/2-66.*mm/2;
- Double_t lnine[7] = {66.*mm,83.*mm,tubeheight,nineshift,height,heightred,zred};
+ Double_t lnine[7] = {59.5*mm,76.5*mm,tubeheight,nineshift,height,heightred,zred};
TGeoVolume *nine = CradleBaseVolume(med,lnine,"bar9");
nine->SetLineColor(kGray);
ten->SetLineColor(kGray);
Double_t elevenshift = (-tubeheight/TMath::Tan(TMath::DegToRad()*70) -338.*mm/2+315.*mm/2);
- Double_t leleven[7] = {315.*mm,338.*mm,tubeheight,elevenshift,height,heightred,zred};
+ Double_t leleven[7] = {308.*mm,331.*mm,tubeheight,elevenshift,height,heightred,zred};
TGeoVolume *eleven = CradleBaseVolume(med,leleven,"bar11");
eleven->SetLineColor(kGray);
Double_t twelveshift = (-tubeheight/TMath::Tan(TMath::DegToRad()*60) -538.*mm/2+508.*mm/2);
- Double_t ltwelve[7] = {508.*mm,538.*mm,tubeheight,twelveshift,height,heightred,zred};
+ Double_t ltwelve[7] = {507.*mm,537.*mm,tubeheight,twelveshift,height,heightred,zred};
TGeoVolume *twelve = CradleBaseVolume(med,ltwelve,"bar12");
twelve->SetLineColor(kGray);
- Double_t thirteenshift = tubeheight/TMath::Tan(TMath::DegToRad()*43);
- Double_t lthirteen[7] = {712.5*mm,712.5*mm,tubeheight,thirteenshift,height,heightred,zred};
+ Double_t thirteenshift = tubeheight/TMath::Tan(TMath::DegToRad()*43);
+ Double_t lthirteen[7] = {708.*mm,708.*mm,tubeheight,thirteenshift,height,heightred,zred};
TGeoVolume *thirteen = CradleBaseVolume(med,lthirteen,"bar13");
thirteen->SetLineColor(kGray);
//vertical rectangles
- TGeoVolume *vbox=gGeoManager->MakeBox ("Hvbox",air , 1488*mm/2 , 487.*mm/2 , 50.*mm/2);
+ TGeoVolume *vbox= new TGeoVolumeAssembly("Hvbox");
vbox->SetLineColor(kViolet);
Double_t width = 50.*mm;
+
+ TGeoVolume *vboxlast= new TGeoVolumeAssembly("Hvboxlast");//vertical structure on the short base
+ vboxlast->SetLineColor(kViolet);
Double_t barheight = 100.*mm;
Double_t lAfourteen[7] = {1488.*mm,1488.*mm,barheight,0,width,heightred,zred};
TGeoVolume *afourteen = CradleBaseVolume(med,lAfourteen,"bar14top");
afourteen->SetLineColor(kGray);
- Double_t lBfourteen[7] = {382.*mm,382.*mm,barheight,0,width,heightred,zred};
+ Double_t lBfourteen[7] = {387*mm,387.*mm,barheight,0,width,heightred,zred};
TGeoVolume *bfourteen = CradleBaseVolume(med,lBfourteen,"bar14vert");
bfourteen->SetLineColor(kGray);
TGeoVolume *cfourteen = CradleBaseVolume(med,lCfourteen,"bar14bot");
cfourteen->SetLineColor(kGray);
- Double_t oblshift = 50.*mm/ TMath::Tan(TMath::DegToRad()*35);
- Double_t lDfourteen[7] = {610.*mm,610.*mm,50.*mm,oblshift,width,heightred,zred};
+ Double_t oblshift = 50.*mm/ TMath::Tan(TMath::DegToRad()*35);
+ Double_t lDfourteen[7] = {603.*mm,603.*mm,50.*mm,oblshift,width,heightred,zred};
TGeoVolume *dfourteen = CradleBaseVolume(med,lDfourteen,"bar14incl");
dfourteen->SetLineColor(kGray);
+
+ Double_t lDfourteenlast[7] = {667.*mm,667.*mm,50.*mm,oblshift,width,heightred,zred};
+ TGeoVolume *dfourteenlast = CradleBaseVolume(med,lDfourteenlast,"bar14incllast");
+ dfourteenlast->SetLineColor(kGray);
+
vbox->AddNode(afourteen,1,new TGeoTranslation(0.,487.*mm/2 -100.*mm/2,0.));
TGeoRotation *vinrot = new TGeoRotation("vertbar"); vinrot->RotateZ(90);
vbox->AddNode(bfourteen,1,new TGeoCombiTrans(1488*mm/2-100.*mm/2,-100.*mm/2,0.,vinrot));
vbox->AddNode(bfourteen,2,new TGeoCombiTrans(-1488*mm/2+100.*mm/2,-100.*mm/2,0.,vinrot));
TGeoRotation *rotboxbar = new TGeoRotation("rotboxbar"); rotboxbar->RotateZ(-35);
TGeoRotation *arotboxbar = new TGeoRotation("arotboxbar"); arotboxbar->RotateZ(-35); arotboxbar->RotateY(180);
- vbox->AddNode(dfourteen,1,new TGeoCombiTrans(-1488*mm/4,-1,0.,rotboxbar));
- vbox->AddNode(dfourteen,2,new TGeoCombiTrans(+1488*mm/4,-1,0.,arotboxbar));
+ vbox->AddNode(dfourteen,1,new TGeoCombiTrans(-1488*mm/4,-1,0.4,rotboxbar));
+ vbox->AddNode(dfourteen,2,new TGeoCombiTrans(+1488*mm/4,-1,0.4,arotboxbar));
+ //vertical box on the short base of the cradle
+ vboxlast->AddNode(afourteen,1,new TGeoTranslation(0.,487.*mm/2 -100.*mm/2,0.));
+ vboxlast->AddNode(bfourteen,1,new TGeoCombiTrans(1488*mm/2-100.*mm/2,-100.*mm/2,0.,vinrot));
+ vboxlast->AddNode(bfourteen,2,new TGeoCombiTrans(-1488*mm/2+100.*mm/2,-100.*mm/2,0.,vinrot));
+ vboxlast->AddNode(dfourteenlast,1,new TGeoCombiTrans(-1488*mm/4+1.7,-3.,0.,rotboxbar));
+ vboxlast->AddNode(dfourteenlast,2,new TGeoCombiTrans(+1488*mm/4-1.7,-3.,0.,arotboxbar));
//POSITIONING IN THE VIRTUAL VOLUME "cradle"
//long base
TGeoRotation *rotl=new TGeoRotation("Clongbase"); rotl->RotateX(90);
- cradle->AddNode(lbase,1,new TGeoCombiTrans ( 0*mm, (1488-100)*mm/2, -(597-60)*mm/2,rotl));
- cradle->AddNode(lbase,2,new TGeoCombiTrans ( 0*mm, -(1488-100)*mm/2, -(597-60)*mm/2,rotl));
+ cradle->AddNode(lbase,0,new TGeoCombiTrans ( 0*mm, (1488-100)*mm/2, -(597-60)*mm/2,rotl));
+ cradle->AddNode(lbase,1,new TGeoCombiTrans ( 0*mm, -(1488-100)*mm/2, -(597-60)*mm/2,rotl));
//short base
TGeoRotation *rots=new TGeoRotation("Cshortbase"); rots->RotateX(90); rots->RotateZ(90);
cradle->AddNode(sbase,1,new TGeoCombiTrans ((6037-100)*mm/2, 0.,-(597-60)*mm/2,rots));
Double_t dx =(1607-35)*mm*TMath::Cos(TMath::DegToRad()*20)/2-tubeheight/2*TMath::Sin(TMath::DegToRad()*20)+params[5];
- cradle->AddNode(inclin,1,new TGeoCombiTrans(origintrapstructure + (2288+60)*mm -dx,729*mm,params[0],rot1));
+ cradle->AddNode(inclin,1,new TGeoCombiTrans(origintrapstructure + (2288+60)*mm -dx,729*mm,params[0]+0.4,rot1));//+0.7 added
cradle->AddNode(horiz,1,new TGeoCombiTrans( origintrapstructure,729*mm, 597*mm/2 - tubeheight/2,rot2));//correctly positioned
TGeoRotation *rot1mirror=new TGeoRotation("inclmirrot"); rot1mirror->RotateX(90); rot1mirror->RotateY(200); rot1mirror->RotateZ(180);
- cradle->AddNode(inclin,2,new TGeoCombiTrans(origintrapstructure - 2345*mm + dx,729*mm,params[0],rot1mirror));
- cradle->AddNode(inclin,3,new TGeoCombiTrans(origintrapstructure + (2288+60)*mm -dx,-729*mm,params[0],rot1));
+ cradle->AddNode(inclin,2,new TGeoCombiTrans(origintrapstructure - 2345*mm + dx,729*mm,params[0]+0.4,rot1mirror));//+0.7 added
+ cradle->AddNode(inclin,3,new TGeoCombiTrans(origintrapstructure + (2288+60)*mm -dx,-729*mm,params[0]+0.4,rot1));//0.7 added
cradle->AddNode(horiz,2,new TGeoCombiTrans( origintrapstructure,-729*mm, 597*mm/2 - tubeheight/2,rot2));//correctly positioned
- cradle->AddNode(inclin,4,new TGeoCombiTrans(origintrapstructure - 2345*mm + dx,-729*mm,params[0],rot1mirror));
+ cradle->AddNode(inclin,4,new TGeoCombiTrans(origintrapstructure - 2345*mm + dx,-729*mm,params[0]+0.4,rot1mirror));//0.7 added
//inner pieces on one side
TGeoRotation *rot4=new TGeoRotation("4rot"); rot4->RotateX(-90); rot4->RotateY(-55); rot4->RotateZ(180);
TGeoRotation *rot9a=new TGeoRotation("9arot"); rot9a->RotateX(-90); rot9a->RotateY(-90); rot9a->RotateZ(180);
cradle->AddNode(nine,1,new TGeoCombiTrans(origintrapstructure+1960*mm+2.5+3.,-729.*mm,-20.,rot9));
cradle->AddNode(nine,2,new TGeoCombiTrans(origintrapstructure-1960*mm-2.5-3.,-729.*mm,-20.,rot9a));
-
//inner pieces on the other side
TGeoRotation *rot10=new TGeoRotation("10rot"); rot10->RotateX(-90); rot10->RotateY(-120);
TGeoRotation *rot10a=new TGeoRotation("10arot"); rot10a->RotateX(-90); rot10a->RotateY(-120); rot10a->RotateZ(180);
- cradle->AddNode(ten,1,new TGeoCombiTrans(origintrapstructure+1738*mm+tubeheight/(2*TMath::Sin(TMath::DegToRad()*60))-2,+729.*mm,-13.,rot10));
- cradle->AddNode(ten,2,new TGeoCombiTrans(origintrapstructure-1738*mm-tubeheight/(2*TMath::Sin(TMath::DegToRad()*60))+2,+729.*mm,-13.,rot10a));
+ cradle->AddNode(ten,1,new TGeoCombiTrans(origintrapstructure+1738*mm+tubeheight/(2*TMath::Sin(TMath::DegToRad()*60))-2,+729.*mm,-13.,rot10));
+ cradle->AddNode(ten,2,new TGeoCombiTrans(origintrapstructure-1738*mm-tubeheight/(2*TMath::Sin(TMath::DegToRad()*60))+2,+729.*mm,-13.,rot10a));
TGeoRotation *rot11=new TGeoRotation("11rot"); rot11->RotateX(-90); rot11->RotateY(50);
TGeoRotation *rot11a=new TGeoRotation("11arot"); rot11a->RotateX(-90); rot11a->RotateY(50); rot11a->RotateZ(180);
- cradle->AddNode(eleven,1,new TGeoCombiTrans(origintrapstructure-1738*mm-tubeheight/(2*TMath::Sin(TMath::DegToRad()*60))+352.*mm,+729.*mm,-12.5,rot11));
- cradle->AddNode(eleven,2,new TGeoCombiTrans(origintrapstructure+1738*mm+tubeheight/(2*TMath::Sin(TMath::DegToRad()*60))-352.*mm,+729.*mm,-12.5,rot11a));
+ cradle->AddNode(eleven,1,new TGeoCombiTrans(origintrapstructure-1738*mm-tubeheight/(2*TMath::Sin(TMath::DegToRad()*60))+352.*mm,+729.*mm,-12.7,rot11));
+ cradle->AddNode(eleven,2,new TGeoCombiTrans(origintrapstructure+1738*mm+tubeheight/(2*TMath::Sin(TMath::DegToRad()*60))-352.*mm,+729.*mm,-12.7,rot11a));
TGeoRotation *rot12=new TGeoRotation("12rot"); rot12->RotateX(-90); rot12->RotateY(-120);
TGeoRotation *rot12a=new TGeoRotation("12arot"); rot12a->RotateX(-90); rot12a->RotateY(-120); rot12a->RotateZ(180);
//vertical structures
TGeoRotation *vrot = new TGeoRotation("vertbox"); vrot->RotateX(90); vrot->RotateZ(90);
- cradle->AddNode(vbox,1,new TGeoCombiTrans(-6037*mm/2+50.*mm/2,0.,0.5,vrot));
- cradle->AddNode(cfourteen,1,new TGeoCombiTrans(-6037*mm/2+50.*mm/2,0.,-477.*mm/2 -20.*mm/2,vrot));
+ cradle->AddNode(vboxlast,1,new TGeoCombiTrans(-6037*mm/2+50.*mm/2,0.,0.5,vrot));//vertial box on the short cradle base
cradle->AddNode(vbox,2,new TGeoCombiTrans(-6037*mm/2+50.*mm/2+990.*mm,0.,0.5,vrot));
cradle->AddNode(cfourteen,2,new TGeoCombiTrans(-6037*mm/2+50.*mm/2+990.*mm,0.,-477.*mm/2 -20.*mm/2,vrot));
}//CreateCradle()
-TGeoVolume * AliHMPIDv3::CradleBaseVolume(TGeoMedium *med, Double_t l[7],char *name)
+TGeoVolume * AliHMPIDv3::CradleBaseVolume(TGeoMedium *med, Double_t l[7],const char *name)
{
/*
The trapezoid is build in the xy plane
xv[1] = l[0]/2 + l[3]; yv[1] = l[2]/2;
xv[2] = l[1]/2; yv[2] = -l[2]/2;
xv[3] = -l[1]/2; yv[3] = -l[2]/2;
- Double_t ang1 = 90, ang2 = 90;
- if(xv[0]-xv[3]!=0) ang1 = TMath::RadToDeg()*TMath::ATan((yv[0]-yv[3])/(xv[0]-xv[3]));
- if(xv[1]-xv[2]!=0) ang2 = TMath::RadToDeg()*TMath::ATan((yv[1]-yv[2])/(xv[1]-xv[2]));
- AliDebug(1,Form("name %s x0 - x2 = %f angoli alla base maggiore: %f %f",xtruIn->GetName(),xv[0] - xv[2],ang1,ang2));
xtruOut->DefinePolygon(4, xv, yv);
- xtruOut->DefineSection(0, -l[4]/2., 0., 0., 1.0);//0= I piano z; (0.,0.) = spostamento rispetto al centro; 1.=fattore di scala della forma
- xtruOut->DefineSection(1, +l[4]/2., 0., 0., 1.0);//1= II piano z;
+ xtruOut->DefineSection(0, -l[4]/2., 0., 0., 1.0);//0= I plane z; (0.,0.) = shift wrt centre; 1.= shape scale factor
+ xtruOut->DefineSection(1, +l[4]/2., 0., 0., 1.0);//1= II plane z;
Double_t tgalpha = 0;
if(xv[3]-xv[0] == 0 ) tgalpha = 999999;