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 **************************************************************************/
21 // AliDetector class for MUON subsystem
22 // providing simulation data management
24 #include "Riostream.h"
29 #include <TDirectory.h>
31 #include <TGeometry.h>
35 #include <TObjArray.h>
37 #include <TObjectTable.h>
39 #include <TParticle.h>
42 #include <TRotMatrix.h>
47 #include <TVirtualMC.h>
49 //#include "AliHeader.h"
50 #include "AliLoader.h"
51 #include "AliRunDigitizer.h"
55 #include "AliMUONChamberTrigger.h"
56 #include "AliMUONConstants.h"
57 #include "AliMUONHit.h"
58 #include "AliMUONRawCluster.h"
59 #include "AliMUONTransientDigit.h"
60 #include "AliMUONTriggerCircuit.h"
61 #include "AliMUONTriggerCircuitNew.h"
62 #include "AliMUONGeometry.h"
63 #include "AliMUONGeometryTransformer.h"
64 #include "AliMUONGeometryBuilder.h"
65 #include "AliMUONCommonGeometryBuilder.h"
66 #include "AliMUONVGeometryBuilder.h"
67 #include "AliMUONGeometrySegmentation.h"
68 #include "AliMUONDigitizerv2.h"
69 #include "AliMUONSDigitizerv1.h"
70 #include "AliMUONRawWriter.h"
71 #include "AliMUONSegmentation.h"
74 #include "AliMUONSDigitizerV2.h"
75 #include "AliMUONDigitizerV3.h"
77 #include "AliMUONSt1GeometryBuilderV2.h"
78 #include "AliMUONSt2GeometryBuilderV2.h"
79 #include "AliMUONSlatGeometryBuilder.h"
80 #include "AliMUONTriggerGeometryBuilder.h"
82 // Defaults parameters for Z positions of chambers
83 // taken from values for "stations" in AliMUON::AliMUON
84 // const Float_t zch[7]={528, 690., 975., 1249., 1449., 1610, 1710.};
85 // and from array "dstation" in AliMUONv1::CreateGeometry
86 // Float_t dstation[5]={20., 20., 20, 20., 20.};
87 // for tracking chambers,
88 // according to (Z1 = zch - dstation) and (Z2 = zch + dstation)
89 // for the first and second chambers in the station, respectively,
90 // and from "DTPLANES" in AliMUONv1::CreateGeometry
91 // const Float_t DTPLANES = 15.;
92 // for trigger chambers,
93 // according to (Z1 = zch) and (Z2 = zch + DTPLANES)
94 // for the first and second chambers in the station, respectively
100 //__________________________________________________________________
109 fTriggerCircuitsNew(0),
121 fTriggerScalerEvent(kFALSE),
122 fTriggerResponseV1(kFALSE),
128 /// Default Constructor
130 AliDebug(1,Form("default (empty) ctor this=%p",this));
134 //__________________________________________________________________
135 AliMUON::AliMUON(const char *name, const char *title,
136 const char* sDigitizerClassName,
137 const char* digitizerClassName)
138 : AliDetector(name,title),
139 fNCh(AliMUONConstants::NCh()),
140 fNTrackingCh(AliMUONConstants::NTrackingCh()),
145 fTriggerCircuitsNew(0),
153 fMaxDestepGas(-1), // Negatives values are ignored by geant3 CONS200
154 fMaxDestepAlu(-1), // in the calculation of the tracking parameters
157 fTriggerScalerEvent(kFALSE),
158 fTriggerResponseV1(kFALSE),
160 fSDigitizerType(sDigitizerClassName),
161 fDigitizerType(digitizerClassName),
164 /// Standard constructor
166 AliDebug(1,Form("ctor this=%p",this));
169 SetMarkerColor(kRed);//
172 fGeometryBuilder = new AliMUONGeometryBuilder(this);
174 // Common geometry definitions
176 ->AddBuilder(new AliMUONCommonGeometryBuilder(this));
178 // By default, add also all the needed geometry builders.
179 // If you want to change this from outside, please use ResetGeometryBuilder
180 // method, followed by AddGeometryBuilder ones.
182 AddGeometryBuilder(new AliMUONSt1GeometryBuilderV2(this));
183 AddGeometryBuilder(new AliMUONSt2GeometryBuilderV2(this));
184 AddGeometryBuilder(new AliMUONSlatGeometryBuilder(this));
185 AddGeometryBuilder(new AliMUONTriggerGeometryBuilder(this));
188 // Creating List of Chambers
190 fChambers = new TObjArray(AliMUONConstants::NCh());
192 // Loop over stations
193 for (Int_t st = 0; st < AliMUONConstants::NCh() / 2; st++) {
194 // Loop over 2 chambers in the station
195 for (Int_t stCH = 0; stCH < 2; stCH++) {
198 // Default Parameters for Muon Tracking Stations
200 if (ch < AliMUONConstants::NTrackingCh()) {
201 fChambers->AddAt(new AliMUONChamber(ch),ch);
203 fChambers->AddAt(new AliMUONChamberTrigger(ch, GetGeometryTransformer()),ch);
205 } // Chamber stCH (0, 1) in
206 } // Station st (0...)
208 // cp new design of AliMUONTriggerDecision
209 fTriggerCircuits = new TObjArray(AliMUONConstants::NTriggerCircuit());
210 for (Int_t circ=0; circ<AliMUONConstants::NTriggerCircuit(); circ++) {
211 fTriggerCircuits->AddAt(new AliMUONTriggerCircuit(),circ);
214 fTriggerCircuitsNew = new TObjArray(AliMUONConstants::NTriggerCircuit());
215 for (Int_t circ=0; circ<AliMUONConstants::NTriggerCircuit(); circ++) {
216 fTriggerCircuitsNew->AddAt(new AliMUONTriggerCircuitNew(),circ);
221 //____________________________________________________________________
226 AliDebug(1,Form("dtor this=%p",this));
233 if (fTriggerCircuits){
234 fTriggerCircuits->Delete();
235 delete fTriggerCircuits;
237 if (fTriggerCircuitsNew){
238 fTriggerCircuitsNew->Delete();
239 delete fTriggerCircuitsNew;
243 delete fGeometryBuilder;
244 delete fSegmentation;
248 //_____________________________________________________________________________
249 void AliMUON::AddGeometryBuilder(AliMUONVGeometryBuilder* geomBuilder)
251 /// Add the geometry builder to the list
253 fGeometryBuilder->AddBuilder(geomBuilder);
256 //____________________________________________________________________
257 void AliMUON::BuildGeometry()
259 /// Geometry for event display
262 // for (Int_t i = 0; i < AliMUONConstants::NCh(); i++)
263 // this->Chamber(i).SegmentationModel2(1)->Draw("eventdisplay");// to be check !
268 //____________________________________________________________________
269 const AliMUONGeometry* AliMUON::GetGeometry() const
271 /// Return geometry parametrisation
273 if ( !fGeometryBuilder) {
274 AliWarningStream() << "GeometryBuilder not defined." << std::endl;
278 return fGeometryBuilder->GetGeometry();
281 //____________________________________________________________________
282 const AliMUONGeometryTransformer* AliMUON::GetGeometryTransformer() const
284 /// Return geometry parametrisation
286 const AliMUONGeometry* kGeometry = GetGeometry();
288 if ( !kGeometry) return 0;
290 return kGeometry->GetTransformer();
293 //__________________________________________________________________
294 void AliMUON::SetTreeAddress()
296 /// Set Hits tree address
298 GetMUONData()->SetLoader(fLoader);
299 // GetMUONData()->MakeBranch("D,S,RC");
300 // GetMUONData()->SetTreeAddress("H,D,S,RC");
301 GetMUONData()->SetTreeAddress("H");
302 if (fHits != GetMUONData()->Hits()) {
303 if ( gAlice->GetMCApp() )
304 if ( gAlice->GetMCApp()->GetHitLists() ) {
305 fHits = GetMUONData()->Hits();
306 gAlice->GetMCApp()->AddHitList(fHits); // For purifyKine, only necessary when Hit list is created in AliMUONData
309 fHits = GetMUONData()->Hits(); // Added by Ivana to use the methods FisrtHit, NextHit of AliDetector
312 //_________________________________________________________________
313 void AliMUON::SetChargeSlope(Int_t id, Float_t p1)
315 /// Set the inverse charge slope for chamber id
317 Int_t i=2*(id-1); //PH ((AliMUONChamber*) (*fChambers)[i])->SetSigmaIntegration(p1);
318 //PH ((AliMUONChamber*) (*fChambers)[i+1])->SetSigmaIntegration(p1);
319 ((AliMUONChamber*) fChambers->At(i))->SetChargeSlope(p1);
320 ((AliMUONChamber*) fChambers->At(i+1))->SetChargeSlope(p1);
322 //__________________________________________________________________
323 void AliMUON::SetChargeSpread(Int_t id, Float_t p1, Float_t p2)
325 /// Set sigma of charge spread for chamber id
328 ((AliMUONChamber*) fChambers->At(i))->SetChargeSpread(p1,p2);
329 ((AliMUONChamber*) fChambers->At(i+1))->SetChargeSpread(p1,p2);
331 //___________________________________________________________________
332 void AliMUON::SetSigmaIntegration(Int_t id, Float_t p1)
334 /// Set integration limits for charge spread
336 ((AliMUONChamber*) fChambers->At(i))->SetSigmaIntegration(p1);
337 ((AliMUONChamber*) fChambers->At(i+1))->SetSigmaIntegration(p1);
340 //__________________________________________________________________
341 void AliMUON::SetMaxAdc(Int_t id, Int_t p1)
343 /// Set maximum number for ADCcounts (saturation)
346 ((AliMUONChamber*) fChambers->At(i))->SetMaxAdc(p1);
347 ((AliMUONChamber*) fChambers->At(i+1))->SetMaxAdc(p1);
350 //__________________________________________________________________
351 void AliMUON::SetMaxStepGas(Float_t p1)
353 /// Set stepsize in gas
357 //__________________________________________________________________
358 void AliMUON::SetMaxStepAlu(Float_t p1)
360 /// Set step size in Alu
364 //__________________________________________________________________
365 void AliMUON::SetMaxDestepGas(Float_t p1)
367 /// Set maximum step size in Gas
371 //__________________________________________________________________
372 void AliMUON::SetMaxDestepAlu(Float_t p1)
374 /// Set maximum step size in Alu
379 //____________________________________________________________________
380 Float_t AliMUON::GetMaxStepGas() const
382 /// Return stepsize in gas
387 //____________________________________________________________________
388 Float_t AliMUON::GetMaxStepAlu() const
390 /// Return step size in Alu
395 //____________________________________________________________________
396 Float_t AliMUON::GetMaxDestepGas() const
398 /// Return maximum step size in Gas
400 return fMaxDestepGas;
403 //____________________________________________________________________
404 Float_t AliMUON::GetMaxDestepAlu() const
406 /// Return maximum step size in Gas
408 return fMaxDestepAlu;
411 //____________________________________________________________________
412 void AliMUON::SetAlign(Bool_t align)
414 /// Set option for alignement to geometry builder
416 fGeometryBuilder->SetAlign(align);
419 //____________________________________________________________________
420 void AliMUON::SetAlign(const TString& fileName, Bool_t align)
422 /// Set option for alignement to geometry builder
424 fGeometryBuilder->SetAlign(fileName, align);
427 //____________________________________________________________________
428 void AliMUON::SetResponseModel(Int_t id, AliMUONResponse *response)
430 /// Set the response for chamber id
431 ((AliMUONChamber*) fChambers->At(id))->SetResponseModel(response);
434 //____________________________________________________________________
435 AliDigitizer* AliMUON::CreateDigitizer(AliRunDigitizer* manager) const
437 /// FIXME: the selection of the class should be done through a factory
438 /// mechanism. (see also Hits2SDigits()).
440 AliInfo(Form("Digitizer used : %s",fDigitizerType.Data()));
442 if ( fDigitizerType == "digitizer:default" )
444 return new AliMUONDigitizerv2(manager);
446 else if ( fDigitizerType == "digitizer:NewDigitizerNewTrigger" )
448 return new AliMUONDigitizerV3(manager,AliMUONDigitizerV3::kTriggerElectronics);
450 else if ( fDigitizerType == "digitizer:NewDigitizerOldTrigger" )
452 return new AliMUONDigitizerV3(manager,AliMUONDigitizerV3::kTriggerDecision, kFALSE, kFALSE);
454 else if ( fDigitizerType == "digitizer:NewDigitizerEffTrigger" )
456 return new AliMUONDigitizerV3(manager,AliMUONDigitizerV3::kTriggerDecision, kTRUE, kFALSE);
458 else if ( fDigitizerType == "digitizer:NewDigitizerWithNoiseOldTrigger" )
460 return new AliMUONDigitizerV3(manager,AliMUONDigitizerV3::kTriggerDecision, kFALSE, kTRUE);
464 AliFatal(Form("Unknown digitizer type : %s",fDigitizerType.Data()));
469 //_____________________________________________________________________
471 AliMUON::SDigitizerType() const
473 /// Return digitizer type
475 return fSDigitizerType;
478 //_____________________________________________________________________
479 void AliMUON::SDigits2Digits()
481 /// Write TreeD here only
484 // sprintf(hname,"TreeD%d",fLoader->GetHeader()->GetEvent());
485 fLoader->TreeD()->Write(hname,TObject::kOverwrite);
486 fLoader->TreeD()->Reset();
489 //_____________________________________________________________________
490 void AliMUON::Hits2SDigits()
492 /// FIXME: the selection of the sdigitizer should be done through a
493 /// factory mechanism.
495 AliInfo(Form("SDigitizer used : %s",fSDigitizerType.Data()));
497 if ( fSDigitizerType == "sdigitizer:default" )
499 // Adaption of AliMUONSDigitizerv1 to be excuted by the AliSimulation framework
500 AliRunLoader* runLoader = fLoader->GetRunLoader();
501 AliRunDigitizer * manager = new AliRunDigitizer(1,1);
502 manager->SetInputStream(0,runLoader->GetFileName(),AliConfig::GetDefaultEventFolderName());
503 AliMUONDigitizer * dMUON = new AliMUONSDigitizerv1(manager);
504 fLoader->LoadHits("READ");
505 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
506 runLoader->GetEvent(iEvent);
509 fLoader->UnloadHits();
511 else if ( fSDigitizerType == "sdigitizer:AliMUONSDigitizerV2" )
513 TTask* sdigitizer = new AliMUONSDigitizerV2;
514 sdigitizer->ExecuteTask();
518 AliFatal(Form("Unknown sdigitizer classname : %s",fSDigitizerType.Data()));
522 //_____________________________________________________________________
524 AliMUON::DigitizerType() const
526 /// Return digitizer type
528 return fDigitizerType;
531 //_____________________________________________________________________
532 void AliMUON::Digits2Raw()
534 /// Convert digits of the current event to raw data
538 fRawWriter = new AliMUONRawWriter(fMUONData);
539 if (fTriggerScalerEvent == kTRUE)
541 fRawWriter->SetScalersNumbers();
545 if (!fRawWriter->Digits2Raw())
547 AliError("pb writting raw data");
551 //_______________________________________________________________________
552 AliLoader* AliMUON::MakeLoader(const char* topfoldername)
554 /// Build standard getter (AliLoader type);
555 /// if detector wants to use castomized getter, it must overload this method
557 AliDebug(1,Form("Creating standard getter for detector %s. Top folder is %s.",
558 GetName(),topfoldername));
559 fLoader = new AliLoader(GetName(),topfoldername);
560 fMUONData = new AliMUONData(fLoader,GetName(),GetName());
561 fMUONData->SetSplitLevel(fSplitLevel);
564 //_______________________________________________________________________
566 AliMUONRawCluster *AliMUON::RawCluster(Int_t ichamber, Int_t icathod, Int_t icluster)
568 /// Return rawcluster (icluster) for chamber ichamber and cathode icathod
571 TClonesArray *muonRawCluster = GetMUONData()->RawClusters(ichamber);
573 TTree *treeR = fLoader->TreeR();
574 Int_t nent=(Int_t)treeR->GetEntries();
575 treeR->GetEvent(nent-2+icathod-1);
576 //treeR->GetEvent(icathod);
577 //Int_t nrawcl = (Int_t)muonRawCluster->GetEntriesFast();
579 AliMUONRawCluster * mRaw = (AliMUONRawCluster*)muonRawCluster->UncheckedAt(icluster);
580 //printf("RawCluster _ nent nrawcl icluster mRaw %d %d %d%p\n",nent,nrawcl,icluster,mRaw);
585 //________________________________________________________________________
587 AliMUON::ResetGeometryBuilder()
589 /// Only to be used by "experts" wanting to change the geometry builders
591 /// As the ctor of AliMUON now defines a default geometrybuilder, this
592 /// ResetGeometryBuilder() must be called prior to call the
593 /// AddGeometryBuilder()
595 delete fGeometryBuilder;
596 fGeometryBuilder = new AliMUONGeometryBuilder(this);
598 ->AddBuilder(new AliMUONCommonGeometryBuilder(this));
601 //____________________________________________________________________
602 Bool_t AliMUON::GetTriggerResponseV1() const
605 /// Returns fTriggerResponseV1
607 return fTriggerResponseV1;
611 //____________________________________________________________________
612 Int_t AliMUON::GetTriggerCoinc44() const
615 /// Returns fTriggerCoinc44
617 return fTriggerCoinc44;