1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 // ALICE Cosmic Ray Trigger //
22 // This class contains the functions for version 0 of the ALICE Cosmic Ray //
23 // Trigger. This vesion is suposed to work as standalone module //
28 // Arturo Fernandez <afernand@fcfm.buap.mx>
29 // Enrique Gamez <egamez@fcfm.buap.mx>
31 // Universidad Autonoma de Puebla
36 <img src="picts/AliCRTv1Class.gif">
39 <p>The responsible person for this module is
40 <a href="mailto:egamez@fcfm.buap.mx">Enrique Gamez</a>.
46 ///////////////////////////////////////////////////////////////////////////////
50 #include <TClonesArray.h>
51 #include <TLorentzVector.h>
53 #include <TVirtualMC.h>
58 #include "AliCRThit.h"
59 #include "AliCRTConstants.h"
64 //_____________________________________________________________________________
69 // Default constructor
75 //_____________________________________________________________________________
76 AliCRTv1::AliCRTv1(const char *name, const char *title)
80 // Standard constructor
84 <img src="picts/AliCRTv1.gif">
87 fIshunt = 1; // All hits are associated with primary particles
89 fHits = new TClonesArray("AliCRThit",400);
90 gAlice->GetMCApp()->AddHitList(fHits);
97 //_____________________________________________________________________________
98 AliCRTv1::AliCRTv1(const AliCRTv1& crt)
107 //_____________________________________________________________________________
108 AliCRTv1::~AliCRTv1()
111 // Default destructor
115 //_____________________________________________________________________________
116 AliCRTv1& AliCRTv1::operator=(const AliCRTv1& crt)
119 // Asingment operator
125 //_____________________________________________________________________________
126 void AliCRTv1::CreateMaterials()
130 // Use the parent class definition of the materials
132 AliCRT::CreateMaterials();
135 //_____________________________________________________________________________
136 void AliCRTv1::CreateGeometry()
139 // Create geometry for the CRT array
142 Int_t idrotm[2499]; // The rotation matrix.
143 Int_t* idtmed = fIdtmed->GetArray() - 1099 ;
146 this->CreateShafts();
149 this->CreateMolasse();
151 AliCRTConstants* crtConstants = AliCRTConstants::Instance();
153 // Create a big volume with air barrel above the magnet
155 Float_t magnetSides = 3.;
156 Float_t planesPerpendicularToZ = 2.;
158 barrel[1] = 45*magnetSides;
159 barrel[2] = magnetSides;
160 barrel[3] = planesPerpendicularToZ;
162 barrel[5] = crtConstants->MagMinRadius();
163 barrel[6] = crtConstants->MagMinRadius() + 2.; // 2 cm width
164 barrel[7] = -barrel[4];
165 barrel[8] = barrel[5];
166 barrel[9] = barrel[6];
167 gMC->Gsvolu("CRT4", "PGON", idtmed[1112], barrel, 10);
168 gMC->Gspos("CRT4", 1 , "CRT", 0., -30., 0., 0, "ONLY");
172 box[0] = crtConstants->SinglePaletteLenght()/4;
173 box[1] = crtConstants->SinglePaletteHeight()/2;
174 box[2] = crtConstants->SinglePaletteWidth()/2;
175 gMC->Gsvolu("CRT6", "BOX", idtmed[1113], box, 3);
177 // In the right side side of the magnet
178 AliMatrix(idrotm[231], 90., 45., 90., 315., 180., 202.5);
180 // In the left side side of the magnet
181 //AliMatrix(idrotm[232], 90., 315., 90., 315., 0.0000040, 263.0707092);
182 AliMatrix(idrotm[232], 90, 315, 90, 315, 0, 263);
184 // Now put them into the volume created above
185 // First above the magnet.
186 Float_t away = (2.*barrel[5]*TMath::Sin(kDegrad*22.5))/4.;
188 for (Int_t i = 0; i < nModules; i++) {
189 Float_t zCoordinate = i*100 - 450;
191 gMC->Gspos("CRT6", i, "CRT4", -away, barrel[5]+1., zCoordinate, 0, "ONLY");
193 gMC->Gspos("CRT6",i+10,"CRT4", away, barrel[5]+1., zCoordinate, 0, "ONLY");
195 // The most away part (left side)
196 gMC->Gspos("CRT6", i+20, "CRT4", 3*away, barrel[5]+21 - away, zCoordinate, idrotm[232], "ONLY");
197 // The inner part (left side)
198 gMC->Gspos("CRT6", i+30, "CRT4", 4*away, barrel[5]+21 - 2*away, zCoordinate, idrotm[232], "ONLY");
200 // The most away part (rigth side)
201 gMC->Gspos("CRT6", i+40, "CRT4", -3*away, barrel[5]+21. - away, zCoordinate, idrotm[231], "ONLY");
202 // The inner part (rigth side)
203 gMC->Gspos("CRT6", i+50, "CRT4", -4*away, barrel[5]+21 - 2*away, zCoordinate, idrotm[231], "ONLY");
206 // Now the magnet doors
208 barrel[1] = 45*magnetSides;
209 barrel[2] = magnetSides;
213 barrel[7] = barrel[4] + 2.;
214 barrel[8] = barrel[5];
215 barrel[9] = barrel[6];
216 gMC->Gsvolu("CRT5", "PGON", idtmed[1111], barrel, 10);
217 gMC->Gspos("CRT5", 1, "CRT", 0., -30., 0., 0, "ONLY");
219 AliMatrix(idrotm[300], 90., 0., 90., 90., 180., 0.);
220 gMC->Gspos("CRT5", 2, "CRT", 0., -30., 0., idrotm[300], "ONLY");
224 //_____________________________________________________________________________
225 void AliCRTv1::CreateMolasse()
230 Int_t idrotm[2499]; // The rotation matrix.
231 Int_t* idtmed = fIdtmed->GetArray() - 1099 ;
233 // Exactly above the hall
236 tspar[1] = 1170 + 375;
237 tspar[2] = (1900 + 1150)/2 + 100;
240 gMC->Gsvolu("CMO1", "TUBS", idtmed[1123], tspar, 5);
241 gMC->Gspos("CMO1", 1, "CRT", 0, 500., 1900 - tspar[2] + 400, 0, "MANY");
245 tbox[1] = (4420 - 1670)/2;
246 tbox[2] = (1900 + 1150)/2 + 200;
247 gMC->Gsvolu("CM12", "BOX", idtmed[1123], tbox, 3);
248 gMC->Gspos("CM12",1,"CRT",0, 4420 - tbox[1], 1900 - tbox[2] + 400, 0,"MANY");
250 AliMatrix(idrotm[2003], 0., 0., 90., 0., 90., 90.);
255 tube[2] = (5150 - 1166)/2;
256 gMC->Gsvolu("CMO2", "TUBE", idtmed[1123], tube, 3);
257 gMC->Gspos("CMO2", 1, "CRT", -2100, 4420 - tube[2], 0, idrotm[2003], "MANY");
262 tube[2] = (5150 - 690)/2;
263 gMC->Gsvolu("CMO3", "TUBE", idtmed[1123], tube, 3);
264 gMC->Gspos("CMO3",1,"CRT", 375, 4420 - tube[2], 1900 + 2987.7,idrotm[2003],"MANY");
266 // Behind the PGC2 up to the end of the M. volume.
269 tbox[2] = (12073 - 1900 - 2987.7 - 650)/2.;
270 gMC->Gsvolu("CMO7", "BOX", idtmed[1123], tbox, 3);
271 gMC->Gspos("CMO7", 1, "CRT", 0, 4420 - tbox[1], 1900 + 2987.7 + 650 + tbox[2], 0, "MANY");
273 // Along the PX24 , upper part.
276 tube[2] = 2575 - 1300 + 95;
277 gMC->Gsvolu("CMO4", "TUBE", idtmed[1123], tube, 3);
278 gMC->Gspos("CMO4", 1, "CRT", 0, 404 + 1300 + tube[2], -2300, idrotm[2003], "MANY");
280 // Along the PX24 , lower part
284 tspar[3] = kRaddeg*TMath::ASin(1070./1150.);
285 tspar[4] = 360 - tspar[3];
286 gMC->Gsvolu("CMO5", "TUBS", idtmed[1123], tspar, 5);
287 gMC->Gspos("CMO5", 1, "CRT", 0., 404, -2300, idrotm[2003], "MANY");
292 gMC->Gsvolu("CMO6", "BOX", idtmed[1123], tbox, 3);
293 gMC->Gspos("CMO6", 1, "CRT", 0., 4420 - tbox[1], -3550 - tbox[2], 0, "MANY");
295 // On the right side of th hall
296 tbox[0] = (12073 - 1250)/2;
298 tbox[2] = (8437.7+650)/2;
299 gMC->Gsvolu("CMO8", "BOX", idtmed[1123], tbox, 3);
300 gMC->Gspos("CMO8", 1, "CRT", 1250 + tbox[0], 4420 - tbox[1], -3550 + tbox[2], 0, "MANY");
302 // on the left side of the hall, behind
303 tbox[0] = (12073 - 2755)/2;
305 tbox[2] = (8437.7 + 650)/2.;
306 gMC->Gsvolu("CMO9", "BOX", idtmed[1123], tbox, 3);
307 gMC->Gspos("CMO9", 1, "CRT", -2755 - tbox[0], 4420 - tbox[1], -3550 + tbox[2], 0, "MANY");
309 // Molasse betwen the PX24 & PM25 on the left side.
310 tbox[0] = (2755 - 1250)/2;
312 tbox[2] = (3550 - 555)/2;
313 gMC->Gsvolu("CM10", "BOX", idtmed[1123], tbox, 3);
314 gMC->Gspos("CM10", 1, "CRT", -1250 - tbox[0], 4420 - tbox[1], -tbox[2] - 555, 0, "MANY");
316 // Molasse betwen the PGC2 & PM25 on the left side.
317 tbox[0] = (2755 - 1250)/2;
319 tbox[2] = (1900 + 2987.7 - 555 + 650)/2;
320 gMC->Gsvolu("CM11", "BOX", idtmed[1123], tbox, 3);
321 gMC->Gspos("CM11", 1, "CRT", -1250 - tbox[0], 4420 - tbox[1], 555 + tbox[2], 0, "MANY");
325 //_____________________________________________________________________________
326 void AliCRTv1::CreateShafts()
331 Int_t idrotm[2499]; // The rotation matrix.
332 Int_t* idtmed = fIdtmed->GetArray() - 1099 ;
334 // Create a mother volume.
336 //pbox[0] = AliCRTConstants::Instance()->Depth()*TMath::Tan(67.5*kDegrad);
338 pbox[1] = AliCRTConstants::Instance()->Depth();
340 gMC->Gsvolu("CRT", "BOX", idtmed[1114], pbox, 3);
341 gMC->Gspos("CRT", 1, "ALIC", 0, 0, 0, 0, "ONLY");
350 gMC->Gsvolu("CHC1", "TUBS", idtmed[1116], ptubs, 5);
351 gMC->Gspos("CHC1", 1, "CRT", 0, 500, 0, 0, "ONLY");
356 AliMatrix(idrotm[2001], 0., 0., 90., 0., 90., 90.);
362 ptubs[3] = kRaddeg*TMath::ASin(1070/ptubs[0]);
363 ptubs[4] = 360 - ptubs[3];
364 gMC->Gsvolu("CSF1", "TUBS", idtmed[1116], ptubs, 5);
365 gMC->Gspos("CSF1", 1, "CRT", 0., 404, -2300, idrotm[2001], "MANY");
370 ptube[2] = 2575 - ptubs[2] + 95;
371 gMC->Gsvolu("CSF2", "TUBE", idtmed[1116], ptube, 3);
372 gMC->Gspos("CSF2", 1, "CRT", 0, 404 + ptubs[2] + ptube[2], -2300, idrotm[2001], "MANY");
374 // Concrete walls along the shaft
378 gMC->Gsvolu("CSW1", "BOX", idtmed[1116], pbox, 3);
379 gMC->Gspos("CSW1", 1, "CRT", -290 - pbox[0], 404 - 1300 + pbox[1], -3450 + 210*2, 0, "MANY");
385 gMC->Gsvolu("CSW3", "BOX", idtmed[1116], pbox, 3);
386 gMC->Gspos("CSW3", 1, "CRT", 420 - 290 +pbox[0], 404 - 1300 + pbox[1], -3450 + 210*2, 0, "MANY");
392 gMC->Gsvolu("CSW2", "BOX", idtmed[1116], pbox, 3);
393 gMC->Gspos("CSW2", 1, "CRT", -290 - pbox[0], 404 - 1300 + pbox[1], -3450 + pbox[2], 0, "MANY");
394 gMC->Gspos("CSW2", 2, "CRT", 420 - 290 + pbox[0], 404 - 1300 + pbox[1], -3450 + pbox[2], 0, "MANY");
400 gMC->Gsvolu("CSP1", "BOX", idtmed[1116], pbox, 3);
401 gMC->Gspos("CSP1", 1, "CRT", 0, 2600 - 700, -1150 - pbox[2], 0, "MANY");
407 gMC->Gsvolu("CSP2", "BOX", idtmed[1116], pbox, 3);
408 gMC->Gspos("CSP2", 1, "CRT", 0, 2950.-700., -3450+pbox[2], 0, "MANY");
414 gMC->Gsvolu("CSP3", "BOX", idtmed[1116], pbox, 3);
415 gMC->Gspos("CSP3", 1, "CRT", 0, 2950.-700., -1150.-210.-pbox[2], 0, "MANY");
421 gMC->Gsvolu("CSP4", "BOX", idtmed[1116], pbox, 3);
422 gMC->Gspos("CSP4", 1, "CRT", 0, 2950 - 700 + 155+pbox[1], -1150 - 210 - pbox[2], 0, "MANY");
428 gMC->Gsvolu("CSP5", "BOX", idtmed[1116], pbox, 3);
429 gMC->Gspos("CSP5", 1, "CRT", 0, 2950 - 700, -3450 + 460 + pbox[2], 0,"MANY");
435 gMC->Gsvolu("CSP6", "BOX", idtmed[1116], pbox, 3);
436 gMC->Gspos("CSP6", 1, "CRT", 1150 - 600 , 2950 - 700, -3450 + 460 + pbox[2], 0, "MANY");
437 gMC->Gspos("CSP6", 2, "CRT", -1150 + 600, 2950 - 700, -3450 + 460 + pbox[2], 0, "MANY");
443 gMC->Gsvolu("CSP7", "BOX", idtmed[1116], pbox, 3);
444 gMC->Gspos("CSP7", 1, "CRT", 850 + pbox[0], 2950 - 700 + 100, -3450 + 460 + pbox[2], 0, "MANY");
445 gMC->Gspos("CSP7", 2, "CRT", -850 - pbox[0], 2950 - 700+ 100, -3450 + 460 + pbox[2], 0, "MANY");
449 ptube[1] = ptube[0] + 100;
450 ptube[2] = (5150 - 1166)/2;
451 gMC->Gsvolu("CSF3", "TUBE", idtmed[1116], ptube, 3);
452 gMC->Gspos("CSF3", 1, "CRT", -2100, AliCRTConstants::Instance()->Depth()-ptube[2], 0, idrotm[2001], "MANY");
456 ptube[1] = ptube[0] + 100;
457 ptube[2] = (5150 - 690)/2;
458 gMC->Gsvolu("CSF4", "TUBE", idtmed[1116], ptube, 3);
459 gMC->Gspos("CSF4", 1, "CRT", 375, AliCRTConstants::Instance()->Depth()-ptube[2], 1900 + 2987.7, idrotm[2001], "MANY");
463 //_____________________________________________________________________________
464 void AliCRTv1::DrawDetector() const
467 // Draw a shaded view of the L3 magnet
469 //cout << "AliCRTv1::DrawModule() : Drawing the module" << endl;
474 gMC->Gsatt("*", "seen", -1);
475 gMC->Gsatt("alic", "seen", 0);
477 gMC->Gsatt("ALIC","seen",enable);
478 gMC->Gsatt("CRT", "seen",enable);
479 gMC->Gsatt("L3MO","seen", able); // L3 Magnet
480 //gMC->Gsatt("CRT1","seen", able); // Scintillators
481 gMC->Gsatt("CRT4","seen", able); // Scintillators barrel
483 // Draw the molasse volumes
484 gMC->Gsatt("CMO1","seen",enable); // Exactly above the HALL
485 gMC->Gsatt("CMO2","seen",enable); // Molasse, along the PM25
486 gMC->Gsatt("CMO3","seen",enable); // molasse along the PGC2
487 gMC->Gsatt("CMO4","seen",enable); // Molasse, behind the PX24 upper part
488 gMC->Gsatt("CMO5","seen",enable); // molasse behind px24, lower part
489 gMC->Gsatt("CMO6","seen",enable); // behind the PX24
490 gMC->Gsatt("CMO7","seen",enable); // behind the PGC2
491 gMC->Gsatt("CMO8","seen",enable); // on the right side.
492 gMC->Gsatt("CMO9","seen",enable); // on the left side.
493 gMC->Gsatt("CM10","seen",enable); // betwen PX24 & PM25.
494 gMC->Gsatt("CM11","seen",enable); // betwen PGC2 & PM25.
495 gMC->Gsatt("CM12","seen",enable); // box above the hall.
497 gMC->Gdopt("hide", "on");
498 gMC->Gdopt("edge","off");
499 gMC->Gdopt("shad", "on");
500 gMC->Gsatt("*", "fill", 7);
501 gMC->SetClipBox("ALIC", 0, 3000, -3000, 3000, -6000, 6000);
503 gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .009, .009);
504 gMC->Gdhead(1111, "View of CRT(ACORDE)");
505 gMC->Gdman(18, 4, "MAN");
510 //_____________________________________________________________________________
511 void AliCRTv1::Init()
514 // Initialise L3 magnet after it has been built
518 printf("\n%s: ",ClassName());
519 for(i=0;i<35;i++) printf("*");
520 printf(" CRTv1_INIT ");
521 for(i=0;i<35;i++) printf("*");
522 printf("\n%s: ",ClassName());
524 // Here the CRTv1 initialisation code (if any!)
525 for(i=0;i<80;i++) printf("*");
531 //____________________________________________________________________________
532 void AliCRTv1::StepManager()
535 // Called for every step in the Cosmic Ray Trigger
542 static Float_t hits[14];
543 static Float_t eloss;
545 if ( gMC->TrackPid() != kMuonMinus ) return;
547 // Only charged tracks
548 if ( !(gMC->TrackCharge()) ) return;
550 if (gMC->IsNewTrack()) {
551 // Reset the deposited energy
555 // Add th energy loss in each step.
556 eloss += gMC->Edep();
558 if ( ( (strcmp(gMC->CurrentVolName(),"CRT4") == 0) || // Magnet
559 (strcmp(gMC->CurrentVolName(),"CRT5") == 0) || // CRT
560 (strcmp(gMC->CurrentVolName(),"CRT6") == 0) || // Magnet Doors
561 (strcmp(gMC->CurrentVolName(),"CSF2") == 0) || // PX24
562 (strcmp(gMC->CurrentVolName(),"CSF3") == 0) || // PM25
563 (strcmp(gMC->CurrentVolName(),"CSF4") == 0) ) // PGC2
564 && gMC->IsTrackEntering() ) {
566 // Get current particle id(ipart),track position (pos) and momentum (mom)
567 gMC->TrackPosition(pos);
568 gMC->TrackMomentum(mom);
569 ipart = gMC->TrackPid();
571 ipart = gMC->TrackPid();
572 hits[0] = (Float_t)ipart; // (fId)
574 hits[1] = pos[0]; // X coordinate (fX)
575 hits[2] = pos[1]; // Y coordinate (fY)
576 hits[3] = pos[2]; // Z coordinate (fZ)
577 hits[4] = mom[0]; // Px (fpxug)
578 hits[5] = mom[1]; // Py (fpyug)
579 hits[6] = mom[2]; // Pz (fpzug)
580 hits[7] = eloss; // Energy loss
583 if ( (strcmp(gMC->CurrentVolName(),"CRT4")==0) ) vol[0] = 1; // Magnet
584 else if ( (strcmp(gMC->CurrentVolName(),"CRT5")==0) ) vol[0] = 2; // CRT
585 else if ( (strcmp(gMC->CurrentVolName(),"CRT6")==0) ) vol[0] = 3; // Doors
586 else if ( (strcmp(gMC->CurrentVolName(),"CSF2")==0) ) vol[0] = 4; // PX24
587 else if ( (strcmp(gMC->CurrentVolName(),"CSF3")==0) ) vol[0] = 5; // PM25
588 else if ( (strcmp(gMC->CurrentVolName(),"CSF4")==0) ) vol[0] = 6; // PGC2
589 else vol[0] = -1;// ?
590 //vol[0] = gMC->GetMedium(); //layer(flay)
592 AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, hits);
594 // Reset the deposited energy only when you reach the Magnet
595 if ( (strcmp(gMC->CurrentVolName(),"CRT4")==0) ) eloss = 0;
603 //_____________________________________________________________________________
604 void AliCRTv1::AddHit(Int_t track, Int_t *vol, Float_t *hits)
609 TClonesArray &lhits = *fHits;
610 new(lhits[fNhits++]) AliCRThit(fIshunt,track,vol,hits);
613 //_____________________________________________________________________________
614 void AliCRTv1::ResetHits()
616 // Reset number of clusters and the cluster array for this detector
617 AliDetector::ResetHits();
620 //_____________________________________________________________________________
621 void AliCRTv1::ResetDigits()
624 // Reset number of digits and the digits array for this detector
625 AliDetector::ResetDigits();
628 //____________________________________________________________________________
629 void AliCRTv1::FinishEvent()