X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ITS%2FAliITSv11GeomCableFlat.cxx;h=74854cac7e26121f57ccf5f979dbb688a76f210d;hb=f10094af4cc0bf7d3bcbe3005faf6d55dd105367;hp=75608d746c5eb4498c899d45c87fa609ee852522;hpb=108bd0fecdfc9619510aaf5d0a4fd46a4e8c7ce4;p=u%2Fmrichter%2FAliRoot.git diff --git a/ITS/AliITSv11GeomCableFlat.cxx b/ITS/AliITSv11GeomCableFlat.cxx index 75608d746c5..74854cac7e2 100644 --- a/ITS/AliITSv11GeomCableFlat.cxx +++ b/ITS/AliITSv11GeomCableFlat.cxx @@ -13,6 +13,7 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ +// $Id$ //************************************************************************* // Class for flat cables @@ -54,6 +55,7 @@ AliITSv11GeomCableFlat::AliITSv11GeomCableFlat(): fLayColor[i] = 0; fLayMedia[i] = 0; }; + for(Int_t i=0;i<3;i++)fPreviousX[i]=0.; } //________________________________________________________________________ @@ -71,8 +73,9 @@ AliITSv11GeomCableFlat(const char* name, Double_t width, Double_t thick) : fLayColor[i] = 0; fLayMedia[i] = 0; }; + for(Int_t i=0;i<3;i++)fPreviousX[i]=0.; } - +/* //________________________________________________________________________ AliITSv11GeomCableFlat::AliITSv11GeomCableFlat(const AliITSv11GeomCableFlat &s) : AliITSv11GeomCable(s),fWidth(s.fWidth),fThick(s.fThick),fNlayer(s.fNlayer) @@ -84,6 +87,8 @@ AliITSv11GeomCableFlat::AliITSv11GeomCableFlat(const AliITSv11GeomCableFlat &s) fLayMedia[i] = s.fLayMedia[i]; fLayColor[i] = s.fLayColor[i]; } + for(Int_t i=0;i<3;i++)fPreviousX[i]=s.fPreviousX[i]; + } //________________________________________________________________________ @@ -105,7 +110,7 @@ operator=(const AliITSv11GeomCableFlat &s) { }; return *this; } - +*/ //________________________________________________________________________ Int_t AliITSv11GeomCableFlat::GetPoint( Int_t iCheckPt, Double_t *coord) const { @@ -123,7 +128,6 @@ Int_t AliITSv11GeomCableFlat::GetPoint( Int_t iCheckPt, Double_t *coord) }; } - //________________________________________________________________________ Int_t AliITSv11GeomCableFlat::GetVect( Int_t iCheckPt, Double_t *coord) const { @@ -142,7 +146,6 @@ Int_t AliITSv11GeomCableFlat::GetVect( Int_t iCheckPt, Double_t *coord) }; } - //________________________________________________________________________ void AliITSv11GeomCableFlat::AddCheckPoint( TGeoVolume *vol, Int_t iCheckPt, Double_t *coord, Double_t *orthVect) @@ -302,7 +305,6 @@ TGeoVolume* AliITSv11GeomCableFlat::CreateAndInsertCableSegment(Int_t p2, //-- order to match as closer as possible this segment and the //-- previous one. //-- It seems that some times it doesn't work ... - Double_t angleRotZ = 0; TGeoRotation rotTemp("",angleRot1*TMath::RadToDeg(), angleRotDiag*TMath::RadToDeg(), rotation); Double_t localX[3] = {0,1,0}; @@ -312,28 +314,29 @@ TGeoVolume* AliITSv11GeomCableFlat::CreateAndInsertCableSegment(Int_t p2, GetCheckVect(localX, p2Vol, 0, fgkCableMaxNodeLevel+1, globalX); Double_t orthVect[3]; GetCheckVect(vect1, p2Vol, 0, fgkCableMaxNodeLevel+1, orthVect); - if (p2>1) { - Double_t orthVectNorm2 = ScalProd(orthVect,orthVect); - Double_t alpha1 = ScalProd(fPreviousX,orthVect)/orthVectNorm2; - Double_t alpha2 = ScalProd(globalX,orthVect)/orthVectNorm2; - Double_t globalX1p[3], globalX2p[3]; - globalX1p[0] = fPreviousX[0] - alpha1*orthVect[0]; - globalX1p[1] = fPreviousX[1] - alpha1*orthVect[1]; - globalX1p[2] = fPreviousX[2] - alpha1*orthVect[2]; - globalX2p[0] = globalX[0] - alpha2*orthVect[0]; - globalX2p[1] = globalX[1] - alpha2*orthVect[1]; - globalX2p[2] = globalX[2] - alpha2*orthVect[2]; - //-- now I'm searching the 3th vect which makes an orthogonal base - //-- with orthVect and globalX1p ... - Double_t nulVect[3] = {0,0,0}; - Double_t axis3[3]; - TMath::Normal2Plane(nulVect, orthVect, globalX1p, axis3); - Double_t globalX1pNorm2 = ScalProd(globalX1p, globalX1p); - Double_t beta = ScalProd(globalX2p, globalX1p)/globalX1pNorm2; - Double_t gamma = ScalProd(globalX2p, axis3); - angleRotZ = (TMath::ATan2(1,0) - TMath::ATan2(beta, gamma)) - *TMath::RadToDeg(); - }; +// Double_t angleRotZ = 0; +// if (p2>1) { +// Double_t orthVectNorm2 = ScalProd(orthVect,orthVect); +// Double_t alpha1 = ScalProd(fPreviousX,orthVect)/orthVectNorm2; +// Double_t alpha2 = ScalProd(globalX,orthVect)/orthVectNorm2; +// Double_t globalX1p[3], globalX2p[3]; +// globalX1p[0] = fPreviousX[0] - alpha1*orthVect[0]; +// globalX1p[1] = fPreviousX[1] - alpha1*orthVect[1]; +// globalX1p[2] = fPreviousX[2] - alpha1*orthVect[2]; +// globalX2p[0] = globalX[0] - alpha2*orthVect[0]; +// globalX2p[1] = globalX[1] - alpha2*orthVect[1]; +// globalX2p[2] = globalX[2] - alpha2*orthVect[2]; +// //-- now I'm searching the 3th vect which makes an orthogonal base +// //-- with orthVect and globalX1p ... +// Double_t nulVect[3] = {0,0,0}; +// Double_t axis3[3]; +// TMath::Normal2Plane(nulVect, orthVect, globalX1p, axis3); +// Double_t globalX1pNorm2 = ScalProd(globalX1p, globalX1p); +// Double_t beta = ScalProd(globalX2p, globalX1p)/globalX1pNorm2; +// Double_t gamma = ScalProd(globalX2p, axis3); +// angleRotZ = (TMath::ATan2(1,0) - TMath::ATan2(beta, gamma)) +// *TMath::RadToDeg(); +// }; // cout << "!!!!!!!!!!!!!!!!!!! angle = " <1) { - Double_t orthVectNorm2 = ScalProd(orthVect,orthVect); - Double_t alpha1 = ScalProd(fPreviousX,orthVect)/orthVectNorm2; - Double_t alpha2 = ScalProd(globalX,orthVect)/orthVectNorm2; - Double_t globalX1p[3], globalX2p[3]; - globalX1p[0] = fPreviousX[0] - alpha1*orthVect[0]; - globalX1p[1] = fPreviousX[1] - alpha1*orthVect[1]; - globalX1p[2] = fPreviousX[2] - alpha1*orthVect[2]; - globalX2p[0] = globalX[0] - alpha2*orthVect[0]; - globalX2p[1] = globalX[1] - alpha2*orthVect[1]; - globalX2p[2] = globalX[2] - alpha2*orthVect[2]; - //-- now I'm searching the 3th vect which makes an orthogonal base - //-- with orthVect and globalX1p ... - Double_t nulVect[3] = {0,0,0}; - Double_t axis3[3]; - TMath::Normal2Plane(nulVect, orthVect, globalX1p, axis3); - Double_t globalX1pNorm2 = ScalProd(globalX1p, globalX1p); - Double_t beta = ScalProd(globalX2p, globalX1p)/globalX1pNorm2; - Double_t gamma = ScalProd(globalX2p, axis3); - angleRotZ = (TMath::ATan2(1,0) - TMath::ATan2(beta, gamma)) - *TMath::RadToDeg(); - }; - // cout << "!!!!!!!!!!!!!!!!!!! angle = " <1) { +// Double_t orthVectNorm2 = ScalProd(orthVect,orthVect); +// Double_t alpha1 = ScalProd(fPreviousX,orthVect)/orthVectNorm2; +// Double_t alpha2 = ScalProd(globalX,orthVect)/orthVectNorm2; +// Double_t globalX1p[3], globalX2p[3]; +// globalX1p[0] = fPreviousX[0] - alpha1*orthVect[0]; +// globalX1p[1] = fPreviousX[1] - alpha1*orthVect[1]; +// globalX1p[2] = fPreviousX[2] - alpha1*orthVect[2]; +// globalX2p[0] = globalX[0] - alpha2*orthVect[0]; +// globalX2p[1] = globalX[1] - alpha2*orthVect[1]; +// globalX2p[2] = globalX[2] - alpha2*orthVect[2]; +// //-- now I'm searching the 3th vect which makes an orthogonal base +// //-- with orthVect and globalX1p ... +// Double_t nulVect[3] = {0,0,0}; +// Double_t axis3[3]; +// TMath::Normal2Plane(nulVect, orthVect, globalX1p, axis3); +// Double_t globalX1pNorm2 = ScalProd(globalX1p, globalX1p); +// Double_t beta = ScalProd(globalX2p, globalX1p)/globalX1pNorm2; +// Double_t gamma = ScalProd(globalX2p, axis3); +// angleRotZ = (TMath::ATan2(1,0) - TMath::ATan2(beta, gamma)) +// *TMath::RadToDeg(); +// }; CopyFrom(fPreviousX, globalX); //--- Double_t localVect1[3], localVect2[3]; @@ -716,7 +716,7 @@ TGeoVolume* AliITSv11GeomCableFlat::CreateAndInsertCableCylSegment(Int_t p2, Double_t torusPhi1 = TMath::ACos(cosPhi); Double_t torusR = (length/2)/TMath::Sin(torusPhi1); torusPhi1 = torusPhi1*TMath::RadToDeg(); - Double_t perpLength = TMath::Sqrt(torusR*torusR-length*length/4); + Double_t perpLength = TMath::Sqrt((torusR-0.5*length)*(torusR+0.5*length)); Double_t localTransT[3] = {-perpLength,0,0}; Double_t globalTransT[3]; rotTorus.LocalToMasterVect(localTransT, globalTransT); @@ -740,14 +740,13 @@ TGeoVolume* AliITSv11GeomCableFlat::CreateAndInsertCableCylSegment(Int_t p2, return vCableSegT; } - //________________________________________________________________________ TGeoVolume *AliITSv11GeomCableFlat::CreateSegment( Double_t *coord1, Double_t *coord2, Double_t *localVect1, Double_t *localVect2 ) { - + // Create a segment with arbitrary vertices (general case) //================================================= // Calculate segment "deformation" Double_t dx = coord2[0]-coord1[0]; @@ -781,7 +780,7 @@ TGeoVolume *AliITSv11GeomCableFlat::CreateSegment( Double_t *coord1, Double_t dl1 = 0.5*fThick*tanACosCosPhi1*0.99999999999999; Double_t dl2 = 0.5*fThick*tanACosCosPhi2*0.99999999999999; - // 0.9999999999999 is for correcting dawn problems in TGeo... + // 0.9999999999999 is for correcting problems in TGeo... //================================================= // Create the segment TGeoArb8 *cableSeg = new TGeoArb8(fThick/2); @@ -794,11 +793,11 @@ TGeoVolume *AliITSv11GeomCableFlat::CreateSegment( Double_t *coord1, cableSeg->SetVertex( 6, fWidth/2, length/2 - dL2 + dl2); cableSeg->SetVertex( 7, fWidth/2, -length/2 + dL1 - dl1); - TGeoMedium *airSDD = gGeoManager->GetMedium("ITS_AIR$"); - TGeoVolume *vCableSeg = new TGeoVolume(GetName(), cableSeg, airSDD); + TGeoVolume *vCableSeg = new TGeoVolume(GetName(), cableSeg, fLayMedia[fNlayer-1]); + vCableSeg->SetLineColor(fLayColor[fNlayer-1]); - // add all cable layers - for (Int_t iLay=0; iLayAddNode(vLay, iLay+1, fTranslation[iLay]); }; - vCableSeg->SetVisibility(kFALSE); + //vCableSeg->SetVisibility(kFALSE); return vCableSeg; } - //________________________________________________________________________ TGeoVolume *AliITSv11GeomCableFlat::CreateCylSegment(Double_t &phi, Double_t &r) { + // Create a segment in shape of a cylinder, allows to represent + // a folded flat cable Double_t phi1 = 360-phi; Double_t phi2 = 360+phi; @@ -847,11 +847,11 @@ TGeoVolume *AliITSv11GeomCableFlat::CreateCylSegment(Double_t &phi, TGeoTubeSeg *cableSeg = new TGeoTubeSeg(rMin, rMax, fWidth/2, phi1, phi2); - TGeoMedium *airSDD = gGeoManager->GetMedium("ITS_AIR$"); - TGeoVolume *vCableSeg = new TGeoVolume(GetName(), cableSeg, airSDD); + TGeoVolume *vCableSeg = new TGeoVolume(GetName(), cableSeg, fLayMedia[fNlayer-1]); + vCableSeg->SetLineColor(fLayColor[fNlayer-1]); - // add all cable layers - for (Int_t iLay=0; iLayAddNode(vLay, iLay+1, 0); }; - vCableSeg->SetVisibility(kFALSE); + //vCableSeg->SetVisibility(kFALSE); return vCableSeg; } - //________________________________________________________________________ TGeoVolume *AliITSv11GeomCableFlat::CreateBoxSegment( Double_t *coord1, Double_t *coord2) { - - //================================================= // Create a segment for the case it is a simple box + //================================================= Double_t dx = coord2[0]-coord1[0]; Double_t dy = coord2[1]-coord1[1]; Double_t dz = coord2[2]-coord1[2]; Double_t length = TMath::Sqrt(dx*dx+dy*dy+dz*dz); TGeoBBox *cableSeg = new TGeoBBox(fWidth/2, length/2, fThick/2); + TGeoVolume *vCableSeg = new TGeoVolume(GetName(), cableSeg, fLayMedia[fNlayer-1]); + vCableSeg->SetLineColor(fLayColor[fNlayer-1]); + // This volume is the cable container. It codes also the material for the + // last layer - TGeoMedium *airSDD = gGeoManager->GetMedium("ITS_AIR$"); - TGeoVolume *vCableSeg = new TGeoVolume(GetName(), cableSeg, airSDD); - - // add all cable layers - for (Int_t iLay=0; iLaySetLineColor(fLayColor[iLay]); @@ -907,7 +905,7 @@ TGeoVolume *AliITSv11GeomCableFlat::CreateBoxSegment( Double_t *coord1, vCableSeg->AddNode(vLay, iLay+1, fTranslation[iLay]); }; - vCableSeg->SetVisibility(kFALSE); + //vCableSeg->SetVisibility(kFALSE); return vCableSeg; }