]>
Commit | Line | Data |
---|---|---|
1 | void MakeTOFFullMisAlignment(){ | |
2 | // Create TClonesArray of full misalignment objects for TOF | |
3 | // Expects to read objects for FRAME | |
4 | // | |
5 | TClonesArray *array = new TClonesArray("AliAlignObjParams",2000); | |
6 | const char* macroname = "MakeTOFFullMisAlignment.C"; | |
7 | ||
8 | // Activate CDB storage and load geometry from CDB | |
9 | AliCDBManager* cdb = AliCDBManager::Instance(); | |
10 | if(!cdb->IsDefaultStorageSet()) cdb->SetDefaultStorage("local://$ALICE_ROOT/OCDB"); | |
11 | cdb->SetRun(0); | |
12 | ||
13 | AliCDBStorage* storage; | |
14 | TString Storage; | |
15 | ||
16 | if( TString(gSystem->Getenv("TOCDB")) == TString("kTRUE") ){ | |
17 | Storage = gSystem->Getenv("STORAGE"); | |
18 | if(!Storage.BeginsWith("local://") && !Storage.BeginsWith("alien://")) { | |
19 | Error(macroname,"STORAGE variable set to %s is not valid. Exiting\n",Storage.Data()); | |
20 | return; | |
21 | } | |
22 | storage = cdb->GetStorage(Storage.Data()); | |
23 | if(!storage){ | |
24 | Error(macroname,"Unable to open storage %s\n",Storage.Data()); | |
25 | return; | |
26 | } | |
27 | AliCDBPath path("GRP","Geometry","Data"); | |
28 | AliCDBEntry *entry = storage->Get(path.GetPath(),cdb->GetRun()); | |
29 | if(!entry) Fatal(macroname,"Could not get the specified CDB entry!"); | |
30 | entry->SetOwner(0); | |
31 | TGeoManager* geom = (TGeoManager*) entry->GetObject(); | |
32 | AliGeomManager::SetGeometry(geom); | |
33 | }else{ | |
34 | AliGeomManager::LoadGeometry(); //load geom from default CDB storage | |
35 | } | |
36 | ||
37 | // load FRAME full misalignment objects (if needed, the macro | |
38 | // for FRAME has to be run in advance) and apply them to geometry | |
39 | AliCDBPath fpath("GRP","Align","Data"); | |
40 | if( TString(gSystem->Getenv("TOCDB")) == TString("kTRUE") ){ | |
41 | Info(macroname,"Loading FRAME alignment objects from CDB storage %s", | |
42 | Storage.Data()); | |
43 | AliCDBEntry *eFrame = storage->Get(fpath.GetPath(),cdb->GetRun()); | |
44 | }else{ | |
45 | AliCDBEntry *eFrame = cdb->Get(fpath.GetPath()); | |
46 | } | |
47 | if(!eFrame) Fatal(macroname,"Could not get the specified CDB entry!"); | |
48 | TClonesArray* arFrame = (TClonesArray*) eFrame->GetObject(); | |
49 | arFrame->Sort(); | |
50 | Int_t nvols = arFrame->GetEntriesFast(); | |
51 | Bool_t flag = kTRUE; | |
52 | for(Int_t j=0; j<nvols; j++) | |
53 | { | |
54 | AliAlignObj* alobj = (AliAlignObj*) arFrame->UncheckedAt(j); | |
55 | if (alobj->ApplyToGeometry() == kFALSE) flag = kFALSE; | |
56 | } | |
57 | if(!flag) Fatal(macroname,"Error in the application of FRAME alignment objects"); | |
58 | ||
59 | //Produce objects for TOF supermodules | |
60 | Int_t iIndex=0; //let all modules have index=0 in a layer with no LUT | |
61 | AliGeomManager::ELayerID iLayer = AliGeomManager::kInvalidLayer; | |
62 | UShort_t dvoluid = AliGeomManager::LayerToVolUID(iLayer,iIndex); //dummy vol id | |
63 | ||
64 | Int_t nSMTOF = 18; | |
65 | Int_t j=0; | |
66 | Double_t smdx, smdy, smdz=0., dpsi=0., dtheta, dphi=0.; | |
67 | TRandom *rnd = new TRandom(2345); | |
68 | Double_t sigmatr = 0.4; // max shift in cm w.r.t. local ideal RS | |
69 | Double_t sigmarot = 0.06; // max rot in deg w.r.t. local ideal RS (~ 1 mrad) | |
70 | ||
71 | for(Int_t isect=0; isect<nSMTOF; isect++) { | |
72 | TString symname(Form("TOF/sm%02d",isect)); | |
73 | smdx = rnd->Gaus(0.,sigmatr); | |
74 | smdy = rnd->Gaus(0.,sigmatr); | |
75 | dtheta = rnd->Gaus(0.,sigmarot); | |
76 | new((*array)[j++]) AliAlignObjParams(symname.Data(), dvoluid, smdx, smdy, smdz, dpsi, dtheta, dphi, kFALSE); | |
77 | } | |
78 | // Apply objects for TOF supermodules | |
79 | Int_t smCounter=0; | |
80 | for(Int_t isect=0; isect<nSMTOF; isect++){ | |
81 | AliAlignObjParams* smobj = (AliAlignObjParams*)array->UncheckedAt(smCounter++); | |
82 | Info(macroname,Form("Applying object for sector %d ",isect)); | |
83 | if(!smobj->ApplyToGeometry()){ | |
84 | Fatal(macroname,Form("application of full misalignment object for sector %d failed!",isect)); | |
85 | return; | |
86 | } | |
87 | } | |
88 | ||
89 | //Produce objects for TOF strips (same sigmas as for residual misalignment) | |
90 | AliGeomManager::ELayerID idTOF = AliGeomManager::kTOF; | |
91 | Int_t strId=-1; | |
92 | ||
93 | Double_t sdx=0., sdy=0., sdz=0., sdpsi=0., sdtheta=0., sdphi=0.; | |
94 | //TRandom *rnds = new TRandom(4357); | |
95 | sigmatr = 0.1; // max shift in cm w.r.t. local ideal RS | |
96 | ||
97 | Int_t nstrA=15; | |
98 | Int_t nstrB=19; | |
99 | Int_t nstrC=19; | |
100 | Int_t nSectors=18; | |
101 | Int_t nStrips=nstrA+2*nstrB+2*nstrC; | |
102 | Double_t cuty=0., cutz=0., cut=3*sigmatr; | |
103 | ||
104 | for (Int_t isect = 0; isect < nSectors; isect++) { | |
105 | for (Int_t istr = 1; istr <= nStrips; istr++) { | |
106 | switch (istr) { | |
107 | case 25: | |
108 | case 29: | |
109 | case 63: | |
110 | case 67: | |
111 | cuty = sigmatr*0.6; | |
112 | sdy = AliMathBase::TruncatedGaus(0., sigmatr, cut, cuty); | |
113 | sdz = AliMathBase::TruncatedGaus(0., sigmatr, cut); | |
114 | strId++; | |
115 | break; | |
116 | /* | |
117 | case 38: | |
118 | cuty = sigmatr*2.5; | |
119 | cutz = sigmatr*2.5; | |
120 | sdy = AliMathBase::TruncatedGaus(0., sigmatr, cut, cuty); | |
121 | sdz = AliMathBase::TruncatedGaus(0., sigmatr, cut, cutz); | |
122 | strId++; | |
123 | break; | |
124 | case 54: | |
125 | cuty = sigmatr*2.5; | |
126 | cutz = sigmatr*2.5; | |
127 | sdy = AliMathBase::TruncatedGaus(0., sigmatr, cut, cuty); | |
128 | sdz = AliMathBase::TruncatedGaus(0., sigmatr, cutz, cut); | |
129 | strId++; | |
130 | break; | |
131 | */ | |
132 | default: | |
133 | sdy = AliMathBase::TruncatedGaus(0., sigmatr, cut); | |
134 | sdz = AliMathBase::TruncatedGaus(0., sigmatr, cut); | |
135 | strId++; | |
136 | break; | |
137 | } | |
138 | ||
139 | if ((isect==13 || isect==14 || isect==15) && (istr >= 39 && istr <= 53)) continue; | |
140 | new((*array)[j++]) AliAlignObjParams(AliGeomManager::SymName(idTOF,strId),AliGeomManager::LayerToVolUID(idTOF,strId), sdx, sdy, sdz, sdpsi, sdtheta, sdphi, kFALSE); | |
141 | } | |
142 | } | |
143 | ||
144 | if( TString(gSystem->Getenv("TOCDB")) != TString("kTRUE") ){ | |
145 | // save in file | |
146 | const char* filename = "TOFfullMisalignment.root"; | |
147 | TFile f(filename,"RECREATE"); | |
148 | if(!f){ | |
149 | Error(macroname,"cannot open file for output\n"); | |
150 | return; | |
151 | } | |
152 | Info(macroname,"Saving alignment objects in file %s", filename); | |
153 | f.cd(); | |
154 | f.WriteObject(array,"TOFAlignObjs","kSingleKey"); | |
155 | f.Close(); | |
156 | }else{ | |
157 | // save in CDB storage | |
158 | Info(macroname,"Saving alignment objects in CDB storage %s", | |
159 | Storage.Data()); | |
160 | AliCDBMetaData* md = new AliCDBMetaData(); | |
161 | md->SetResponsible("Silvia Arcelli"); | |
162 | md->SetComment("Full misalignment for TOF"); | |
163 | md->SetAliRootVersion(gSystem->Getenv("ARVERSION")); | |
164 | AliCDBId id("TOF/Align/Data",0,AliCDBRunRange::Infinity()); | |
165 | storage->Put(array,id,md); | |
166 | } | |
167 | ||
168 | array->Delete(); | |
169 | ||
170 | } | |
171 | ||
172 | /* | |
173 | Double_t LocalTruncatedGaus(Double_t mean, Double_t sigma, Double_t cutatL, Double_t cutatR) | |
174 | { | |
175 | // return number generated according to a gaussian distribution N(mean,sigma) truncated at cutat | |
176 | // | |
177 | Double_t value; | |
178 | do{ | |
179 | value=gRandom->Gaus(mean,sigma); | |
180 | }while(value-mean<-cutatL || value-mean>cutatR); | |
181 | return value; | |
182 | } | |
183 | */ |