/*
$Log$
+Revision 1.22 2007/10/07 19:40:46 decaro
+right handling of l2t matrices and alignable entries in case of TOF staging geometry
+
+Revision 1.21 2007/10/04 13:15:30 arcelli
+updates to comply with AliTOFGeometryV5 becoming AliTOFGeometry
+
+Revision 1.20 2007/10/03 18:07:22 arcelli
+right handling of l2t matrices and alignable entries in case of TOF holes (Annalisa)
+
+Revision 1.19 2007/10/03 10:41:12 arcelli
+adding tracking-to-local matrices for new AliTOFcluster
+
+Revision 1.18 2007/07/27 08:14:48 morsch
+Write all track references into the same branch.
+
+Revision 1.17 2007/05/14 14:41:13 decaro
+Fix a bug in FTOA volume positionig inside BTOF13,14,15,16,17 in case of holes in 11th and 12th sectors
+
Revision 1.16 2007/05/04 12:59:26 arcelli
Change the TOF SM paths for misalignment (one layer up)
// //
///////////////////////////////////////////////////////////////////////////////
-#include "TBRIK.h"
-#include "TGeometry.h"
-#include "TLorentzVector.h"
-#include "TNode.h"
-#include "TVirtualMC.h"
-#include "TGeoManager.h"
+#include <TDirectory.h>
+#include <TGeoGlobalMagField.h>
+#include <TGeoManager.h>
+#include <TGeoMatrix.h>
+#include <TGeoPhysicalNode.h>
+#include <TGeoVolume.h>
+#include <TLorentzVector.h>
+#include <TVirtualMC.h>
#include "AliConst.h"
+#include "AliGeomManager.h"
#include "AliLog.h"
#include "AliMagF.h"
#include "AliMC.h"
#include "AliRun.h"
+#include "AliTrackReference.h"
#include "AliTOFGeometry.h"
-#include "AliTOFGeometryV5.h"
#include "AliTOFv5T0.h"
extern TDirectory *gDirectory;
fIdFTOC(-1),
fIdFLTA(-1),
fIdFLTB(-1),
- fIdFLTC(-1),
- fTOFHoles(kFALSE)
+ fIdFLTC(-1)//,
+ //fTOFHoles(kFALSE)
{
//
// Default constructor
fIdFTOC(-1),
fIdFLTA(-1),
fIdFLTB(-1),
- fIdFLTC(-1),
- fTOFHoles(kFALSE)
+ fIdFLTC(-1)//,
+ //fTOFHoles(kFALSE)
{
//
// Standard constructor
// Check that FRAME is there otherwise we have no place where to
// put TOF
-
+ /*
AliModule* frame = (AliModule*)gAlice->GetModule("FRAME");
if(!frame) {
AliFatal("TOF needs FRAME to be present");
} else{
if (fTOFGeometry) delete fTOFGeometry;
- fTOFGeometry = new AliTOFGeometryV5();
+ fTOFGeometry = new AliTOFGeometry();
if(frame->IsVersion()==1) {
AliDebug(1,Form("Frame version %d", frame->IsVersion()));
fTOFHoles=true;}
}
fTOFGeometry->SetHoles(fTOFHoles);
+ */
+
+ if (fTOFGeometry) delete fTOFGeometry;
+ fTOFGeometry = new AliTOFGeometry();
+ fTOFGeometry->SetHoles(fTOFHoles);
//AliTOF::fTOFGeometry = fTOFGeometry;
// Save the geometry
TDirectory* saveDir = gDirectory;
- gAlice->GetRunLoader()->CdGAFile();
+ AliRunLoader::Instance()->CdGAFile();
fTOFGeometry->Write("TOFgeometry");
saveDir->cd();
// eventual changes in the geometry.
//
+ AliGeomManager::ELayerID idTOF = AliGeomManager::kTOF;
+ Int_t modUID, modnum=0;
+
TString volPath;
TString symName;
for (Int_t isect = 0; isect < nSectors; isect++) {
for (Int_t istr = 1; istr <= nStrips; istr++) {
-
+
+ modUID = AliGeomManager::LayerToVolUID(idTOF,modnum++);
+ if (fTOFSectors[isect]==-1) continue;
+
+ if (fTOFHoles && (isect==13 || isect==14 || isect==15)) {
+ if (istr<39) {
+ vpL3 = "/FTOB_0";
+ vpL4 = "/FLTB_0/FSTR_";
+ }
+ else if (istr>53) {
+ vpL3 = "/FTOC_0";
+ vpL4 = "/FLTC_0/FSTR_";
+ }
+ else continue;
+ }
+ else {
+ vpL3 = "/FTOA_0";
+ vpL4 = "/FLTA_0/FSTR_";
+ }
+
volPath = vpL0;
volPath += isect;
volPath += vpL1;
AliDebug(2,Form("symName=%s\n",symName.Data()));
AliDebug(2,"--------------------------------------------");
- gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data());
+ if(!gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data(),modUID))
+ AliError(Form("Alignable entry %s not set",symName.Data()));
+
+ //T2L matrices for alignment
+ TGeoPNEntry *e = gGeoManager->GetAlignableEntryByUID(modUID);
+ if (e) {
+ TGeoHMatrix *globMatrix = e->GetGlobalOrig();
+ Double_t phi = 20.0 * (isect % 18) + 10.0;
+ TGeoHMatrix *t2l = new TGeoHMatrix();
+ t2l->RotateZ(phi);
+ t2l->MultiplyLeft(&(globMatrix->Inverse()));
+ e->SetMatrix(t2l);
+ }
+ else {
+ AliError(Form("Alignable entry %s is not valid!",symName.Data()));
+ }
imod++;
}
}
symName = snSM;
symName += Form("%02d",isect);
- AliDebug(2,"--------------------------------------------");
- AliDebug(2,Form("Alignable object %d", isect+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());
-
- }
-
-}
-//____________________________________________________________________________
-void AliTOFv5T0::BuildGeometry()
-{
- //
- // Build TOF ROOT geometry for the ALICE event display
- //
- TNode *node, *top;
- const int kColorTOF = 27;
-
- TGeometry *globalGeometry = (TGeometry*)gAlice->GetGeometry();
-
- // Find top TNODE
- top = globalGeometry->GetNode("alice");
-
- // Position the different copies
- const Float_t krTof =(fTOFGeometry->Rmax()+fTOFGeometry->Rmin())/2.;
- const Float_t khTof = fTOFGeometry->Rmax()-fTOFGeometry->Rmin();
- const Int_t kNTof = fTOFGeometry->NSectors();
- const Float_t kangle = k2PI/kNTof;
-
- const Float_t kInterCentrModBorder1 = 49.5;
- const Float_t kInterCentrModBorder2 = 57.5;
+ AliDebug(2,"--------------------------------------------");
+ AliDebug(2,Form("Alignable object %d", isect+imod));
+ AliDebug(2,Form("volPath=%s\n",volPath.Data()));
+ AliDebug(2,Form("symName=%s\n",symName.Data()));
+ AliDebug(2,"--------------------------------------------");
- Float_t ang;
-
- // define offset for nodes
- Float_t zOffsetB = (fTOFGeometry->ZlenA()*0.5 + (kInterCentrModBorder1+kInterCentrModBorder2)*0.5)*0.5;
- Float_t zOffsetA = 0.;
- // Define TOF basic volume
-
- char nodeName0[16], nodeName1[16], nodeName2[16];
- char nodeName3[16], nodeName4[16], rotMatNum[16];
+ gGeoManager->SetAlignableEntry(symName.Data(),volPath.Data());
- if (fTOFHoles) {
- new TBRIK("S_TOF_B","TOF box","void",
- fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
- new TBRIK("S_TOF_C","TOF box","void",
- fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenB()*0.5);
}
- new TBRIK("S_TOF_A","TOF box","void",
- fTOFGeometry->StripLength()*0.5, khTof*0.5, fTOFGeometry->ZlenA()*0.5);
- for (Int_t nodeNum=1;nodeNum<19;nodeNum++){
-
- if (nodeNum<10) {
- sprintf(rotMatNum,"rot50%i",nodeNum);
- sprintf(nodeName0,"FTO00%i",nodeNum);
- sprintf(nodeName1,"FTO10%i",nodeNum);
- sprintf(nodeName2,"FTO20%i",nodeNum);
- sprintf(nodeName3,"FTO30%i",nodeNum);
- sprintf(nodeName4,"FTO40%i",nodeNum);
- }
- if (nodeNum>9) {
- sprintf(rotMatNum,"rot5%i",nodeNum);
- sprintf(nodeName0,"FTO0%i",nodeNum);
- sprintf(nodeName1,"FTO1%i",nodeNum);
- sprintf(nodeName2,"FTO2%i",nodeNum);
- sprintf(nodeName3,"FTO3%i",nodeNum);
- sprintf(nodeName4,"FTO4%i",nodeNum);
- }
-
- new TRotMatrix(rotMatNum,rotMatNum,90,-20*nodeNum,90,90-20*nodeNum,0,0);
- ang = (4.5-nodeNum) * kangle;
-
- if (fTOFHoles) {
- top->cd();
- node = new TNode(nodeName2,nodeName2,"S_TOF_B", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetB,rotMatNum);
- node->SetLineColor(kColorTOF);
- fNodes->Add(node);
-
- top->cd();
- node = new TNode(nodeName3,nodeName3,"S_TOF_C", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang),-zOffsetB,rotMatNum);
- node->SetLineColor(kColorTOF);
- fNodes->Add(node);
- }
-
- top->cd();
- node = new TNode(nodeName4,nodeName4,"S_TOF_A", krTof*TMath::Cos(ang), krTof*TMath::Sin(ang), zOffsetA,rotMatNum);
- node->SetLineColor(kColorTOF);
- fNodes->Add(node);
- } // end loop on nodeNum
-
}
//_____________________________________________________________________________
if(fTOFSectors[isec]==-1)continue;
char name[16];
sprintf(name, "BTOF%d",isec);
- if (fTOFHoles && (isec==11||isec==12)) {
+ if (fTOFHoles && (isec==13 || isec==14 || isec==15)) {
// if (fTOFHoles && (isec==16||isec==17)) { \\Old 6h convention
xcoor = 0.;
ycoor = (zlenA*0.5 + kInterCentrModBorder1)*0.5;
//AliTOF::CreateMaterials();
- AliMagF *magneticField = (AliMagF*)gAlice->Field();
+ AliMagF *magneticField = (AliMagF*)((AliMagF*)TGeoGlobalMagField::Instance()->GetField());
Int_t isxfld = magneticField->Integ();
Float_t sxmgmx = magneticField->Max();
AliMC *mcApplication = (AliMC*)gAlice->GetMCApp();
- AddTrackReference(mcApplication->GetCurrentTrackNumber());
+ AddTrackReference(mcApplication->GetCurrentTrackNumber(), AliTrackReference::kTOF);
//AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber());
// getting information about hit volumes