Clean-up of include files
[u/mrichter/AliRoot.git] / MUON / AliMUON.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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  **************************************************************************/
15
16 /* $Id$ */
17
18 //-----------------------------------------------------------------------------
19 // Class AliMUON
20 // ------------------
21 // AliDetector class for MUON subsystem 
22 // providing simulation data management 
23 //-----------------------------------------------------------------------------
24
25 #include <TTree.h>
26 #include "AliMUON.h"
27
28 #include "AliMUONSDigitizerV2.h"
29 #include "AliMUONDigitizerV3.h"
30 #include "AliMUONDigitMaker.h"
31 #include "AliMUONDigit.h"
32 #include "AliMUONCalibrationData.h"
33
34 #include "AliMUONDigitStoreV1.h"
35 #include "AliMUONTriggerStoreV1.h"
36 #include "AliMUONHitStoreV1.h"
37
38 #include "AliMUONChamberTrigger.h"
39 #include "AliMUONConstants.h"
40 #include "AliMUONGeometry.h"
41 #include "AliMUONGeometryTransformer.h"
42 #include "AliMUONGeometryBuilder.h"
43 #include "AliMUONVGeometryBuilder.h"    
44 #include "AliMUONCommonGeometryBuilder.h"
45 #include "AliMUONSt1GeometryBuilderV2.h"
46 #include "AliMUONSt2GeometryBuilderV2.h"
47 #include "AliMUONSlatGeometryBuilder.h"
48 #include "AliMUONTriggerGeometryBuilder.h"
49 #include "AliMUONDigitCalibrator.h"
50 #include "AliMUONRecoParam.h"
51 #include "AliCDBManager.h"
52 #include "AliCDBEntry.h"
53
54 #include "AliMUONRawWriter.h"
55
56 #include "AliLoader.h"
57 #include "AliCDBManager.h"
58 #include "AliRunDigitizer.h"
59 #include "AliMC.h"
60 #include "AliRun.h"
61 #include "AliRawDataHeaderSim.h"
62 #include "AliLog.h"
63
64 #include <TObjArray.h>
65
66 // Defaults parameters for Z positions of chambers
67 // taken from values for "stations" in AliMUON::AliMUON
68 //     const Float_t zch[7]={528, 690., 975., 1249., 1449., 1610, 1710.};
69 // and from array "dstation" in AliMUONv1::CreateGeometry
70 //          Float_t dstation[5]={20., 20., 20, 20., 20.};
71 //     for tracking chambers,
72 //          according to (Z1 = zch - dstation) and  (Z2 = zch + dstation)
73 //          for the first and second chambers in the station, respectively,
74 // and from "DTPLANES" in AliMUONv1::CreateGeometry
75 //           const Float_t DTPLANES = 15.;
76 //     for trigger chambers,
77 //          according to (Z1 = zch) and  (Z2 = zch + DTPLANES)
78 //          for the first and second chambers in the station, respectively
79
80 /// \cond CLASSIMP
81 ClassImp(AliMUON)  
82 /// \endcond
83
84 //__________________________________________________________________
85 AliMUON::AliMUON()
86   : AliDetector(),
87     fNCh(0),
88     fNTrackingCh(0),
89     fSplitLevel(0),
90     fChambers(0),
91     fGeometryBuilder(0),
92     fAccCut(kFALSE),
93     fAccMin(0.),
94     fAccMax(0.),   
95     fMaxStepGas(0.),
96     fMaxStepAlu(0.),
97     fMaxDestepGas(0.),
98     fMaxDestepAlu(0.),
99     fMaxIterPad(0),
100     fCurIterPad(0),
101     fIsMaxStep(kTRUE),
102     fTriggerScalerEvent(kFALSE),
103     fTriggerResponseV1(kFALSE),
104     fTriggerCoinc44(0),
105     fTriggerEffCells(0),
106     fDigitizerWithNoise(1),
107     fDigitizerNSigmas(4.0),
108     fIsTailEffect(kTRUE),
109     fConvertTrigger(kFALSE),
110     fRawWriter(0x0),
111     fDigitMaker(0x0),
112     fHitStore(0x0),
113     fDigitStoreConcreteClassName(),
114     fCalibrationData(0x0),
115     fDigitCalibrator(0x0)
116 {
117 /// Default Constructor
118     
119     AliDebug(1,Form("default (empty) ctor this=%p",this));
120     fIshunt          = 0;
121 }
122
123 //__________________________________________________________________
124 AliMUON::AliMUON(const char *name, const char* title)
125   : AliDetector(name, title),
126     fNCh(AliMUONConstants::NCh()),
127     fNTrackingCh(AliMUONConstants::NTrackingCh()),
128     fSplitLevel(0),
129     fChambers(0),
130     fGeometryBuilder(0),
131     fAccCut(kFALSE),
132     fAccMin(0.),
133     fAccMax(0.),   
134     fMaxStepGas(0.1),
135     fMaxStepAlu(0.1),
136     fMaxDestepGas(-1), // Negatives values are ignored by geant3 CONS200 
137     fMaxDestepAlu(-1), // in the calculation of the tracking parameters
138     fMaxIterPad(0),
139     fCurIterPad(0),
140     fIsMaxStep(kTRUE),
141     fTriggerScalerEvent(kFALSE),
142     fTriggerResponseV1(kFALSE),
143     fTriggerCoinc44(0),
144     fTriggerEffCells(0),
145     fDigitizerWithNoise(1),
146     fDigitizerNSigmas(4.0),
147     fIsTailEffect(kTRUE),
148     fConvertTrigger(kFALSE),
149     fRawWriter(0x0),
150     fDigitMaker(new AliMUONDigitMaker),
151     fHitStore(0x0),
152     fDigitStoreConcreteClassName("AliMUONDigitStoreV2S"),
153     fCalibrationData(),
154     fDigitCalibrator(0x0)
155 {
156   /// Standard constructor  
157   
158   AliDebug(1,Form("ctor this=%p",this));
159   fIshunt =  0;
160   
161   //PH SetMarkerColor(kRed);//
162     
163   // Geometry builder
164   fGeometryBuilder = new AliMUONGeometryBuilder(this);
165   
166   // Common geometry definitions
167   fGeometryBuilder
168     ->AddBuilder(new AliMUONCommonGeometryBuilder(this));
169   
170   // By default, add also all the needed geometry builders.
171   // If you want to change this from outside, please use ResetGeometryBuilder
172   // method, followed by AddGeometryBuilder ones.
173   
174   AddGeometryBuilder(new AliMUONSt1GeometryBuilderV2(this));
175   AddGeometryBuilder(new AliMUONSt2GeometryBuilderV2(this));
176   AddGeometryBuilder(new AliMUONSlatGeometryBuilder(this));
177   AddGeometryBuilder(new AliMUONTriggerGeometryBuilder(this));
178   
179   //
180   // Creating List of Chambers
181     Int_t ch;
182     fChambers = new TObjArray(AliMUONConstants::NCh());
183     fChambers->SetOwner(kTRUE);
184     
185     // Loop over stations
186     for (Int_t st = 0; st < AliMUONConstants::NCh() / 2; st++) {
187       // Loop over 2 chambers in the station
188       for (Int_t stCH = 0; stCH < 2; stCH++) {
189         //
190         //    
191         //    Default Parameters for Muon Tracking Stations
192         ch = 2 * st + stCH;
193         if (ch < AliMUONConstants::NTrackingCh()) {
194           fChambers->AddAt(new AliMUONChamber(ch),ch);
195         } else {
196           fChambers->AddAt(new AliMUONChamberTrigger(ch, GetGeometryTransformer()),ch);
197         }
198       } // Chamber stCH (0, 1) in 
199     }     // Station st (0...)
200   
201   Int_t runnumber = AliCDBManager::Instance()->GetRun();
202   
203   fCalibrationData = new AliMUONCalibrationData(runnumber);
204 }
205
206 //____________________________________________________________________
207 AliMUON::~AliMUON()
208 {
209 /// Destructor
210
211   AliDebug(1,Form("dtor this=%p",this));
212   delete fChambers;
213   delete fGeometryBuilder;
214   delete fRawWriter;
215   delete fDigitMaker;
216   delete fHitStore;
217   delete fCalibrationData;
218   delete fDigitCalibrator;
219 }
220
221 //_____________________________________________________________________________
222 void AliMUON::AddGeometryBuilder(AliMUONVGeometryBuilder* geomBuilder)
223 {
224 /// Add the geometry builder to the list
225
226   fGeometryBuilder->AddBuilder(geomBuilder);
227 }
228
229 //____________________________________________________________________
230 const AliMUONGeometry*  AliMUON::GetGeometry() const
231 {
232 /// Return geometry parametrisation
233
234   if ( !fGeometryBuilder) {
235     AliWarningStream() << "GeometryBuilder not defined." << std::endl;
236     return 0;
237   }
238   
239   return fGeometryBuilder->GetGeometry();
240 }   
241
242 //____________________________________________________________________
243 const AliMUONGeometryTransformer*  AliMUON::GetGeometryTransformer() const
244 {
245 /// Return geometry parametrisation
246
247   const AliMUONGeometry* kGeometry = GetGeometry();
248   
249   if ( !kGeometry) return 0;
250
251   return kGeometry->GetTransformer();
252 }   
253
254 //__________________________________________________________________
255 void 
256 AliMUON::MakeBranch(Option_t* opt)
257 {
258   /// Create branche(s) to hold MUON hits
259   AliDebug(1,"");
260   
261   TString sopt(opt);
262   if ( sopt != "H" ) return;
263     
264   if (!fHitStore)
265   {
266     fHitStore = new AliMUONHitStoreV1;
267     if ( gAlice->GetMCApp() )
268     {
269       if ( gAlice->GetMCApp()->GetHitLists() ) 
270       {
271         // AliStack::PurifyKine needs to be able to loop on our hits
272         // to remap the track numbers.
273         gAlice->GetMCApp()->AddHitList(fHitStore->Collection()); 
274       }  
275     }
276   }
277
278   TTree* treeH = fLoader->TreeH();
279   
280   if (!treeH)
281   {
282     AliFatal("No TreeH");
283   }
284   
285   fHitStore->Connect(*treeH);
286 }
287
288 //__________________________________________________________________
289 void  
290 AliMUON::SetTreeAddress()
291 {
292   /// Set Hits tree address  
293  
294 //  if ( gAlice->GetMCApp() && fHitStore )
295 //  {
296 //    TList* l = gAlice->GetMCApp()->GetHitLists();
297 //    if ( l )
298 //    {
299 //      TObject* o = l->First();
300 //      if (o!=fHitStore->HitCollection())
301 //      {
302 //        AliError(Form("Something is strange hitcollection=%x",fHitStore->HitCollection()));
303 //        l->Print();        
304 //      }
305 //    }  
306 //  }  
307 }
308
309 //_________________________________________________________________
310 void
311 AliMUON::ResetHits()
312 {
313   /// Reset hits
314   
315   AliDebug(1,"");
316   if (fHitStore) fHitStore->Clear();
317 }
318
319 //_________________________________________________________________
320 void AliMUON::SetChargeSlope(Int_t id, Float_t p1)
321 {
322 /// Set the inverse charge slope for chamber id
323
324     Int_t i=2*(id-1);    //PH    ((AliMUONChamber*) (*fChambers)[i])->SetSigmaIntegration(p1);
325     //PH    ((AliMUONChamber*) (*fChambers)[i+1])->SetSigmaIntegration(p1);
326     ((AliMUONChamber*) fChambers->At(i))->SetChargeSlope(p1);
327     ((AliMUONChamber*) fChambers->At(i+1))->SetChargeSlope(p1);
328 }
329 //__________________________________________________________________
330 void AliMUON::SetChargeSpread(Int_t id, Float_t p1, Float_t p2)
331 {
332 /// Set sigma of charge spread for chamber id
333
334     Int_t i=2*(id-1);
335     ((AliMUONChamber*) fChambers->At(i))->SetChargeSpread(p1,p2);
336     ((AliMUONChamber*) fChambers->At(i+1))->SetChargeSpread(p1,p2);
337 }
338 //___________________________________________________________________
339 void AliMUON::SetSigmaIntegration(Int_t id, Float_t p1)
340 {
341 /// Set integration limits for charge spread
342     Int_t i=2*(id-1);
343     ((AliMUONChamber*) fChambers->At(i))->SetSigmaIntegration(p1);
344     ((AliMUONChamber*) fChambers->At(i+1))->SetSigmaIntegration(p1);
345 }
346
347 //__________________________________________________________________
348 void AliMUON::SetMaxAdc(Int_t id, Int_t p1)
349 {
350 /// Set maximum number for ADCcounts (saturation)
351
352     Int_t i=2*(id-1);
353     ((AliMUONChamber*) fChambers->At(i))->SetMaxAdc(p1);
354     ((AliMUONChamber*) fChambers->At(i+1))->SetMaxAdc(p1);
355 }
356
357 //__________________________________________________________________
358 void AliMUON::SetMaxStepGas(Float_t p1)
359 {
360 /// Set stepsize in gas
361
362   fMaxStepGas=p1;
363 }
364 //__________________________________________________________________
365 void AliMUON::SetMaxStepAlu(Float_t p1)
366 {
367 /// Set step size in Alu
368
369     fMaxStepAlu=p1;
370 }
371 //__________________________________________________________________
372 void AliMUON::SetMaxDestepGas(Float_t p1)
373 {
374 /// Set maximum step size in Gas
375
376     fMaxDestepGas=p1;
377 }
378 //__________________________________________________________________
379 void AliMUON::SetMaxDestepAlu(Float_t p1)
380 {
381 /// Set maximum step size in Alu
382
383   fMaxDestepAlu=p1;
384 }
385
386 //____________________________________________________________________
387 Float_t  AliMUON::GetMaxStepGas() const
388 {
389 /// Return stepsize in gas
390   
391   return fMaxStepGas;
392 }  
393
394 //____________________________________________________________________
395 Float_t  AliMUON::GetMaxStepAlu() const
396 {
397 /// Return step size in Alu
398   
399   return fMaxStepAlu;
400 }
401   
402 //____________________________________________________________________
403 Float_t  AliMUON::GetMaxDestepGas() const
404 {
405 /// Return maximum step size in Gas
406   
407   return fMaxDestepGas;
408 }
409   
410 //____________________________________________________________________
411 Float_t  AliMUON::GetMaxDestepAlu() const
412 {
413 /// Return maximum step size in Gas
414   
415   return fMaxDestepAlu;
416 }
417
418 //____________________________________________________________________
419  void  AliMUON::SetAlign(Bool_t align)
420 {
421 /// Set option for alignement to geometry builder
422  
423    fGeometryBuilder->SetAlign(align);
424 }   
425
426 //____________________________________________________________________
427  void  AliMUON::SetAlign(const TString& fileName, Bool_t align)
428 {
429 /// Set option for alignement to geometry builder
430  
431    fGeometryBuilder->SetAlign(fileName, align);
432 }   
433
434 //____________________________________________________________________
435 void   AliMUON::SetResponseModel(Int_t id, const AliMUONResponse& response)
436 {
437 /// Set the response for chamber id
438     ((AliMUONChamber*) fChambers->At(id))->SetResponseModel(response);
439 }
440
441 //____________________________________________________________________
442 AliDigitizer* AliMUON::CreateDigitizer(AliRunDigitizer* manager) const
443 {
444 /// Return digitizer
445   
446   AliMUONDigitizerV3* digitizer = new AliMUONDigitizerV3(manager, fDigitizerWithNoise);
447   AliMUONDigitizerV3::SetNSigmas(fDigitizerNSigmas);
448   digitizer->SetCalibrationData(fCalibrationData);
449   return digitizer;
450 }
451
452 //_____________________________________________________________________
453 void AliMUON::SDigits2Digits()
454 {
455 /// Write TreeD here only 
456
457     char hname[30];
458     //    sprintf(hname,"TreeD%d",fLoader->GetHeader()->GetEvent());
459     fLoader->TreeD()->Write(hname,TObject::kOverwrite);
460     fLoader->TreeD()->Reset();
461 }
462
463 //_____________________________________________________________________
464 void AliMUON::Hits2SDigits()
465 {
466 /// Perform Hits2Digits using SDigitizerV2
467   
468   AliMUONSDigitizerV2 sdigitizer;
469   sdigitizer.ExecuteTask();
470 }
471
472 //_____________________________________________________________________
473 void AliMUON::Digits2Raw()
474 {
475 /// Convert digits of the current event to raw data
476
477   AliRawDataHeaderSim header;
478
479   if (!fRawWriter)
480   {
481     fRawWriter = new AliMUONRawWriter;
482     AliDebug(1,Form("Creating %s",fRawWriter->ClassName()));
483     if (fTriggerScalerEvent == kTRUE) 
484     {
485       fRawWriter->SetScalersNumbers();
486     }
487   }
488   
489   fLoader->LoadDigits("READ");
490   
491   TTree* treeD = fLoader->TreeD();
492   
493   if (!treeD)
494   {
495     AliError("Could not get TreeD");
496     return;
497   }
498   
499   AliMUONVTriggerStore*  triggerStore = AliMUONVTriggerStore::Create(*treeD);
500   AliMUONVDigitStore* digitStore = AliMUONVDigitStore::Create(*treeD);
501
502   triggerStore->Connect(*treeD,kFALSE);
503   digitStore->Connect(*treeD,kFALSE);
504   
505   treeD->GetEvent(0);
506   
507   fRawWriter->SetHeader(header);
508   if (!fRawWriter->Digits2Raw(digitStore,triggerStore))
509   {
510     AliError("pb writting raw data");
511   }
512   
513   delete triggerStore;
514   delete digitStore;
515   
516   fLoader->UnloadDigits();
517 }
518
519 //_____________________________________________________________________
520 Bool_t AliMUON::Raw2SDigits(AliRawReader* rawReader)
521 {
522   /// Convert raw data to SDigit
523   
524   if (!fLoader->TreeS()) fLoader->MakeSDigitsContainer();
525   
526   TTree* treeS = fLoader->TreeS();
527   
528   AliMUONVDigitStore* sDigitStore = AliMUONVDigitStore::Create(DigitStoreClassName());
529         AliMUONVTriggerStore* triggerStore = 0x0;
530         
531   sDigitStore->Connect(*treeS);
532         
533   if (!fDigitMaker) fDigitMaker = new AliMUONDigitMaker;
534         
535         if (fConvertTrigger) {
536                 triggerStore = new AliMUONTriggerStoreV1;
537                 triggerStore->Connect(*treeS,true);
538                 fDigitMaker->SetMakeTriggerDigits(true);
539         }
540         
541   if (!fDigitCalibrator)
542   {
543     AliMUONRecoParam* recoParam = 0x0;
544     
545     AliCDBEntry* entry = AliCDBManager::Instance()->Get("MUON/Calib/RecoParam");
546     
547     if (entry) 
548     {      
549       // load recoParam according OCDB content (single or array)
550       if (!(recoParam = dynamic_cast<AliMUONRecoParam*>(entry->GetObject()))) 
551       {        
552         TObjArray* recoParamArray = static_cast<TObjArray*>(entry->GetObject());
553         
554         for(Int_t i = 0; i < recoParamArray->GetEntriesFast(); ++i)
555         {
556           recoParam = static_cast<AliMUONRecoParam*>(recoParamArray->UncheckedAt(i));
557           if (recoParam && recoParam->IsDefault()) break;
558           recoParam = 0x0;
559         }        
560       }      
561     }
562     
563     if (!recoParam)
564     {
565       AliFatal("Cannot work without recoparams !");
566     }
567     
568     TString calibMode = recoParam->GetCalibrationMode();
569   
570     fDigitCalibrator = new AliMUONDigitCalibrator(*fCalibrationData,recoParam,calibMode.Data());
571   }
572   
573         fDigitMaker->Raw2Digits(rawReader,sDigitStore,triggerStore);
574   
575   fDigitCalibrator->Calibrate(*sDigitStore);
576
577   TIter next(sDigitStore->CreateIterator());
578   AliMUONDigit* sdigit;
579   
580   // now tweak the digits to make them "as fresh as possible", i.e.
581   // reset their calibrated status, as they'll be calibrated again
582   // once embedded.
583   while ( ( sdigit = static_cast<AliMUONDigit*>(next()) ) )
584   {
585     sdigit->Calibrated(kFALSE);
586   }
587   
588   treeS->Fill();
589   
590   fLoader->WriteSDigits("OVERWRITE");
591   
592   fLoader->UnloadSDigits();
593   
594   delete sDigitStore;
595         
596         delete triggerStore;
597   
598   return kTRUE;
599 }
600
601 //_______________________________________________________________________
602 AliLoader* AliMUON::MakeLoader(const char* topfoldername)
603
604 /// Build standard getter (AliLoader type);
605 /// if detector wants to use castomized getter, it must overload this method
606  
607  AliDebug(1,Form("Creating standard getter for detector %s. Top folder is %s.",
608          GetName(),topfoldername));
609  fLoader   = new AliLoader(GetName(),topfoldername);
610
611  return fLoader;
612 }
613
614 //________________________________________________________________________
615 void
616 AliMUON::ResetGeometryBuilder()
617 {
618 /// Only to be used by "experts" wanting to change the geometry builders
619 /// to be used. 
620 /// As the ctor of AliMUON now defines a default geometrybuilder, this
621 /// ResetGeometryBuilder() must be called prior to call the 
622 /// AddGeometryBuilder()
623
624   delete fGeometryBuilder;
625   fGeometryBuilder = new AliMUONGeometryBuilder(this);
626   fGeometryBuilder
627     ->AddBuilder(new AliMUONCommonGeometryBuilder(this));
628 }
629
630 //____________________________________________________________________
631 Bool_t  AliMUON::GetTriggerResponseV1() const
632 {
633 ///
634 /// Returns fTriggerResponseV1
635 ///  
636     return fTriggerResponseV1;
637     
638 }  
639
640 //____________________________________________________________________
641 Int_t  AliMUON::GetTriggerCoinc44() const
642 {
643 ///
644 /// Returns fTriggerCoinc44
645 ///  
646     return fTriggerCoinc44;
647     
648 }
649
650 //____________________________________________________________________
651 Bool_t  AliMUON::GetTriggerEffCells() const
652 {
653 ///
654 /// Returns fTriggerEffCells
655 ///  
656     return fTriggerEffCells;
657     
658 }  
659
660 //____________________________________________________________________
661 Int_t  AliMUON::GetDigitizerWithNoise() const
662 {
663 ///
664 /// Returns fDigitizerWithNoise
665 ///  
666     return fDigitizerWithNoise;
667     
668 }  
669
670